From 0d709d6a7316007d26bcc319e9f5ac59504c9f4e Mon Sep 17 00:00:00 2001 From: notify Date: Fri, 19 May 2023 07:45:36 +0800 Subject: [PATCH] Cppfix (#153) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新拓展包时增加更多的提示信息 - 增加版本检测系统,同时修改了安装AES密钥的时机 - 修复了偶发性的因进房导致的闪退(或许吧) --- lang/zh_CN.ts | 24 ++++++++++++++++++++++++ qml/Logic.js | 16 +++++++++++++--- src/core/packman.cpp | 13 +++++++++++-- src/network/router.cpp | 14 ++++++++++++-- src/server/server.cpp | 37 ++++++++++++++++++++++++++++++++++++- src/ui/qmlbackend.cpp | 2 +- src/ui/qmlbackend.h | 2 ++ 7 files changed, 99 insertions(+), 9 deletions(-) diff --git a/lang/zh_CN.ts b/lang/zh_CN.ts index 30e661b5..86dfabb7 100644 --- a/lang/zh_CN.ts +++ b/lang/zh_CN.ts @@ -45,6 +45,18 @@ + + PackMan + + Syncing packages, please do not close the application. + 正在自动同步拓展包,请千万不要中途关闭程序。 + + + [%1/%2] upgrading package '%3' + [%1/%2] 更新拓展包 '%3' + + + Init @@ -135,6 +147,18 @@ username or password error 用户名或密码错误 + + INVALID SETUP STRING + 登录字符串不同,可能由于服务端版本太旧或者太新导致,建议联系服主解决 + + + server is still on version %1 + 服务端使用的是旧版(%1),请使用该版本进行联机或者通知服主更新版本 + + + server is using version %1, please update + 服务端使用的是版本%1,该更新你的客户端了 + diff --git a/qml/Logic.js b/qml/Logic.js index aba5fff0..4c469499 100644 --- a/qml/Logic.js +++ b/qml/Logic.js @@ -35,12 +35,19 @@ callbacks["NetworkDelayTest"] = function(jsonData) { } config.cipherText = cipherText; Backend.replyDelayTest(config.screenName, cipherText); - Backend.installAESKey(); } callbacks["ErrorMsg"] = function(jsonData) { - console.log("ERROR: " + jsonData); - toast.show(qsTr(jsonData), 5000); + let log; + try { + let a = JSON.parse(jsonData); + log = qsTr(a[0]).arg(a[1]); + } catch (e) { + log = qsTr(jsonData); + } + + console.log("ERROR: " + log); + toast.show(log, 5000); mainWindow.busy = false; if (sheduled_download !== "") { mainWindow.busy = true; @@ -139,3 +146,6 @@ callbacks["ServerMessage"] = function(jsonData) { let current = mainStack.currentItem; // lobby or room current.sendDanmaku('[Server] ' + jsonData); } + +callbacks["ShowToast"] = (j) => toast.show(j); +callbacks["InstallKey"] = (j) => Backend.installAESKey(); diff --git a/src/core/packman.cpp b/src/core/packman.cpp index 3c9f0f9d..27276716 100644 --- a/src/core/packman.cpp +++ b/src/core/packman.cpp @@ -32,18 +32,27 @@ QString PackMan::getPackSummary() { } void PackMan::loadSummary(const QString &jsonData, bool useThread) { - auto f = [=]() { + static const auto f = [=]() { // First, disable all packages foreach (auto e, SelectFromDatabase(db, "SELECT name FROM packages;")) { disablePack(e.toObject()["name"].toString()); } +#ifndef FK_SERVER_ONLY + Backend->showToast(tr("Syncing packages, please do not close the application.")); +#endif + // Then read conf from string auto doc = QJsonDocument::fromJson(jsonData.toUtf8()); auto arr = doc.array(); + int i = 0; foreach (auto e, arr) { + i++; auto obj = e.toObject(); auto name = obj["name"].toString(); +#ifndef FK_SERVER_ONLY + Backend->showToast(tr("[%1/%2] upgrading package '%3'").arg(i).arg(arr.count()).arg(name)); +#endif if (SelectFromDatabase( db, QString("SELECT name FROM packages WHERE name='%1';").arg(name)) @@ -72,7 +81,7 @@ void PackMan::loadSummary(const QString &jsonData, bool useThread) { } void PackMan::downloadNewPack(const QString &url, bool useThread) { - auto threadFunc = [=]() { + static const auto threadFunc = [=]() { int error = clone(url); if (error < 0) return; diff --git a/src/network/router.cpp b/src/network/router.cpp index df19720c..a5e2fdc8 100644 --- a/src/network/router.cpp +++ b/src/network/router.cpp @@ -209,13 +209,23 @@ void Router::handlePacket(const QByteArray &rawPacket) { const QString &jsonData) { auto arr = String2Json(jsonData).array(); auto roomId = arr[0].toInt(); - ServerInstance->findRoom(roomId)->addPlayer(sender); + auto room = ServerInstance->findRoom(roomId); + if (room) { + room->addPlayer(sender); + } else { + sender->doNotify("ErrorMsg", "no such room"); + } }; lobby_actions["ObserveRoom"] = [](ServerPlayer *sender, const QString &jsonData) { auto arr = String2Json(jsonData).array(); auto roomId = arr[0].toInt(); - ServerInstance->findRoom(roomId)->addObserver(sender); + auto room = ServerInstance->findRoom(roomId); + if (room) { + room->addObserver(sender); + } else { + sender->doNotify("ErrorMsg", "no such room"); + } }; lobby_actions["Chat"] = [](ServerPlayer *sender, const QString &jsonData) { sender->getRoom()->chat(sender, jsonData); diff --git a/src/server/server.cpp b/src/server/server.cpp index 15edabf9..3ac18bf8 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include "client_socket.h" #include "packman.h" @@ -193,7 +194,7 @@ void Server::processRequest(const QByteArray &msg) { doc[2] != "Setup") valid = false; else - valid = (String2Json(doc[3].toString()).array().size() == 3); + valid = (String2Json(doc[3].toString()).array().size() == 4); } if (!valid) { @@ -211,6 +212,30 @@ void Server::processRequest(const QByteArray &msg) { QJsonArray arr = String2Json(doc[3].toString()).array(); + auto client_ver = QVersionNumber::fromString(arr[3].toString()); + auto ver = QVersionNumber::fromString(FK_VERSION); + int cmp = QVersionNumber::compare(ver, client_ver); + if (cmp != 0) { + QJsonArray body; + body << -2; + body << (Router::TYPE_NOTIFICATION | Router::SRC_SERVER | + Router::DEST_CLIENT); + body << "ErrorMsg"; + body + << (cmp < 0 + ? QString("[\"server is still on version %%2\",\"%1\"]") + .arg(FK_VERSION) + .arg("1") + : QString( + "[\"server is using version %%2, please update\",\"%1\"]") + .arg(FK_VERSION) + .arg("1")); + + client->send(JsonArray2Bytes(body)); + client->disconnectFromHost(); + return; + } + handleNameAndPassword(client, arr[0].toString(), arr[1].toString(), arr[2].toString()); } @@ -227,6 +252,16 @@ void Server::handleNameAndPassword(ClientSocket *client, const QString &name, if (decrypted_pw.length() > 32) { auto aes_bytes = decrypted_pw.first(32); + + // tell client to install aes key + QJsonArray body; + body << -2; + body << (Router::TYPE_NOTIFICATION | Router::SRC_SERVER | + Router::DEST_CLIENT); + body << "InstallKey"; + body << ""; + client->send(JsonArray2Bytes(body)); + client->installAESKey(aes_bytes); decrypted_pw.remove(0, 32); } else { diff --git a/src/ui/qmlbackend.cpp b/src/ui/qmlbackend.cpp index 147d88df..894510ad 100644 --- a/src/ui/qmlbackend.cpp +++ b/src/ui/qmlbackend.cpp @@ -254,7 +254,7 @@ void QmlBackend::replyDelayTest(const QString &screenName, auto md5 = calcFileMD5(); QJsonArray arr; - arr << screenName << cipher << md5; + arr << screenName << cipher << md5 << FK_VERSION; ClientInstance->notifyServer("Setup", JsonArray2Bytes(arr)); } diff --git a/src/ui/qmlbackend.h b/src/ui/qmlbackend.h index 26801838..ac9574e2 100644 --- a/src/ui/qmlbackend.h +++ b/src/ui/qmlbackend.h @@ -53,6 +53,8 @@ public: qreal volume() const { return m_volume; } void setVolume(qreal v) { m_volume = v; } + void showToast(const QString &s) { emit notifyUI("ShowToast", s); } + signals: void notifyUI(const QString &command, const QString &jsonData); void volumeChanged(qreal);