diff --git a/include/aoclient.h b/include/aoclient.h index b912eee..0444abf 100644 --- a/include/aoclient.h +++ b/include/aoclient.h @@ -28,6 +28,7 @@ #include #include #include +#include #include #if QT_VERSION > QT_VERSION_CHECK(5, 10, 0) #include @@ -131,6 +132,7 @@ class AOClient : public QObject { // Packet helper functions void sendEvidenceList(AreaData* area); AOPacket validateIcPacket(AOPacket packet); + QString dezalgo(QString p_text); // Packet helper global variables int char_id = -1; diff --git a/include/config_manager.h b/include/config_manager.h index 9311fbb..7c5deb0 100644 --- a/include/config_manager.h +++ b/include/config_manager.h @@ -40,6 +40,7 @@ class ConfigManager { QString name; QString description; bool advertise_server; + int zalgo_tolerance; }; bool loadServerSettings(server_settings* settings); diff --git a/src/area_data.cpp b/src/area_data.cpp index a2d9373..0036af3 100644 --- a/src/area_data.cpp +++ b/src/area_data.cpp @@ -28,13 +28,13 @@ AreaData::AreaData(QStringList characters, QString p_name, int p_index) areas_ini.beginGroup(p_name); background = areas_ini.value("background", "gs4").toString(); is_protected = areas_ini.value("protected_area").toBool(); + bg_locked = areas_ini.value("bg_locked", "false").toBool(); areas_ini.endGroup(); player_count = 0; locked = FREE; status = "FREE"; def_hp = 10; pro_hp = 10; - bg_locked = false; document = "No document."; QSettings config_ini("config/config.ini", QSettings::IniFormat); config_ini.beginGroup("Options"); diff --git a/src/commands.cpp b/src/commands.cpp index 1d9727a..d7b8173 100644 --- a/src/commands.cpp +++ b/src/commands.cpp @@ -37,13 +37,16 @@ void AOClient::cmdLogin(int argc, QStringList argv) return; } - // TODO: tell the user if no modpass is set if (auth_type == "simple") { - if(argv[0] == modpass) { + if (modpass == "") { + sendServerMessage("No modpass is set! Please set a modpass before authenticating."); + } + else if(argv[0] == modpass) { sendPacket("AUTH", {"1"}); // Client: "You were granted the Disable Modcalls button." sendServerMessage("Logged in as a moderator."); // for old clients, this is hardcoded to display the mod UI authenticated = true; - } else { + } + else { sendPacket("AUTH", {"0"}); // Client: "Login unsuccessful." sendServerMessage("Incorrect password."); } @@ -185,8 +188,6 @@ void AOClient::cmdSetRootPass(int argc, QStringList argv) void AOClient::cmdSetBackground(int argc, QStringList argv) { - // TODO: area locks in areas.ini - // TODO: sendServerMessage but area broadcast AreaData* area = server->areas[current_area]; if (authenticated || !area->bg_locked) { if (server->backgrounds.contains(argv[0])) { diff --git a/src/config_manager.cpp b/src/config_manager.cpp index e6cc088..7f0f93a 100644 --- a/src/config_manager.cpp +++ b/src/config_manager.cpp @@ -131,6 +131,7 @@ bool ConfigManager::loadServerSettings(server_settings* settings) bool port_conversion_success; bool ws_port_conversion_success; bool local_port_conversion_success; + bool zalgo_tolerance_conversion_success; config.beginGroup("Options"); settings->ms_ip = config.value("ms_ip", "master.aceattorneyonline.com").toString(); @@ -144,6 +145,8 @@ bool ConfigManager::loadServerSettings(server_settings* settings) settings->description = config.value("server_description", "This is my flashy new server") .toString(); + settings->zalgo_tolerance = + config.value("zalgo_tolerance", "3").toInt(&zalgo_tolerance_conversion_success); config.endGroup(); if (!port_conversion_success || !ws_port_conversion_success || !local_port_conversion_success) { diff --git a/src/packets.cpp b/src/packets.cpp index 9766578..c20b79e 100644 --- a/src/packets.cpp +++ b/src/packets.cpp @@ -32,7 +32,7 @@ void AOClient::pktHardwareId(AreaData* area, int argc, QStringList argv, AOPacke socket->close(); return; } - sendPacket("ID", {"271828", "akashi", QCoreApplication::applicationVersion()}); + sendPacket("ID", {QString::number(id), "akashi", QCoreApplication::applicationVersion()}); } void AOClient::pktSoftwareId(AreaData* area, int argc, QStringList argv, AOPacket packet) @@ -177,20 +177,21 @@ void AOClient::pktIcChat(AreaData* area, int argc, QStringList argv, AOPacket pa void AOClient::pktOocChat(AreaData* area, int argc, QStringList argv, AOPacket packet) { - ooc_name = argv[0]; - if(argv[1].at(0) == '/') { - QStringList cmd_argv = argv[1].split(" ", QString::SplitBehavior::SkipEmptyParts); + ooc_name = dezalgo(argv[0]); + QString message = dezalgo(argv[1]); + AOPacket final_packet("CT", {ooc_name, message, "0"}); + if(message.at(0) == '/') { + QStringList cmd_argv = message.split(" ", QString::SplitBehavior::SkipEmptyParts); QString command = cmd_argv[0].trimmed().toLower(); command = command.right(command.length() - 1); cmd_argv.removeFirst(); int cmd_argc = cmd_argv.length(); - area->logger->logCmd(this, &packet, command, cmd_argv); + area->logger->logCmd(this, &final_packet, command, cmd_argv); handleCommand(command, cmd_argc, cmd_argv); } else { - // TODO: zalgo strip - server->broadcast(packet, current_area); - area->logger->logOOC(this, &packet); + server->broadcast(final_packet, current_area); + area->logger->logOOC(this, &final_packet); } } @@ -374,7 +375,7 @@ AOPacket AOClient::validateIcPacket(AOPacket packet) args.append(emote); // message text - QString incoming_msg = incoming_args[4].toString().trimmed(); + QString incoming_msg = dezalgo(incoming_args[4].toString().trimmed()); if (incoming_msg == last_message) return invalid; @@ -452,7 +453,8 @@ AOPacket AOClient::validateIcPacket(AOPacket packet) // 2.6 packet extensions if (incoming_args.length() > 15) { // showname - args.append(incoming_args[15].toString()); + QString showname = dezalgo(incoming_args[15].toString().trimmed()); + args.append(showname); // other char id // things get a bit hairy here @@ -533,3 +535,17 @@ AOPacket AOClient::validateIcPacket(AOPacket packet) return AOPacket("MS", args); } + +QString AOClient::dezalgo(QString p_text) +{ + QSettings config("config/config.ini", QSettings::IniFormat); + config.beginGroup("Options"); + bool zalgo_tolerance_conversion_success; + int zalgo_tolerance = config.value("zalgo_tolerance", "3").toInt(&zalgo_tolerance_conversion_success); + if (!zalgo_tolerance_conversion_success) + zalgo_tolerance = 3; + + QRegExp rxp("([\u0300-\u036f\u1ab0-\u1aff\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f\u115f\u1160\u3164]{" + QRegExp::escape(QString::number(zalgo_tolerance)) + ",})"); + QString filtered = p_text.replace(rxp, ""); + return filtered; +}