diff --git a/core/include/config_manager.h b/core/include/config_manager.h index edbf931..64e0993 100644 --- a/core/include/config_manager.h +++ b/core/include/config_manager.h @@ -44,6 +44,53 @@ class ConfigManager { */ static bool verifyServerConfig(); + /** + * @brief Returns the IP the TCP Server binds to. + * + * @return See short description + */ + static QString bindIP(); + + /** + * @brief Returns the character list of the server. + * + * @return See short description. + */ + static QStringList charlist(); + + /** + * @brief Returns the a QStringList of the available backgrounds. + * + * @return See short description. + */ + static QStringList backgrounds(); + + /** + * @brief Returns a QStringlist of the available songs. + * + * @return See short description. + */ + static QStringList musiclist(); + + /** + * @brief Returns the content of + * @return + */ + static QSettings *areaData(); + + /** + * @brief Returns a sanitized QStringList of the areas. + * + * @return See short description. + */ + static QStringList sanitizedAreaNames(); + + /** + * @brief Returns the raw arealist + * + * @return See short description. + */ + static QStringList rawAreaNames(); /** * @brief Returns true if the server should advertise to the master server. * @@ -424,6 +471,11 @@ private: */ static QSettings* m_discord; + /** + * @brief Stores all of the area valus. + */ + static QSettings* m_areas; + /** * @brief Pointer to QElapsedTimer to track the uptime of the server. */ diff --git a/core/include/server.h b/core/include/server.h index 6b2b621..d6c86f8 100644 --- a/core/include/server.h +++ b/core/include/server.h @@ -157,22 +157,22 @@ class Server : public QObject { /** * @brief The collection of all currently connected clients. */ - QVector clients; + QVector m_clients; /** * @brief The overall player count in the server. */ - int player_count; + int m_player_count; /** * @brief The characters available on the server to use. */ - QStringList characters; + QStringList m_characters; /** * @brief The areas on the server. */ - QVector areas; + QVector m_areas; /** * @brief The names of the areas on the server. @@ -180,7 +180,7 @@ class Server : public QObject { * @details Equivalent to iterating over #areas and getting the area names individually, but grouped together * here for faster access. */ - QStringList area_names; + QStringList m_area_names; /** * @brief The available songs on the server. @@ -188,12 +188,12 @@ class Server : public QObject { * @details Does **not** include the area names, the actual music list packet should be constructed from * #area_names and this combined. */ - QStringList music_list; + QStringList m_music_list; /** * @brief The backgrounds on the server that may be used in areas. */ - QStringList backgrounds; + QStringList m_backgrounds; /** * @brief The database manager on the server, used to store users' bans and authorisation details. diff --git a/core/src/aoclient.cpp b/core/src/aoclient.cpp index 3cab625..61d6186 100644 --- a/core/src/aoclient.cpp +++ b/core/src/aoclient.cpp @@ -53,18 +53,18 @@ void AOClient::clientDisconnected() qDebug() << remote_ip.toString() << "disconnected"; #endif if (joined) { - server->player_count--; - server->areas[current_area]->clientLeftArea(server->getCharID(current_char)); + server->m_player_count--; + server->m_areas[current_area]->clientLeftArea(server->getCharID(current_char)); arup(ARUPType::PLAYER_COUNT, true); } if (current_char != "") { - server->updateCharsTaken(server->areas[current_area]); + server->updateCharsTaken(server->m_areas[current_area]); } bool l_updateLocks = false; - for (AreaData* area : qAsConst(server->areas)) { + for (AreaData* area : qAsConst(server->m_areas)) { l_updateLocks = l_updateLocks || area->removeOwner(id); } @@ -78,7 +78,7 @@ void AOClient::handlePacket(AOPacket packet) #ifdef NET_DEBUG qDebug() << "Received packet:" << packet.header << ":" << packet.contents << "args length:" << packet.contents.length(); #endif - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; PacketInfo info = packets.value(packet.header, {false, 0, &AOClient::pktDefault}); if (packet.contents.join("").size() > 16384) { @@ -109,38 +109,38 @@ void AOClient::handlePacket(AOPacket packet) void AOClient::changeArea(int new_area) { if (current_area == new_area) { - sendServerMessage("You are already in area " + server->area_names[current_area]); + sendServerMessage("You are already in area " + server->m_area_names[current_area]); return; } - if (server->areas[new_area]->lockStatus() == AreaData::LockStatus::LOCKED && !server->areas[new_area]->invited().contains(id) && !checkAuth(ACLFlags.value("BYPASS_LOCKS"))) { - sendServerMessage("Area " + server->area_names[new_area] + " is locked."); + if (server->m_areas[new_area]->lockStatus() == AreaData::LockStatus::LOCKED && !server->m_areas[new_area]->invited().contains(id) && !checkAuth(ACLFlags.value("BYPASS_LOCKS"))) { + sendServerMessage("Area " + server->m_area_names[new_area] + " is locked."); return; } if (current_char != "") { - server->areas[current_area]->changeCharacter(server->getCharID(current_char), -1); - server->updateCharsTaken(server->areas[current_area]); + server->m_areas[current_area]->changeCharacter(server->getCharID(current_char), -1); + server->updateCharsTaken(server->m_areas[current_area]); } - server->areas[current_area]->clientLeftArea(char_id); + server->m_areas[current_area]->clientLeftArea(char_id); bool character_taken = false; - if (server->areas[new_area]->charactersTaken().contains(server->getCharID(current_char))) { + if (server->m_areas[new_area]->charactersTaken().contains(server->getCharID(current_char))) { current_char = ""; char_id = -1; character_taken = true; } - server->areas[new_area]->clientJoinedArea(char_id); + server->m_areas[new_area]->clientJoinedArea(char_id); current_area = new_area; arup(ARUPType::PLAYER_COUNT, true); - sendEvidenceList(server->areas[new_area]); - sendPacket("HP", {"1", QString::number(server->areas[new_area]->defHP())}); - sendPacket("HP", {"2", QString::number(server->areas[new_area]->proHP())}); - sendPacket("BN", {server->areas[new_area]->background()}); + sendEvidenceList(server->m_areas[new_area]); + sendPacket("HP", {"1", QString::number(server->m_areas[new_area]->defHP())}); + sendPacket("HP", {"2", QString::number(server->m_areas[new_area]->proHP())}); + sendPacket("BN", {server->m_areas[new_area]->background()}); if (character_taken) { sendPacket("DONE"); } - const QList timers = server->areas[current_area]->timers(); + const QList timers = server->m_areas[current_area]->timers(); for (QTimer* timer : timers) { - int timer_id = server->areas[current_area]->timers().indexOf(timer) + 1; + int timer_id = server->m_areas[current_area]->timers().indexOf(timer) + 1; if (timer->isActive()) { 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())))}); @@ -149,16 +149,16 @@ void AOClient::changeArea(int new_area) sendPacket("TI", {QString::number(timer_id), "3"}); } } - sendServerMessage("You moved to area " + server->area_names[current_area]); - if (server->areas[current_area]->lockStatus() == AreaData::LockStatus::SPECTATABLE) - sendServerMessage("Area " + server->area_names[current_area] + " is spectate-only; to chat IC you will need to be invited by the CM."); + sendServerMessage("You moved to area " + server->m_area_names[current_area]); + if (server->m_areas[current_area]->lockStatus() == AreaData::LockStatus::SPECTATABLE) + sendServerMessage("Area " + server->m_area_names[current_area] + " is spectate-only; to chat IC you will need to be invited by the CM."); } bool AOClient::changeCharacter(int char_id) { - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; - if(char_id >= server->characters.length()) + if(char_id >= server->m_characters.length()) return false; if (is_charcursed && !charcurse_list.contains(char_id)) { @@ -172,7 +172,7 @@ bool AOClient::changeCharacter(int char_id) } if (l_successfulChange == true) { - QString char_selected = server->characters[char_id]; + QString char_selected = server->m_characters[char_id]; current_char = char_selected; pos = ""; server->updateCharsTaken(area); @@ -210,7 +210,7 @@ void AOClient::arup(ARUPType type, bool broadcast) { QStringList arup_data; arup_data.append(QString::number(type)); - for (AreaData* area : qAsConst(server->areas)) { + for (AreaData* area : qAsConst(server->m_areas)) { switch(type) { case ARUPType::PLAYER_COUNT: { arup_data.append(QString::number(area->playerCount())); @@ -319,7 +319,7 @@ bool AOClient::checkAuth(unsigned long long acl_mask) #endif if (acl_mask != ACLFlags.value("NONE")) { if (acl_mask == ACLFlags.value("CM")) { - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; if (area->owners().contains(id)) return true; } diff --git a/core/src/area_data.cpp b/core/src/area_data.cpp index 2a1af57..7f5eddc 100644 --- a/core/src/area_data.cpp +++ b/core/src/area_data.cpp @@ -35,23 +35,20 @@ AreaData::AreaData(QString p_name, int p_index) : QStringList name_split = p_name.split(":"); name_split.removeFirst(); m_name = name_split.join(":"); - QSettings areas_ini("config/areas.ini", QSettings::IniFormat); - areas_ini.setIniCodec("UTF-8"); - areas_ini.beginGroup(p_name); - m_background = areas_ini.value("background", "gs4").toString(); - m_isProtected = areas_ini.value("protected_area", "false").toBool(); - m_iniswapAllowed = areas_ini.value("iniswap_allowed", "true").toBool(); - m_bgLocked = areas_ini.value("bg_locked", "false").toBool(); - m_eviMod = QVariant(areas_ini.value("evidence_mod", "FFA").toString().toUpper()).value(); - m_blankpostingAllowed = areas_ini.value("blankposting_allowed","true").toBool(); - m_forceImmediate = areas_ini.value("force_immediate", "false").toBool(); - m_toggleMusic = areas_ini.value("toggle_music", "true").toBool(); - m_shownameAllowed = areas_ini.value("shownames_allowed", "true").toBool(); - m_ignoreBgList = areas_ini.value("ignore_bglist", "false").toBool(); - areas_ini.endGroup(); - int log_size = ConfigManager::logBuffer(); - if (log_size == 0) - log_size = 500; + QSettings* areas_ini = ConfigManager::areaData(); + areas_ini->setIniCodec("UTF-8"); + areas_ini->beginGroup(p_name); + m_background = areas_ini->value("background", "gs4").toString(); + m_isProtected = areas_ini->value("protected_area", "false").toBool(); + m_iniswapAllowed = areas_ini->value("iniswap_allowed", "true").toBool(); + m_bgLocked = areas_ini->value("bg_locked", "false").toBool(); + m_eviMod = QVariant(areas_ini->value("evidence_mod", "FFA").toString().toUpper()).value(); + m_blankpostingAllowed = areas_ini->value("blankposting_allowed","true").toBool(); + m_forceImmediate = areas_ini->value("force_immediate", "false").toBool(); + m_toggleMusic = areas_ini->value("toggle_music", "true").toBool(); + m_shownameAllowed = areas_ini->value("shownames_allowed", "true").toBool(); + m_ignoreBgList = areas_ini->value("ignore_bglist", "false").toBool(); + areas_ini->endGroup(); QTimer* timer1 = new QTimer(); m_timers.append(timer1); QTimer* timer2 = new QTimer(); diff --git a/core/src/commands/area.cpp b/core/src/commands/area.cpp index 2049844..e5dd920 100644 --- a/core/src/commands/area.cpp +++ b/core/src/commands/area.cpp @@ -24,7 +24,7 @@ void AOClient::cmdCM(int argc, QStringList argv) { QString sender_name = ooc_name; - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; if (area->isProtected()) { sendServerMessage("This area is protected, you may not become CM."); return; @@ -59,7 +59,7 @@ void AOClient::cmdCM(int argc, QStringList argv) void AOClient::cmdUnCM(int argc, QStringList argv) { - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; int uid; if (area->owners().isEmpty()) { @@ -104,7 +104,7 @@ void AOClient::cmdInvite(int argc, QStringList argv) { Q_UNUSED(argc); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; bool ok; int invited_id = argv[0].toInt(&ok); if (!ok) { @@ -129,7 +129,7 @@ void AOClient::cmdUnInvite(int argc, QStringList argv) { Q_UNUSED(argc); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; bool ok; int uninvited_id = argv[0].toInt(&ok); if (!ok) { @@ -159,14 +159,14 @@ void AOClient::cmdLock(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; if (area->lockStatus() == AreaData::LockStatus::LOCKED) { sendServerMessage("This area is already locked."); return; } sendServerMessageArea("This area is now locked."); area->lock(); - for (AOClient* client : qAsConst(server->clients)) { // qAsConst here avoids detaching the container + for (AOClient* client : qAsConst(server->m_clients)) { // qAsConst here avoids detaching the container if (client->current_area == current_area && client->joined) { area->invite(client->id); } @@ -179,14 +179,14 @@ void AOClient::cmdSpectatable(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; if (area->lockStatus() == AreaData::LockStatus::SPECTATABLE) { sendServerMessage("This area is already in spectate mode."); return; } sendServerMessageArea("This area is now spectatable."); area->spectatable(); - for (AOClient* client : qAsConst(server->clients)) { + for (AOClient* client : qAsConst(server->m_clients)) { if (client->current_area == current_area && client->joined) { area->invite(client->id); } @@ -199,7 +199,7 @@ void AOClient::cmdUnLock(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; if (area->lockStatus() == AreaData::LockStatus::FREE) { sendServerMessage("This area is not locked."); return; @@ -216,7 +216,7 @@ void AOClient::cmdGetAreas(int argc, QStringList argv) QStringList entries; entries.append("== Area List =="); - for (int i = 0; i < server->area_names.length(); i++) { + for (int i = 0; i < server->m_area_names.length(); i++) { QStringList cur_area_lines = buildAreaList(i); entries.append(cur_area_lines); } @@ -238,7 +238,7 @@ void AOClient::cmdArea(int argc, QStringList argv) bool ok; int new_area = argv[0].toInt(&ok); - if (!ok || new_area >= server->areas.size() || new_area < 0) { + if (!ok || new_area >= server->m_areas.size() || new_area < 0) { sendServerMessage("That does not look like a valid area ID."); return; } @@ -249,7 +249,7 @@ void AOClient::cmdAreaKick(int argc, QStringList argv) { Q_UNUSED(argc); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; bool ok; int idx = argv[0].toInt(&ok); @@ -257,7 +257,7 @@ void AOClient::cmdAreaKick(int argc, QStringList argv) sendServerMessage("That does not look like a valid ID."); return; } - if (server->areas[current_area]->owners().contains(idx)) { + if (server->m_areas[current_area]->owners().contains(idx)) { sendServerMessage("You cannot kick another CM!"); return; } @@ -281,9 +281,9 @@ void AOClient::cmdSetBackground(int argc, QStringList argv) Q_UNUSED(argc); QString f_background = argv.join(" "); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; if (authenticated || !area->bgLocked()) { - if (server->backgrounds.contains(f_background, Qt::CaseInsensitive) || area->ignoreBgList() == true) { + if (server->m_backgrounds.contains(f_background, Qt::CaseInsensitive) || area->ignoreBgList() == true) { area->setBackground(f_background); server->broadcast(AOPacket("BN", {f_background}), current_area); sendServerMessageArea(current_char + " changed the background to " + f_background); @@ -302,7 +302,7 @@ void AOClient::cmdBgLock(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; if (area->bgLocked() == false) { area->toggleBgLock(); @@ -316,7 +316,7 @@ void AOClient::cmdBgUnlock(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; if (area->bgLocked() == true) { area->toggleBgLock(); @@ -329,7 +329,7 @@ void AOClient::cmdStatus(int argc, QStringList argv) { Q_UNUSED(argc); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; QString arg = argv[0].toLower(); if (area->changeStatus(arg)) { @@ -346,7 +346,7 @@ void AOClient::cmdJudgeLog(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; if (area->judgelog().isEmpty()) { sendServerMessage("There have been no judge actions in this area."); return; @@ -367,7 +367,7 @@ void AOClient::cmdIgnoreBgList(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; area->toggleIgnoreBgList(); QString state = area->ignoreBgList() ? "ignored." : "enforced."; sendServerMessage("BG list in this area is now " + state); diff --git a/core/src/commands/casing.cpp b/core/src/commands/casing.cpp index 983f3ad..688568e 100644 --- a/core/src/commands/casing.cpp +++ b/core/src/commands/casing.cpp @@ -23,7 +23,7 @@ void AOClient::cmdDoc(int argc, QStringList argv) { QString sender_name = ooc_name; - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; if (argc == 0) { sendServerMessage("Document: " + area->document()); } @@ -39,7 +39,7 @@ void AOClient::cmdClearDoc(int argc, QStringList argv) Q_UNUSED(argv); QString sender_name = ooc_name; - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; area->changeDoc("No document."); sendServerMessageArea(sender_name + " cleared the document."); } @@ -48,7 +48,7 @@ void AOClient::cmdEvidenceMod(int argc, QStringList argv) { Q_UNUSED(argc); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; argv[0] = argv[0].toLower(); if (argv[0] == "cm") area->setEviMod(AreaData::EvidenceMod::CM); @@ -72,7 +72,7 @@ void AOClient::cmdEvidence_Swap(int argc, QStringList argv) { Q_UNUSED(argc); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; int ev_size = area->evidence().size() -1; if (ev_size < 0) { @@ -106,7 +106,7 @@ void AOClient::cmdTestify(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; if (area->testimonyRecording() == AreaData::TestimonyRecording::RECORDING) { sendServerMessage("Testimony recording is already in progress. Please stop it before starting a new one."); } @@ -122,7 +122,7 @@ void AOClient::cmdExamine(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; if (area->testimony().size() -1 > 0) { area->restartTestimony(); @@ -141,7 +141,7 @@ void AOClient::cmdTestimony(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; if (area->testimony().size() -1 < 1) { sendServerMessage("Unable to display empty testimony."); return; @@ -162,7 +162,7 @@ void AOClient::cmdDeleteStatement(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; int c_statement = area->statement(); if (area->testimony().size() - 1 == 0) { sendServerMessage("Unable to delete statement. No statements saved in this area."); @@ -178,7 +178,7 @@ void AOClient::cmdUpdateStatement(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - server->areas[current_area]->setTestimonyRecording(AreaData::TestimonyRecording::UPDATE); + server->m_areas[current_area]->setTestimonyRecording(AreaData::TestimonyRecording::UPDATE); sendServerMessage("The next IC-Message will replace the last displayed replay message."); } @@ -187,7 +187,7 @@ void AOClient::cmdPauseTestimony(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; area->setTestimonyRecording(AreaData::TestimonyRecording::STOPPED); server->broadcast(AOPacket("RT",{"testimony1", "1"}), current_area); sendServerMessage("Testimony has been stopped."); @@ -198,8 +198,8 @@ void AOClient::cmdAddStatement(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - if (server->areas[current_area]->statement() < ConfigManager::maxStatements()) { - server->areas[current_area]->setTestimonyRecording(AreaData::TestimonyRecording::ADD); + if (server->m_areas[current_area]->statement() < ConfigManager::maxStatements()) { + server->m_areas[current_area]->setTestimonyRecording(AreaData::TestimonyRecording::ADD); sendServerMessage("The next IC-Message will be inserted into the testimony."); } else @@ -218,7 +218,7 @@ void AOClient::cmdSaveTestimony(int argc, QStringList argv) permission_found = true; if (permission_found) { - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; if (area->testimony().size() -1 <= 0) { sendServerMessage("Can't save an empty testimony."); return; @@ -257,7 +257,7 @@ void AOClient::cmdLoadTestimony(int argc, QStringList argv) { Q_UNUSED(argc); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; QDir dir_testimony("storage/testimony"); if (!dir_testimony.exists()) { sendServerMessage("Unable to load testimonies. Testimony storage not found."); diff --git a/core/src/commands/command_helper.cpp b/core/src/commands/command_helper.cpp index e77a759..3bbdf82 100644 --- a/core/src/commands/command_helper.cpp +++ b/core/src/commands/command_helper.cpp @@ -32,8 +32,8 @@ void AOClient::cmdDefault(int argc, QStringList argv) QStringList AOClient::buildAreaList(int area_idx) { QStringList entries; - QString area_name = server->area_names[area_idx]; - AreaData* area = server->areas[area_idx]; + QString area_name = server->m_area_names[area_idx]; + AreaData* area = server->m_areas[area_idx]; entries.append("=== " + area_name + " ==="); switch (area->lockStatus()) { case AreaData::LockStatus::LOCKED: @@ -47,7 +47,7 @@ QStringList AOClient::buildAreaList(int area_idx) break; } entries.append("[" + QString::number(area->playerCount()) + " users][" + QVariant::fromValue(area->status()).toString().replace("_", "-") + "]"); - for (AOClient* client : qAsConst(server->clients)) { + for (AOClient* client : qAsConst(server->m_clients)) { if (client->current_area == area_idx && client->joined) { QString char_entry = "[" + QString::number(client->id) + "] " + client->current_char; if (client->current_char == "") @@ -101,7 +101,7 @@ void AOClient::diceThrower(int argc, QStringList argv, bool p_roll) QString AOClient::getAreaTimer(int area_idx, int timer_idx) { - AreaData* area = server->areas[area_idx]; + AreaData* area = server->m_areas[area_idx]; QTimer* timer; QString timer_name = (timer_idx == 0) ? "Global timer" : "Timer " + QString::number(timer_idx); diff --git a/core/src/commands/messaging.cpp b/core/src/commands/messaging.cpp index 62ec380..4149193 100644 --- a/core/src/commands/messaging.cpp +++ b/core/src/commands/messaging.cpp @@ -25,7 +25,7 @@ void AOClient::cmdPos(int argc, QStringList argv) Q_UNUSED(argc); changePosition(argv[0]); - updateEvidenceList(server->areas[current_area]); + updateEvidenceList(server->m_areas[current_area]); } void AOClient::cmdForcePos(int argc, QStringList argv) @@ -51,7 +51,7 @@ void AOClient::cmdForcePos(int argc, QStringList argv) } else if (argv[1] == "*") { // force all clients in the area - for (AOClient* client : qAsConst(server->clients)) { + for (AOClient* client : qAsConst(server->m_clients)) { if (client->current_area == current_area) targets.append(client); } @@ -69,9 +69,9 @@ void AOClient::cmdG(int argc, QStringList argv) Q_UNUSED(argc); QString sender_name = ooc_name; - QString sender_area = server->area_names.value(current_area); + QString sender_area = server->m_area_names.value(current_area); QString sender_message = argv.join(" "); - for (AOClient* client : qAsConst(server->clients)) { + for (AOClient* client : qAsConst(server->m_clients)) { if (client->global_enabled) client->sendPacket("CT", {"[G][" + sender_area + "]" + sender_name, sender_message}); } @@ -82,9 +82,9 @@ void AOClient::cmdNeed(int argc, QStringList argv) { Q_UNUSED(argc); - QString sender_area = server->area_names.value(current_area); + QString sender_area = server->m_area_names.value(current_area); QString sender_message = argv.join(" "); - for (AOClient* client : qAsConst(server->clients)) { + for (AOClient* client : qAsConst(server->m_clients)) { if (client->advert_enabled) { client->sendServerMessage({"=== Advert ===\n[" + sender_area + "] needs " + sender_message+ "."}); } @@ -113,11 +113,11 @@ void AOClient::cmdRandomChar(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; int selected_char_id; bool taken = true; while (taken) { - selected_char_id = genRand(0, server->characters.size() - 1); + selected_char_id = genRand(0, server->m_characters.size() - 1); if (!area->charactersTaken().contains(selected_char_id)) { taken = false; } @@ -174,7 +174,7 @@ void AOClient::cmdM(int argc, QStringList argv) QString sender_name = ooc_name; QString sender_message = argv.join(" "); - for (AOClient* client : qAsConst(server->clients)) { + for (AOClient* client : qAsConst(server->m_clients)) { if (client->checkAuth(ACLFlags.value("MODCHAT"))) client->sendPacket("CT", {"[M]" + sender_name, sender_message}); } @@ -186,9 +186,9 @@ void AOClient::cmdGM(int argc, QStringList argv) Q_UNUSED(argc); QString sender_name = ooc_name; - QString sender_area = server->area_names.value(current_area); + QString sender_area = server->m_area_names.value(current_area); QString sender_message = argv.join(" "); - for (AOClient* client : qAsConst(server->clients)) { + for (AOClient* client : qAsConst(server->m_clients)) { if (client->global_enabled) { client->sendPacket("CT", {"[G][" + sender_area + "]" + "["+sender_name+"][M]", sender_message}); } @@ -439,11 +439,11 @@ void AOClient::cmdCharCurse(int argc, QStringList argv) //Kick back to char select screen if (!target->charcurse_list.contains(server->getCharID(target->current_char))) { target->changeCharacter(-1); - server->updateCharsTaken(server->areas.value(current_area)); + server->updateCharsTaken(server->m_areas.value(current_area)); target->sendPacket("DONE"); } else { - server->updateCharsTaken(server->areas.value(current_area)); + server->updateCharsTaken(server->m_areas.value(current_area)); } target->sendServerMessage("You have been charcursed!"); @@ -474,7 +474,7 @@ void AOClient::cmdUnCharCurse(int argc, QStringList argv) } target->is_charcursed = false; target->charcurse_list.clear(); - server->updateCharsTaken(server->areas.value(current_area)); + server->updateCharsTaken(server->m_areas.value(current_area)); sendServerMessage("Uncharcursed player."); target->sendServerMessage("You were uncharcursed."); } @@ -517,7 +517,7 @@ void AOClient::cmdA(int argc, QStringList argv) return; } - AreaData* area = server->areas[area_id]; + AreaData* area = server->m_areas[area_id]; if (!area->owners().contains(id)) { sendServerMessage("You are not CM in that area."); return; @@ -533,12 +533,12 @@ void AOClient::cmdS(int argc, QStringList argv) { Q_UNUSED(argc); - int all_areas = server->areas.size() - 1; + int all_areas = server->m_areas.size() - 1; QString sender_name = ooc_name; QString ooc_message = argv.join(" "); for (int i = 0; i <= all_areas; i++) { - if (server->areas[i]->owners().contains(id)) + if (server->m_areas[i]->owners().contains(id)) server->broadcast(AOPacket("CT", {"[CM]" + sender_name, ooc_message}), i); } } diff --git a/core/src/commands/moderation.cpp b/core/src/commands/moderation.cpp index 14ffc45..610626a 100644 --- a/core/src/commands/moderation.cpp +++ b/core/src/commands/moderation.cpp @@ -132,7 +132,7 @@ void AOClient::cmdMods(int argc, QStringList argv) QStringList entries; int online_count = 0; - for (AOClient* client : qAsConst(server->clients)) { + for (AOClient* client : qAsConst(server->m_clients)) { if (client->authenticated) { entries << "---"; if (ConfigManager::authType() != DataTypes::AuthType::SIMPLE) @@ -402,7 +402,7 @@ void AOClient::cmdAllowBlankposting(int argc, QStringList argv) Q_UNUSED(argv); QString sender_name = ooc_name; - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; area->toggleBlankposting(); if (area->blankpostingAllowed() == false) { sendServerMessageArea(sender_name + " has set blankposting in the area to forbidden."); @@ -470,7 +470,7 @@ void AOClient::cmdForceImmediate(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; area->toggleImmediate(); QString state = area->forceImmediate() ? "on." : "off."; sendServerMessage("Forced immediate text processing in this area is now " + state); @@ -481,7 +481,7 @@ void AOClient::cmdAllowIniswap(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; area->toggleIniswap(); QString state = area->iniswapAllowed() ? "allowed." : "disallowed."; sendServerMessage("Iniswapping in this area is now " + state); diff --git a/core/src/commands/music.cpp b/core/src/commands/music.cpp index 4dc13be..eb3635b 100644 --- a/core/src/commands/music.cpp +++ b/core/src/commands/music.cpp @@ -28,7 +28,7 @@ void AOClient::cmdPlay(int argc, QStringList argv) sendServerMessage("You are blocked from changing the music."); return; } - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; QString song = argv.join(" "); area->currentMusic() = song; area->musicPlayerBy() = showname; @@ -41,7 +41,7 @@ void AOClient::cmdCurrentMusic(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; if (area->currentMusic() != "" && area->currentMusic() != "~stop.mp3") // dummy track for stopping music sendServerMessage("The current song is " + area->currentMusic() + " played by " + area->musicPlayerBy()); else @@ -107,7 +107,7 @@ void AOClient::cmdToggleMusic(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; area->toggleMusic(); QString state = area->isMusicAllowed() ? "allowed." : "disallowed."; sendServerMessage("Music in this area is now " + state); diff --git a/core/src/commands/roleplay.cpp b/core/src/commands/roleplay.cpp index 93dbcbb..684576e 100644 --- a/core/src/commands/roleplay.cpp +++ b/core/src/commands/roleplay.cpp @@ -43,7 +43,7 @@ void AOClient::cmdRollP(int argc, QStringList argv) void AOClient::cmdTimer(int argc, QStringList argv) { - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; // Called without arguments // Shows a brief of all timers @@ -134,7 +134,7 @@ void AOClient::cmdNoteCard(int argc, QStringList argv) { Q_UNUSED(argc); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; QString notecard = argv.join(" "); area->addNotecard(current_char, notecard); sendServerMessageArea(current_char + " wrote a note card."); @@ -145,7 +145,7 @@ void AOClient::cmdNoteCardClear(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; if (!area->addNotecard(current_char, QString())) { sendServerMessageArea(current_char + " erased their note card."); } @@ -156,7 +156,7 @@ void AOClient::cmdNoteCardReveal(int argc, QStringList argv) Q_UNUSED(argc); Q_UNUSED(argv); - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; const QStringList l_notecards = area->getNotecards(); if (l_notecards.isEmpty()) { @@ -192,7 +192,7 @@ void AOClient::cmdSubTheme(int argc, QStringList argv) Q_UNUSED(argc); QString subtheme = argv.join(" "); - for (AOClient* client : qAsConst(server->clients)) { + for (AOClient* client : qAsConst(server->m_clients)) { if (client->current_area == current_area) client->sendPacket("ST", {subtheme, "1"}); } diff --git a/core/src/config_manager.cpp b/core/src/config_manager.cpp index 6b8aacf..0a2b37e 100644 --- a/core/src/config_manager.cpp +++ b/core/src/config_manager.cpp @@ -21,6 +21,7 @@ QSettings* ConfigManager::m_settings = new QSettings("config/config.ini", QSettings::IniFormat); QSettings* ConfigManager::m_discord = new QSettings("config/discord.ini", QSettings::IniFormat); +QSettings* ConfigManager::m_areas = new QSettings("config/areas.ini", QSettings::IniFormat); ConfigManager::CommandSettings* ConfigManager::m_commands = new CommandSettings(); QElapsedTimer* ConfigManager::m_uptimeTimer = new QElapsedTimer; @@ -93,6 +94,75 @@ bool ConfigManager::verifyServerConfig() return true; } +QString ConfigManager::bindIP() +{ + return m_settings->value("Options/bind_ip","all").toString(); +} + +QStringList ConfigManager::charlist() +{ + QStringList l_charlist; + QFile l_file("config/characters.txt"); + l_file.open(QIODevice::ReadOnly | QIODevice::Text); + while (!l_file.atEnd()) { + l_charlist.append(l_file.readLine().trimmed()); + } + l_file.close(); + + return l_charlist; +} + +QStringList ConfigManager::backgrounds() +{ + QStringList l_backgrounds; + QFile l_file("config/backgrounds.txt"); + l_file.open(QIODevice::ReadOnly | QIODevice::Text); + while (!l_file.atEnd()) { + l_backgrounds.append(l_file.readLine().trimmed()); + } + l_file.close(); + + return l_backgrounds; +} + +QStringList ConfigManager::musiclist() +{ + QStringList l_music_list; + QFile l_file("config/music.txt"); + l_file.open(QIODevice::ReadOnly | QIODevice::Text); + while (!l_file.atEnd()) { + l_music_list.append(l_file.readLine().trimmed()); + } + l_file.close(); + if(l_music_list[0].contains(".")) // Add a default category if none exists + l_music_list.insert(0, "==Music=="); + return l_music_list; +} + +QSettings* ConfigManager::areaData() +{ + return m_areas; +} + +QStringList ConfigManager::sanitizedAreaNames() +{ + QStringList l_area_names = m_areas->childGroups(); // invisibly does a lexicographical sort, because Qt is great like that + std::sort(l_area_names.begin(), l_area_names.end(), [] (const QString &a, const QString &b) {return a.split(":")[0].toInt() < b.split(":")[0].toInt();}); + QStringList l_sanitized_area_names; + for (const QString &areaName : qAsConst(l_area_names)) { + QStringList l_nameSplit = areaName.split(":"); + l_nameSplit.removeFirst(); + QString l_area_name_sanitized = l_nameSplit.join(":"); + l_sanitized_area_names.append(l_area_name_sanitized); + } + return l_sanitized_area_names; +} + +QStringList ConfigManager::rawAreaNames() +{ + return m_areas->childGroups(); +} + void ConfigManager::reloadSettings() { m_settings->sync(); @@ -102,12 +172,12 @@ void ConfigManager::reloadSettings() QStringList ConfigManager::loadConfigFile(const QString filename) { QStringList stringlist; - QFile file("config/text/" + filename + ".txt"); - file.open(QIODevice::ReadOnly | QIODevice::Text); - while (!(file.atEnd())) { - stringlist.append(file.readLine().trimmed()); + QFile l_file("config/text/" + filename + ".txt"); + l_file.open(QIODevice::ReadOnly | QIODevice::Text); + while (!(l_file.atEnd())) { + stringlist.append(l_file.readLine().trimmed()); } - file.close(); + l_file.close(); return stringlist; } diff --git a/core/src/packets.cpp b/core/src/packets.cpp index 52bb861..2423d75 100644 --- a/core/src/packets.cpp +++ b/core/src/packets.cpp @@ -74,7 +74,7 @@ void AOClient::pktSoftwareId(AreaData* area, int argc, QStringList argv, AOPacke version.minor = match.captured(3).toInt(); } - sendPacket("PN", {QString::number(server->player_count), QString::number(ConfigManager::maxPlayers())}); + sendPacket("PN", {QString::number(server->m_player_count), QString::number(ConfigManager::maxPlayers())}); sendPacket("FL", feature_list); if (ConfigManager::assetUrl().isValid()) { @@ -93,7 +93,7 @@ void AOClient::pktBeginLoad(AreaData* area, int argc, QStringList argv, AOPacket // Evidence isn't loaded during this part anymore // As a result, we can always send "0" for evidence length // Client only cares about what it gets from LE - sendPacket("SI", {QString::number(server->characters.length()), "0", QString::number(server->area_names.length() + server->music_list.length())}); + sendPacket("SI", {QString::number(server->m_characters.length()), "0", QString::number(server->m_area_names.length() + server->m_music_list.length())}); } void AOClient::pktRequestChars(AreaData* area, int argc, QStringList argv, AOPacket packet) @@ -103,7 +103,7 @@ void AOClient::pktRequestChars(AreaData* area, int argc, QStringList argv, AOPac Q_UNUSED(argv); Q_UNUSED(packet); - sendPacket("SC", server->characters); + sendPacket("SC", server->m_characters); } void AOClient::pktRequestMusic(AreaData* area, int argc, QStringList argv, AOPacket packet) @@ -113,7 +113,7 @@ void AOClient::pktRequestMusic(AreaData* area, int argc, QStringList argv, AOPac Q_UNUSED(argv); Q_UNUSED(packet); - sendPacket("SM", server->area_names + server->music_list); + sendPacket("SM", server->m_area_names + server->m_music_list); } void AOClient::pktLoadingDone(AreaData* area, int argc, QStringList argv, AOPacket packet) @@ -132,7 +132,7 @@ void AOClient::pktLoadingDone(AreaData* area, int argc, QStringList argv, AOPack return; } - server->player_count++; + server->m_player_count++; area->clientJoinedArea(); joined = true; server->updateCharsTaken(area); @@ -142,7 +142,7 @@ void AOClient::pktLoadingDone(AreaData* area, int argc, QStringList argv, AOPack sendPacket("HP", {"1", QString::number(area->defHP())}); sendPacket("HP", {"2", QString::number(area->proHP())}); - sendPacket("FA", server->area_names); + sendPacket("FA", server->m_area_names); //Here lies OPPASS, the genius of FanatSors who send the modpass to everyone in plain text. sendPacket("DONE"); sendPacket("BN", {area->background()}); @@ -217,7 +217,7 @@ void AOClient::pktIcChat(AreaData* area, int argc, QStringList argv, AOPacket pa validated_packet.contents[5] = pos; server->broadcast(validated_packet, current_area); - emit logIC((current_char + " " + showname), ooc_name,ipid,server->areas[current_area]->name(),last_message); + emit logIC((current_char + " " + showname), ooc_name,ipid,server->m_areas[current_area]->name(),last_message); area->updateLastICMessage(validated_packet.contents); server->can_send_ic_messages = false; @@ -264,7 +264,7 @@ void AOClient::pktOocChat(AreaData* area, int argc, QStringList argv, AOPacket p int cmd_argc = cmd_argv.length(); handleCommand(command, cmd_argc, cmd_argv); - emit logCMD((current_char + " " + showname),ipid, ooc_name,command,cmd_argv,server->areas[current_area]->name()); + emit logCMD((current_char + " " + showname),ipid, ooc_name,command,cmd_argv,server->m_areas[current_area]->name()); return; } else { @@ -298,7 +298,7 @@ void AOClient::pktChangeMusic(AreaData* area, int argc, QStringList argv, AOPack // argument is a valid song QString argument = argv[0]; - for (const QString &song : qAsConst(server->music_list)) { + for (const QString &song : qAsConst(server->m_music_list)) { if (song == argument || song == "~stop.mp3") { // ~stop.mp3 is a dummy track used by 2.9+ // We have a song here if (is_dj_blocked) { @@ -327,8 +327,8 @@ void AOClient::pktChangeMusic(AreaData* area, int argc, QStringList argv, AOPack } } - for (int i = 0; i < server->area_names.length(); i++) { - QString area = server->area_names[i]; + for (int i = 0; i < server->m_area_names.length(); i++) { + QString area = server->m_area_names[i]; if(area == argument) { changeArea(i); break; @@ -398,7 +398,7 @@ void AOClient::pktWebSocketIp(AreaData* area, int argc, QStringList argv, AOPack } int multiclient_count = 0; - for (AOClient* joined_client : qAsConst(server->clients)) { + for (AOClient* joined_client : qAsConst(server->m_clients)) { if (remote_ip.isEqual(joined_client->remote_ip)) multiclient_count++; } @@ -415,11 +415,11 @@ void AOClient::pktModCall(AreaData* area, int argc, QStringList argv, AOPacket p Q_UNUSED(argc); Q_UNUSED(argv); - for (AOClient* client : qAsConst(server->clients)) { + for (AOClient* client : qAsConst(server->m_clients)) { if (client->authenticated) client->sendPacket(packet); } - emit logModcall((current_char + " " + showname),ipid, ooc_name, server->areas[current_area]->name()); + emit logModcall((current_char + " " + showname),ipid, ooc_name, server->m_areas[current_area]->name()); if (ConfigManager::discordModcallWebhookEnabled()) { QString name = ooc_name; @@ -524,7 +524,7 @@ void AOClient::pktAnnounceCase(AreaData* area, int argc, QStringList argv, AOPac #else QSet needs_set = needs_list.toSet(); #endif - for (AOClient* client : qAsConst(server->clients)) { + for (AOClient* client : qAsConst(server->m_clients)) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) QSet matches(client->casing_preferences.begin(), client->casing_preferences.end()); matches.intersect(needs_set); @@ -546,7 +546,7 @@ void AOClient::pktAnnounceCase(AreaData* area, int argc, QStringList argv, AOPac void AOClient::sendEvidenceList(AreaData* area) { - for (AOClient* client : qAsConst(server->clients)) { + for (AOClient* client : qAsConst(server->m_clients)) { if (client->current_area == current_area) client->updateEvidenceList(area); } @@ -590,7 +590,7 @@ AOPacket AOClient::validateIcPacket(AOPacket packet) if (current_char == "" || !joined) // Spectators cannot use IC return invalid; - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; if (area->lockStatus() == AreaData::LockStatus::SPECTATABLE && !area->invited().contains(id) && !checkAuth(ACLFlags.value("BYPASS_LOCKS"))) // Non-invited players cannot speak in spectatable areas return invalid; @@ -617,7 +617,7 @@ AOPacket AOClient::validateIcPacket(AOPacket packet) // Selected char is different from supplied folder name // This means the user is INI-swapped if (!area->iniswapAllowed()) { - if (!server->characters.contains(incoming_args[2].toString(), Qt::CaseInsensitive)) + if (!server->m_characters.contains(incoming_args[2].toString(), Qt::CaseInsensitive)) return invalid; } qDebug() << "INI swap detected from " << getIpid(); @@ -670,7 +670,7 @@ AOPacket AOClient::validateIcPacket(AOPacket packet) args.append(incoming_args[5].toString()); if (pos != incoming_args[5].toString()) { pos = incoming_args[5].toString(); - updateEvidenceList(server->areas[current_area]); + updateEvidenceList(server->m_areas[current_area]); } // sfx name @@ -770,7 +770,7 @@ AOPacket AOClient::validateIcPacket(AOPacket packet) QString other_emote = "0"; QString other_offset = "0"; QString other_flip = "0"; - for (AOClient* client : qAsConst(server->clients)) { + for (AOClient* client : qAsConst(server->m_clients)) { if (client->pairing_with == char_id && other_charid != char_id && client->char_id == pairing_with @@ -990,7 +990,7 @@ void AOClient::loginAttempt(QString message) sendPacket("AUTH", {"0"}); // Client: "Login unsuccessful." sendServerMessage("Incorrect password."); } - emit logLogin((current_char + " " + showname),ooc_name,"Moderator", ipid, server->areas.value(current_area)->name(),authenticated); + emit logLogin((current_char + " " + showname),ooc_name,"Moderator", ipid, server->m_areas.value(current_area)->name(),authenticated); break; case DataTypes::AuthType::ADVANCED: QStringList login = message.split(" "); @@ -1014,7 +1014,7 @@ void AOClient::loginAttempt(QString message) sendPacket("AUTH", {"0"}); // Client: "Login unsuccessful." sendServerMessage("Incorrect password."); } - emit logLogin((current_char + " " + showname),ooc_name, username, ipid, server->areas.value(current_area)->name(),authenticated); + emit logLogin((current_char + " " + showname),ooc_name, username, ipid, server->m_areas.value(current_area)->name(),authenticated); break; } sendServerMessage("Exiting login prompt."); diff --git a/core/src/server.cpp b/core/src/server.cpp index 1802816..41a9568 100644 --- a/core/src/server.cpp +++ b/core/src/server.cpp @@ -19,24 +19,31 @@ Server::Server(int p_port, int p_ws_port, QObject* parent) : QObject(parent), - player_count(0), + m_player_count(0), port(p_port), ws_port(p_ws_port) { server = new QTcpServer(this); connect(server, SIGNAL(newConnection()), this, SLOT(clientConnected())); + proxy = new WSProxy(port, ws_port, this); + if(ws_port != -1) + proxy->start(); timer = new QTimer(); db_manager = new DBManager(); + //We create it, even if its not used later on. + discord = new Discord(this); + + logger = new ULogger(this); + connect(this, &Server::logConnectionAttempt, + logger, &ULogger::logConnectionAttempt); } void Server::start() { - QSettings config("config/config.ini", QSettings::IniFormat); - config.beginGroup("Options"); - QString bind_ip = config.value("ip", "all").toString(); + QString bind_ip = ConfigManager::bindIP(); QHostAddress bind_addr; if (bind_ip == "all") bind_addr = QHostAddress::Any; @@ -52,9 +59,10 @@ void Server::start() qDebug() << "Server listening on" << port; } - discord = new Discord(this); + //Checks if any Discord webhooks are enabled. handleDiscordIntegration(); + //Construct modern advertiser if enabled in config if (ConfigManager::advertiseHTTPServer()) { httpAdvertiserTimer = new QTimer(this); httpAdvertiser = new HTTPAdvertiser(); @@ -69,53 +77,24 @@ void Server::start() httpAdvertiserTimer->start(300000); } - logger = new ULogger(this); - connect(this, &Server::logConnectionAttempt, - logger, &ULogger::logConnectionAttempt); + //Get characters from config file + m_characters = ConfigManager::charlist(); - proxy = new WSProxy(port, ws_port, this); - if(ws_port != -1) - proxy->start(); + //Get musiclist from config file + m_music_list = ConfigManager::musiclist(); - QFile char_list("config/characters.txt"); - char_list.open(QIODevice::ReadOnly | QIODevice::Text); - while (!char_list.atEnd()) { - characters.append(char_list.readLine().trimmed()); - } - char_list.close(); + //Get backgrounds from config file + m_backgrounds = ConfigManager::backgrounds(); - QFile music_file("config/music.txt"); - music_file.open(QIODevice::ReadOnly | QIODevice::Text); - while (!music_file.atEnd()) { - music_list.append(music_file.readLine().trimmed()); - } - music_file.close(); - if(music_list[0].contains(".")) // Add a default category if none exists - music_list.insert(0, "==Music=="); - - QFile bg_file("config/backgrounds.txt"); - bg_file.open(QIODevice::ReadOnly | QIODevice::Text); - while (!bg_file.atEnd()) { - backgrounds.append(bg_file.readLine().trimmed()); - } - bg_file.close(); - - QSettings areas_ini("config/areas.ini", QSettings::IniFormat); - area_names = areas_ini.childGroups(); // invisibly does a lexicographical sort, because Qt is great like that - std::sort(area_names.begin(), area_names.end(), [] (const QString &a, const QString &b) {return a.split(":")[0].toInt() < b.split(":")[0].toInt();}); - QStringList sanitized_area_names; - QStringList raw_area_names = area_names; - for (const QString &area_name : qAsConst(area_names)) { - QStringList name_split = area_name.split(":"); - name_split.removeFirst(); - QString area_name_sanitized = name_split.join(":"); - sanitized_area_names.append(area_name_sanitized); - } - area_names = sanitized_area_names; + //Assembles the area list + m_area_names = ConfigManager::sanitizedAreaNames(); + QStringList raw_area_names = ConfigManager::rawAreaNames(); for (int i = 0; i < raw_area_names.length(); i++) { QString area_name = raw_area_names[i]; - areas.insert(i, new AreaData(area_name, i)); + m_areas.insert(i, new AreaData(area_name, i)); } + + //Rate-Limiter for IC-Chat connect(&next_message_timer, SIGNAL(timeout()), this, SLOT(allowMessage())); } @@ -124,10 +103,10 @@ void Server::clientConnected() QTcpSocket* socket = server->nextPendingConnection(); int user_id; QList user_ids; - for (AOClient* client : qAsConst(clients)) { + for (AOClient* client : qAsConst(m_clients)) { user_ids.append(client->id); } - for (user_id = 0; user_id <= player_count; user_id++) { + for (user_id = 0; user_id <= m_player_count; user_id++) { if (user_ids.contains(user_id)) continue; else @@ -140,7 +119,7 @@ void Server::clientConnected() client->calculateIpid(); auto ban = db_manager->isIPBanned(client->getIpid()); bool is_banned = ban.first; - for (AOClient* joined_client : qAsConst(clients)) { + for (AOClient* joined_client : qAsConst(m_clients)) { if (client->remote_ip.isEqual(joined_client->remote_ip)) multiclient_count++; } @@ -160,11 +139,11 @@ void Server::clientConnected() return; } - clients.append(client); + m_clients.append(client); connect(socket, &QTcpSocket::disconnected, client, &AOClient::clientDisconnected); connect(socket, &QTcpSocket::disconnected, this, [=] { - clients.removeAll(client); + m_clients.removeAll(client); client->deleteLater(); }); connect(socket, &QTcpSocket::readyRead, client, &AOClient::clientData); @@ -182,7 +161,7 @@ void Server::clientConnected() void Server::updateCharsTaken(AreaData* area) { QStringList chars_taken; - for (const QString &cur_char : qAsConst(characters)) { + for (const QString &cur_char : qAsConst(m_characters)) { chars_taken.append(area->charactersTaken().contains(getCharID(cur_char)) ? QStringLiteral("-1") : QStringLiteral("0")); @@ -190,7 +169,7 @@ void Server::updateCharsTaken(AreaData* area) AOPacket response_cc("CharsCheck", chars_taken); - for (AOClient* client : qAsConst(clients)) { + for (AOClient* client : qAsConst(m_clients)) { if (client->current_area == area->index()){ if (!client->is_charcursed) client->sendPacket(response_cc); @@ -217,7 +196,7 @@ QStringList Server::getCursedCharsTaken(AOClient* client, QStringList chars_take void Server::broadcast(AOPacket packet, int area_index) { - for (AOClient* client : qAsConst(clients)) { + for (AOClient* client : qAsConst(m_clients)) { if (client->current_area == area_index) client->sendPacket(packet); } @@ -225,7 +204,7 @@ void Server::broadcast(AOPacket packet, int area_index) void Server::broadcast(AOPacket packet) { - for (AOClient* client : qAsConst(clients)) { + for (AOClient* client : qAsConst(m_clients)) { client->sendPacket(packet); } } @@ -233,7 +212,7 @@ void Server::broadcast(AOPacket packet) QList Server::getClientsByIpid(QString ipid) { QList return_clients; - for (AOClient* client : qAsConst(clients)) { + for (AOClient* client : qAsConst(m_clients)) { if (client->getIpid() == ipid) return_clients.append(client); } @@ -242,7 +221,7 @@ QList Server::getClientsByIpid(QString ipid) AOClient* Server::getClientByID(int id) { - for (AOClient* client : qAsConst(clients)) { + for (AOClient* client : qAsConst(m_clients)) { if (client->id == id) return client; } @@ -251,9 +230,9 @@ AOClient* Server::getClientByID(int id) int Server::getCharID(QString char_name) { - for (const QString &character : qAsConst(characters)) { + for (const QString &character : qAsConst(m_characters)) { if (character.toLower() == char_name.toLower()) { - return characters.indexOf(QRegExp(character, Qt::CaseInsensitive)); + return m_characters.indexOf(QRegExp(character, Qt::CaseInsensitive)); } } return -1; // character does not exist @@ -336,7 +315,7 @@ void Server::hookupLogger(AOClient* client) Server::~Server() { - for (AOClient* client : qAsConst(clients)) { + for (AOClient* client : qAsConst(m_clients)) { client->deleteLater(); } server->deleteLater(); diff --git a/core/src/testimony_recorder.cpp b/core/src/testimony_recorder.cpp index 3b65b09..8c63de2 100644 --- a/core/src/testimony_recorder.cpp +++ b/core/src/testimony_recorder.cpp @@ -24,7 +24,7 @@ void AOClient::addStatement(QStringList packet) if (checkTestimonySymbols(packet[4])) { return; } - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; int c_statement = area->statement(); if (c_statement >= -1) { if (area->testimonyRecording() == AreaData::TestimonyRecording::RECORDING) { @@ -57,7 +57,7 @@ QStringList AOClient::updateStatement(QStringList packet) if (checkTestimonySymbols(packet[4])) { return packet; } - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; int c_statement = area->statement(); area->setTestimonyRecording(AreaData::TestimonyRecording::PLAYBACK); if (c_statement <= 0 || area->testimony()[c_statement].empty()) @@ -73,7 +73,7 @@ QStringList AOClient::updateStatement(QStringList packet) void AOClient::clearTestimony() { - AreaData* area = server->areas[current_area]; + AreaData* area = server->m_areas[current_area]; area->clearTestimony(); }