From 953426fea18d916be3fb4ac2fbbea975c713243f Mon Sep 17 00:00:00 2001 From: in1tiate Date: Thu, 11 Mar 2021 02:00:33 -0600 Subject: [PATCH 1/5] fix status in area list, replace number() with str literal --- src/aoclient.cpp | 12 ++++++------ src/commands.cpp | 14 +++++++------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/aoclient.cpp b/src/aoclient.cpp index 49553b9..984999a 100644 --- a/src/aoclient.cpp +++ b/src/aoclient.cpp @@ -175,20 +175,20 @@ void AOClient::changeCharacter(int char_id) sendPacket("PV", {QString::number(id), "CID", QString::number(char_id)}); fullArup(); if (server->timer->isActive()) { - sendPacket("TI", {QString::number(0), QString::number(2)}); - sendPacket("TI", {QString::number(0), QString::number(0), QString::number(QTime(0,0).msecsTo(QTime(0,0).addMSecs(server->timer->remainingTime())))}); + sendPacket("TI", {"0", "2"}); + sendPacket("TI", {"0", "0", QString::number(QTime(0,0).msecsTo(QTime(0,0).addMSecs(server->timer->remainingTime())))}); } else { - sendPacket("TI", {QString::number(0), QString::number(3)}); + sendPacket("TI", {"0", "3"}); } for (QTimer* timer : area->timers) { int timer_id = area->timers.indexOf(timer) + 1; if (timer->isActive()) { - sendPacket("TI", {QString::number(timer_id), QString::number(2)}); - sendPacket("TI", {QString::number(timer_id), QString::number(0), QString::number(QTime(0,0).msecsTo(QTime(0,0).addMSecs(timer->remainingTime())))}); + sendPacket("TI", {QString::number(timer_id), "2"}); + sendPacket("TI", {QString::number(timer_id), "0", QString::number(QTime(0,0).msecsTo(QTime(0,0).addMSecs(timer->remainingTime())))}); } else { - sendPacket("TI", {QString::number(timer_id), QString::number(3)}); + sendPacket("TI", {QString::number(timer_id), "3"}); } } } diff --git a/src/commands.cpp b/src/commands.cpp index d568471..f29f88b 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -656,28 +656,28 @@ void AOClient::cmdTimer(int argc, QStringList argv) requested_timer->setInterval(QTime(0,0).msecsTo(requested_time)); requested_timer->start(); sendServerMessage("Set timer " + QString::number(timer_id) + " to " + argv[1] + "."); - sendPacket("TI", {QString::number(timer_id), QString::number(2)}); - sendPacket("TI", {QString::number(timer_id), QString::number(0), QString::number(QTime(0,0).msecsTo(requested_time))}); + sendPacket("TI", {QString::number(timer_id), "2"}); // Show the timer + sendPacket("TI", {QString::number(timer_id), "0", QString::number(QTime(0,0).msecsTo(requested_time))}); return; } else { if (argv[1] == "start") { requested_timer->start(); sendServerMessage("Started timer " + QString::number(timer_id) + "."); - sendPacket("TI", {QString::number(timer_id), QString::number(2)}); - sendPacket("TI", {QString::number(timer_id), QString::number(0), QString::number(QTime(0,0).msecsTo(QTime(0,0).addMSecs(requested_timer->remainingTime())))}); + sendPacket("TI", {QString::number(timer_id), "2"}); // Show the timer + sendPacket("TI", {QString::number(timer_id), "0", QString::number(QTime(0,0).msecsTo(QTime(0,0).addMSecs(requested_timer->remainingTime())))}); } else if (argv[1] == "pause" || argv[1] == "stop") { requested_timer->setInterval(requested_timer->remainingTime()); requested_timer->stop(); sendServerMessage("Stopped timer " + QString::number(timer_id) + "."); - sendPacket("TI", {QString::number(timer_id), QString::number(1), QString::number(QTime(0,0).msecsTo(QTime(0,0).addMSecs(requested_timer->interval())))}); + sendPacket("TI", {QString::number(timer_id), "1", QString::number(QTime(0,0).msecsTo(QTime(0,0).addMSecs(requested_timer->interval())))}); } else if (argv[1] == "hide" || argv[1] == "unset") { requested_timer->setInterval(0); requested_timer->stop(); sendServerMessage("Hid timer " + QString::number(timer_id) + "."); - sendPacket("TI", {QString::number(timer_id), QString::number(3)}); + sendPacket("TI", {QString::number(timer_id), "3"}); // Hide the timer } } } @@ -846,7 +846,7 @@ QStringList AOClient::buildAreaList(int area_idx) default: break; } - entries.append("[" + QString::number(area->player_count) + " users][" + area->status + "]"); + entries.append("[" + QString::number(area->player_count) + " users][" + QVariant::fromValue(area->status).toString().replace("_", "-") + "]"); for (AOClient* client : server->clients) { if (client->current_area == area_idx && client->joined) { QString char_entry = "[" + QString::number(client->id) + "] " + client->current_char; From 7157d5410ea91b4a619976b9257724e84fd94d11 Mon Sep 17 00:00:00 2001 From: in1tiate Date: Thu, 11 Mar 2021 02:22:03 -0600 Subject: [PATCH 2/5] vastly improve client version string validation --- src/packets.cpp | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/src/packets.cpp b/src/packets.cpp index 337286f..53a7962 100644 --- a/src/packets.cpp +++ b/src/packets.cpp @@ -55,28 +55,14 @@ void AOClient::pktSoftwareId(AreaData* area, int argc, QStringList argv, AOPacke }; - // Extremely cursed client version string validation - // Ideally version strings should be X.X.X but it can be literally anything - // so we have to be super careful version.string = argv[1]; - QStringList version_raw = version.string.split("."); - bool ok; - int release_version = version_raw[0].toInt(&ok); - if (ok && version_raw.size() >= 1) - version.release = release_version; - if (ok && version_raw.size() >= 2) { - int major_version = version_raw[1].toInt(&ok); - if (ok) - version.major = major_version; + QRegExp rx("\\b(\\d+)\\.(\\d+)\\.(\\d+)\\b"); // matches X.X.X (e.g. 2.9.0, 2.4.10, etc.) + if (rx.indexIn(version.string) != -1) { + QStringList version_raw = rx.capturedTexts(); + version.release = version_raw[0].toInt(); + version.major = version_raw[1].toInt(); + version.minor = version_raw[2].toInt(); } - if (ok && version_raw.size() >= 3) { - int minor_version = version_raw[2].toInt(&ok); - if (ok) - version.minor = minor_version; - } - - - sendPacket("PN", {QString::number(server->player_count), max_players}); sendPacket("FL", feature_list); From bd471eda00e7b51da92de341da910c55f4fb9e69 Mon Sep 17 00:00:00 2001 From: in1tiate Date: Thu, 11 Mar 2021 04:32:41 -0600 Subject: [PATCH 3/5] switch to QRegularExpression for client version validation --- include/aoclient.h | 2 +- src/packets.cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/aoclient.h b/include/aoclient.h index 4b33f53..7b97907 100644 --- a/include/aoclient.h +++ b/include/aoclient.h @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #if QT_VERSION > QT_VERSION_CHECK(5, 10, 0) #include diff --git a/src/packets.cpp b/src/packets.cpp index 53a7962..66f32ac 100644 --- a/src/packets.cpp +++ b/src/packets.cpp @@ -56,12 +56,12 @@ void AOClient::pktSoftwareId(AreaData* area, int argc, QStringList argv, AOPacke version.string = argv[1]; - QRegExp rx("\\b(\\d+)\\.(\\d+)\\.(\\d+)\\b"); // matches X.X.X (e.g. 2.9.0, 2.4.10, etc.) - if (rx.indexIn(version.string) != -1) { - QStringList version_raw = rx.capturedTexts(); - version.release = version_raw[0].toInt(); - version.major = version_raw[1].toInt(); - version.minor = version_raw[2].toInt(); + QRegularExpression rx("\\b(\\d+)\\.(\\d+)\\.(\\d+)\\b"); // matches X.X.X (e.g. 2.9.0, 2.4.10, etc.) + QRegularExpressionMatch match = rx.match(version.string); + if (match.hasMatch()) { + version.release = match.captured(1).toInt(); + version.major = match.captured(2).toInt(); + version.minor = match.captured(3).toInt(); } sendPacket("PN", {QString::number(server->player_count), max_players}); From 07a19fe8cd145feec360d1caf7edf0c0291f4411 Mon Sep 17 00:00:00 2001 From: in1tiate Date: Thu, 11 Mar 2021 04:52:54 -0600 Subject: [PATCH 4/5] don't allow for locked areas with no cm --- src/aoclient.cpp | 7 +++++++ src/commands.cpp | 7 ++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/aoclient.cpp b/src/aoclient.cpp index 984999a..71ffe0a 100644 --- a/src/aoclient.cpp +++ b/src/aoclient.cpp @@ -68,10 +68,17 @@ void AOClient::clientDisconnected() false; server->updateCharsTaken(server->areas[current_area]); } + bool update_locks; for (AreaData* area : server->areas) { area->owners.removeAll(id); area->invited.removeAll(id); + if (area->owners.isEmpty() && area->locked != AreaData::FREE) { + area->locked = AreaData::FREE; + update_locks = true; + } } + if (update_locks) + arup(ARUPType::LOCKED, true); arup(ARUPType::CM, true); } diff --git a/src/commands.cpp b/src/commands.cpp index f29f88b..f347a85 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -504,8 +504,13 @@ void AOClient::cmdUnCM(int argc, QStringList argv) area->invited.removeAll(id); sendServerMessage("You are no longer CM in this area."); arup(ARUPType::CM, true); - if (area->owners.isEmpty()) + if (area->owners.isEmpty()) { area->invited.clear(); + if (area->locked != AreaData::FREE) { + area->locked = AreaData::FREE; + arup(ARUPType::LOCKED, true); + } + } } void AOClient::cmdInvite(int argc, QStringList argv) From e60f7e6796c8f626efea59ca4179a86ab6792aab Mon Sep 17 00:00:00 2001 From: in1tiate Date: Thu, 11 Mar 2021 05:29:46 -0600 Subject: [PATCH 5/5] update version string --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 630965b..de6ff3e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -36,7 +36,7 @@ int main(int argc, char* argv[]) { QCoreApplication app(argc, argv); QCoreApplication::setApplicationName("akashi"); - QCoreApplication::setApplicationVersion("0.0.1"); + QCoreApplication::setApplicationVersion("1.0.0-alpha"); std::atexit(cleanup); ConfigManager config_manager;