From b682d69e494acdbf5fc97a81109faa667ad1918f Mon Sep 17 00:00:00 2001 From: oldmud0 Date: Sun, 13 Jun 2021 22:16:41 -0500 Subject: [PATCH 01/12] Use new HTTP-based master server client --- include/aoapplication.h | 6 +- include/aooptionsdialog.h | 5 + include/lobby.h | 2 + include/networkmanager.h | 67 ++++----- src/aoapplication.cpp | 4 +- src/aooptionsdialog.cpp | 29 ++++ src/courtroom.cpp | 5 +- src/lobby.cpp | 45 +++++- src/main.cpp | 2 +- src/networkmanager.cpp | 268 +++++++++++++----------------------- src/packet_distribution.cpp | 19 +-- 11 files changed, 204 insertions(+), 248 deletions(-) diff --git a/include/aoapplication.h b/include/aoapplication.h index 835c7fd..d0d5121 100644 --- a/include/aoapplication.h +++ b/include/aoapplication.h @@ -61,7 +61,6 @@ public: void ms_packet_received(AOPacket *p_packet); void server_packet_received(AOPacket *p_packet); - void send_ms_packet(AOPacket *p_packet); void send_server_packet(AOPacket *p_packet, bool encoded = true); void call_settings_menu(); @@ -119,7 +118,7 @@ public: QVector &get_favorite_list() { return favorite_list; } void add_favorite_server(int p_server); - void set_server_list(); + void set_server_list(QVector &servers) { server_list = servers; } QVector &get_server_list() { return server_list; } // reads the theme from config.ini and sets it accordingly @@ -528,9 +527,6 @@ private: QVector server_list; QVector favorite_list; -private slots: - void ms_connect_finished(bool connected, bool will_retry); - public slots: void server_disconnected(); void loading_cancelled(); diff --git a/include/aooptionsdialog.h b/include/aooptionsdialog.h index a6c8b8e..de1a3b5 100644 --- a/include/aooptionsdialog.h +++ b/include/aooptionsdialog.h @@ -23,6 +23,7 @@ #include #include +#include #include class Lobby; @@ -174,6 +175,10 @@ private: QLabel *ui_log_lbl; QCheckBox *ui_log_cb; + QWidget *ui_privacy_tab; + QVBoxLayout *ui_privacy_layout; + QTextBrowser *ui_privacy_policy; + bool needs_default_audiodev(); void update_values(); diff --git a/include/lobby.h b/include/lobby.h index 0f066ab..1d2cbc6 100644 --- a/include/lobby.h +++ b/include/lobby.h @@ -30,6 +30,8 @@ public: void set_widgets(); void list_servers(); void list_favorites(); + void get_motd(); + void check_for_updates(); void append_chatmessage(QString f_name, QString f_message); void append_error(QString f_message); void set_player_count(int players_online, int max_players); diff --git a/include/networkmanager.h b/include/networkmanager.h index ed57a95..a05c551 100644 --- a/include/networkmanager.h +++ b/include/networkmanager.h @@ -1,28 +1,23 @@ #ifndef NETWORKMANAGER_H #define NETWORKMANAGER_H -// Qt for Android has stubbed QDnsLookup. This is not documented in any part of -// their wiki. This prevents SRV lookup/failover behavior from functioning. -// https://bugreports.qt.io/browse/QTBUG-56143 -#ifndef ANDROID -#define MS_FAILOVER_SUPPORTED -#endif - -//#define LOCAL_MS - -#ifdef LOCAL_MS -#undef MS_FAILOVER_SUPPORTED -#endif - #include "aoapplication.h" #include "aopacket.h" #include +#include #include #include #include + #include +enum MSDocumentType { + PrivacyPolicy, + Motd, + ClientVersion +}; + class NetworkManager : public QObject { Q_OBJECT @@ -31,53 +26,37 @@ public: ~NetworkManager(); AOApplication *ao_app; - QTcpSocket *ms_socket; + QNetworkAccessManager *http; QTcpSocket *server_socket; - QDnsLookup *ms_dns; - QTimer *ms_reconnect_timer; - const QString ms_srv_hostname = "_aoms._tcp.aceattorneyonline.com"; -#ifdef LOCAL_MS - QString ms_nosrv_hostname = "localhost"; -#else - QString ms_nosrv_hostname = "master.aceattorneyonline.com"; -#endif + QString ms_baseurl = "https://ms3.oldmud0.workers.dev"; - const quint16 ms_port = 27016; - const int timeout_milliseconds = 2000; - - // in seconds - const int ms_reconnect_delay = 7; - - bool ms_partial_packet = false; - QString ms_temp_packet = ""; + const int timeout_milliseconds = 5000; bool partial_packet = false; QString temp_packet = ""; unsigned int s_decryptor = 5; - void connect_to_master(); - void connect_to_master_nosrv(); void connect_to_server(server_type p_server); public slots: - void ship_ms_packet(QString p_packet); + void get_server_list(const std::function &cb); void ship_server_packet(QString p_packet); + void handle_server_packet(); -signals: - void ms_connect_finished(bool success, bool will_retry); + void request_document(MSDocumentType document_type, + const std::function &cb); +private slots: + void heartbeat_playing(); + void ms_request_finished(QNetworkReply *reply, + const std::function &cb); private: - void perform_srv_lookup(); - -private slots: - void on_srv_lookup(); - void handle_ms_packet(); - void handle_server_packet(); - void on_ms_nosrv_connect_success(); - void on_ms_socket_error(QAbstractSocket::SocketError error); - void retry_ms_connect(); + QString get_user_agent() const { + return QStringLiteral("AttorneyOnline/%1 (Desktop)") + .arg(ao_app->get_version_string()); + } }; #endif // NETWORKMANAGER_H diff --git a/src/aoapplication.cpp b/src/aoapplication.cpp index dd8d9ae..82635ab 100644 --- a/src/aoapplication.cpp +++ b/src/aoapplication.cpp @@ -16,8 +16,6 @@ AOApplication::AOApplication(int &argc, char **argv) : QApplication(argc, argv) net_manager = new NetworkManager(this); discord = new AttorneyOnline::Discord(); - QObject::connect(net_manager, SIGNAL(ms_connect_finished(bool, bool)), - SLOT(ms_connect_finished(bool, bool))); qApp->setStyleSheet("QFrame {background-color:transparent;} QAbstractItemView {background-color: transparent; color: black;}; QLineEdit {background-color:transparent;}"); } @@ -153,6 +151,7 @@ void AOApplication::loading_cancelled() w_lobby->hide_loading_overlay(); } +/* void AOApplication::ms_connect_finished(bool connected, bool will_retry) { if (connected) { @@ -179,6 +178,7 @@ void AOApplication::ms_connect_finished(bool connected, bool will_retry) } } } +*/ void AOApplication::call_settings_menu() { diff --git a/src/aooptionsdialog.cpp b/src/aooptionsdialog.cpp index 1db0dec..f3ca768 100644 --- a/src/aooptionsdialog.cpp +++ b/src/aooptionsdialog.cpp @@ -3,6 +3,7 @@ #include "courtroom.h" #include "lobby.h" #include "bass.h" +#include "networkmanager.h" AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app) : QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint) @@ -902,7 +903,23 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app) ui_casing_layout->setWidget(row, QFormLayout::FieldRole, ui_log_cb); + // privacy policy. + ui_privacy_tab = new QWidget(this); + ui_settings_tabs->addTab(ui_privacy_tab, tr("Privacy")); + + ui_privacy_layout = new QVBoxLayout(ui_privacy_tab); + ui_privacy_layout->setContentsMargins(0, 0, 0, 0); + + ui_privacy_policy = new QTextBrowser(ui_privacy_tab); + QSizePolicy privacySizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + sizePolicy.setHorizontalStretch(0); + sizePolicy.setVerticalStretch(0); + ui_privacy_policy->setSizePolicy(privacySizePolicy); + ui_privacy_policy->setPlainText(tr("Getting privacy policy...")); + ui_privacy_layout->addWidget(ui_privacy_policy); + update_values(); + // When we're done, we should continue the updates! setUpdatesEnabled(true); } @@ -976,6 +993,18 @@ void AOOptionsDialog::update_values() { ui_blips_volume_spinbox->setValue(ao_app->get_default_blip()); ui_bliprate_spinbox->setValue(ao_app->read_blip_rate()); ui_default_showname_textbox->setText(ao_app->get_default_showname()); + + ao_app->net_manager->request_document(MSDocumentType::PrivacyPolicy, [this](QString document) { + if (document.isEmpty()) + document = tr("Couldn't get the privacy policy."); + bool isHtml = document.startsWith("", Qt::CaseInsensitive); + if (isHtml) { + ui_privacy_policy->setHtml(document); + } else { + ui_privacy_policy->setMarkdown(document); + } + }); } void AOOptionsDialog::save_pressed() diff --git a/src/courtroom.cpp b/src/courtroom.cpp index b2fdc3c..a4bbb13 100644 --- a/src/courtroom.cpp +++ b/src/courtroom.cpp @@ -4307,8 +4307,9 @@ void Courtroom::on_ooc_return_pressed() if (server_ooc) ao_app->send_server_packet(f_packet); - else - ao_app->send_ms_packet(f_packet); + else { + // ao_app->send_ms_packet(f_packet); + } ui_ooc_chat_message->clear(); diff --git a/src/lobby.cpp b/src/lobby.cpp index 5cdb94a..feb922c 100644 --- a/src/lobby.cpp +++ b/src/lobby.cpp @@ -101,6 +101,8 @@ Lobby::Lobby(AOApplication *p_ao_app) : QMainWindow() ui_connect->setEnabled(false); list_servers(); + get_motd(); + check_for_updates(); set_widgets(); } @@ -324,9 +326,13 @@ void Lobby::on_refresh_released() { ui_refresh->set_image("refresh"); - AOPacket *f_packet = new AOPacket("ALL#%"); - - ao_app->send_ms_packet(f_packet); + if (public_servers_selected) { + ao_app->net_manager->get_server_list(std::bind(&Lobby::list_servers, this)); + get_motd(); + } else { + ao_app->set_favorite_list(); + list_favorites(); + } } void Lobby::on_add_to_fav_pressed() @@ -492,9 +498,10 @@ void Lobby::on_chatfield_return_pressed() QString f_header = "CT"; QStringList f_contents{ui_chatname->text(), ui_chatmessage->text()}; - AOPacket *f_packet = new AOPacket(f_header, f_contents); + append_chatmessage("", "Stubbed lmao"); - ao_app->send_ms_packet(f_packet); +// AOPacket *f_packet = new AOPacket(f_header, f_contents); +// ao_app->send_ms_packet(f_packet); ui_chatmessage->clear(); } @@ -537,6 +544,34 @@ void Lobby::list_favorites() ui_server_list->setSortingEnabled(true); } +void Lobby::get_motd() +{ + ao_app->net_manager->request_document(MSDocumentType::Motd, + [this](QString document) { + if (document.isEmpty()) + document = tr("Couldn't get the message of the day."); + bool isHtml = document.startsWith("", Qt::CaseInsensitive); + if (isHtml) { + ui_chatbox->setHtml(document); + } else { + ui_chatbox->setMarkdown(document); + } + }); +} + +void Lobby::check_for_updates() +{ + ao_app->net_manager->request_document(MSDocumentType::ClientVersion, + [this](QString version) { + const QString current_version = ao_app->get_version_string(); + if (!version.isEmpty() && version != current_version) { + ui_version->setText(tr("Version: %1 (!)").arg(current_version)); + ui_version->setToolTip(tr("New version available: %1").arg(version)); + } + }); +} + void Lobby::append_chatmessage(QString f_name, QString f_message) { ui_chatbox->append_chatmessage( diff --git a/src/main.cpp b/src/main.cpp index ef61bca..600f40f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -55,7 +55,7 @@ int main(int argc, char *argv[]) main_app.installTranslator(&appTranslator); main_app.construct_lobby(); - main_app.net_manager->connect_to_master(); + main_app.net_manager->get_server_list(std::bind(&Lobby::list_servers, main_app.w_lobby)); main_app.w_lobby->show(); return main_app.exec(); } diff --git a/src/networkmanager.cpp b/src/networkmanager.cpp index 5e29e21..14c2686 100644 --- a/src/networkmanager.cpp +++ b/src/networkmanager.cpp @@ -4,53 +4,121 @@ #include "debug_functions.h" #include "lobby.h" +#include +#include +#include + NetworkManager::NetworkManager(AOApplication *parent) : QObject(parent) { ao_app = parent; - ms_socket = new QTcpSocket(this); server_socket = new QTcpSocket(this); + http = new QNetworkAccessManager(this); - ms_reconnect_timer = new QTimer(this); - ms_reconnect_timer->setSingleShot(true); - QObject::connect(ms_reconnect_timer, SIGNAL(timeout()), this, - SLOT(retry_ms_connect())); - - QObject::connect(ms_socket, SIGNAL(readyRead()), this, - SLOT(handle_ms_packet())); - QObject::connect(server_socket, SIGNAL(readyRead()), this, + connect(server_socket, SIGNAL(readyRead()), this, SLOT(handle_server_packet())); - QObject::connect(server_socket, SIGNAL(disconnected()), ao_app, + connect(server_socket, SIGNAL(disconnected()), ao_app, SLOT(server_disconnected())); QString master_config = ao_app->configini->value("master", "").value(); - if (master_config != "") - ms_nosrv_hostname = master_config; + if (!master_config.isEmpty()) + ms_baseurl = master_config; } NetworkManager::~NetworkManager() {} -void NetworkManager::connect_to_master() +void NetworkManager::get_server_list(const std::function &cb) { - ms_socket->close(); - ms_socket->abort(); + QNetworkRequest req(QUrl(ms_baseurl + "/servers")); + req.setRawHeader("User-Agent", get_user_agent().toUtf8()); + req.setTransferTimeout(timeout_milliseconds); -#ifdef MS_FAILOVER_SUPPORTED - perform_srv_lookup(); -#else - connect_to_master_nosrv(); -#endif + QNetworkReply *reply = http->get(req); + connect(reply, &QNetworkReply::finished, + this, std::bind(&NetworkManager::ms_request_finished, this, reply, cb)); } -void NetworkManager::connect_to_master_nosrv() +void NetworkManager::ms_request_finished(QNetworkReply *reply, + const std::function &cb) { - QObject::connect(ms_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, - SLOT(on_ms_socket_error(QAbstractSocket::SocketError))); + QJsonDocument json = QJsonDocument::fromJson(reply->readAll()); + if (json.isNull()) { + qCritical().noquote() << "Invalid JSON response from" << reply->url(); + reply->deleteLater(); + return; + } - QObject::connect(ms_socket, SIGNAL(connected()), this, - SLOT(on_ms_nosrv_connect_success())); - ms_socket->connectToHost(ms_nosrv_hostname, ms_port); + qDebug().noquote() << "Got valid response from" << reply->url(); + + QVector server_list; + const auto jsonEntries = json.array(); + for (const auto &entryRef : jsonEntries) { + const auto entry = entryRef.toObject(); + server_type server; + server.ip = entry["ip"].toString(); + server.port = entry["port"].toInt(); + server.name = entry["name"].toString(); + server.desc = entry["description"].toString(tr("No description provided.")); + server_list.append(server); + } + ao_app->set_server_list(server_list); + + cb(); + + reply->deleteLater(); +} + +void NetworkManager::heartbeat_playing() +{ + // Ping the server periodically to tell the MS that you've been playing + // within a 5 minute window, so that the the number of people playing within + // that time period can be counted and an accurate player count be displayed. + // What do I care about your personal information, I really don't want it. + QNetworkRequest req(QUrl(ms_baseurl + "/playing")); + req.setRawHeader("User-Agent", get_user_agent().toUtf8()); + req.setTransferTimeout(timeout_milliseconds); + + http->post(req, QByteArray()); +} + +void NetworkManager::request_document(MSDocumentType document_type, + const std::function &cb) +{ + const QMap endpoints { + // I have to balance an evil with a good + { MSDocumentType::PrivacyPolicy, "/privacy" }, + { MSDocumentType::Motd, "/motd" }, + { MSDocumentType::ClientVersion, "/version" } + }; + + const QString &endpoint = endpoints[document_type]; + QNetworkRequest req(QUrl(ms_baseurl + endpoint)); + req.setRawHeader("User-Agent", get_user_agent().toUtf8()); + + QString language = + ao_app->configini->value("language").toString(); + if (language.trimmed().isEmpty()) + language = QLocale::system().name(); + + req.setRawHeader("Accept-Language", language.toUtf8()); + req.setTransferTimeout(5000); + + qDebug().noquote().nospace() + << "Getting " << endpoint << ", Accept-Language: " << language; + + QNetworkReply *reply = http->get(req); + connect(reply, &QNetworkReply::finished, this, [endpoint, cb, reply] { + QString content = QString::fromUtf8(reply->readAll()); + int http_status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + if (content.isEmpty() || http_status != 200) { + qDebug().noquote().nospace() + << "Failed to get " << endpoint << " (" << reply->errorString() << ") " + << "(http status " << http_status << ")"; + content = QString(); + } cb(content); + reply->deleteLater(); + }); } void NetworkManager::connect_to_server(server_type p_server) @@ -61,154 +129,11 @@ void NetworkManager::connect_to_server(server_type p_server) server_socket->connectToHost(p_server.ip, p_server.port); } -void NetworkManager::ship_ms_packet(QString p_packet) -{ - if (!ms_socket->isOpen()) { - retry_ms_connect(); - } - else { - ms_socket->write(p_packet.toUtf8()); - } -} - void NetworkManager::ship_server_packet(QString p_packet) { server_socket->write(p_packet.toUtf8()); } -void NetworkManager::handle_ms_packet() -{ - QByteArray buffer = ms_socket->readAll(); - QString in_data = QString::fromUtf8(buffer, buffer.size()); - - if (!in_data.endsWith("%")) { - ms_partial_packet = true; - ms_temp_packet += in_data; - return; - } - - else { - if (ms_partial_packet) { - in_data = ms_temp_packet + in_data; - ms_temp_packet = ""; - ms_partial_packet = false; - } - } - - QStringList packet_list = - in_data.split("%", QString::SplitBehavior(QString::SkipEmptyParts)); - - for (QString packet : packet_list) { - AOPacket *f_packet = new AOPacket(packet); - - ao_app->ms_packet_received(f_packet); - } -} - -void NetworkManager::perform_srv_lookup() -{ -#ifdef MS_FAILOVER_SUPPORTED - ms_dns = new QDnsLookup(QDnsLookup::SRV, ms_srv_hostname, this); - - connect(ms_dns, SIGNAL(finished()), this, SLOT(on_srv_lookup())); - ms_dns->lookup(); -#endif -} - -void NetworkManager::on_srv_lookup() -{ -#ifdef MS_FAILOVER_SUPPORTED - bool connected = false; - if (ms_dns->error() != QDnsLookup::NoError) { - qWarning("SRV lookup of the master server DNS failed."); - ms_dns->deleteLater(); - } - else { - const auto srv_records = ms_dns->serviceRecords(); - - for (const QDnsServiceRecord &record : srv_records) { -#ifdef DEBUG_NETWORK - qDebug() << "Connecting to " << record.target() << ":" << record.port(); -#endif - ms_socket->connectToHost(record.target(), record.port()); - QElapsedTimer timer; - timer.start(); - do { - ao_app->processEvents(); - if (ms_socket->state() == QAbstractSocket::ConnectedState) { - connected = true; - break; - } - else if (ms_socket->state() != QAbstractSocket::ConnectingState && - ms_socket->state() != QAbstractSocket::HostLookupState && - ms_socket->error() != -1) { - qDebug() << ms_socket->error(); - qWarning() << "Error connecting to master server:" - << ms_socket->errorString(); - ms_socket->abort(); - ms_socket->close(); - break; - } - } while (timer.elapsed() < - timeout_milliseconds); // Very expensive spin-wait loop - it will - // bring CPU to 100%! - if (connected) { - // Connect a one-shot signal in case the master server disconnects - // randomly - QObject::connect( - ms_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, - SLOT(on_ms_socket_error(QAbstractSocket::SocketError))); - break; - } - else { - ms_socket->abort(); - ms_socket->close(); - } - } - } - - // Failover to non-SRV connection - if (!connected) - connect_to_master_nosrv(); - else - emit ms_connect_finished(connected, false); -#endif -} - -void NetworkManager::on_ms_nosrv_connect_success() -{ - emit ms_connect_finished(true, false); - - QObject::disconnect(ms_socket, SIGNAL(connected()), this, - SLOT(on_ms_nosrv_connect_success())); - - QObject::connect(ms_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, - SLOT(on_ms_socket_error(QAbstractSocket::SocketError))); -} - -void NetworkManager::on_ms_socket_error(QAbstractSocket::SocketError error) -{ - qWarning() << "Master server socket error:" << ms_socket->errorString() << "(" - << error << ")"; - - // Disconnect the one-shot signal - this way, failover connect attempts - // don't trigger a full retry - QObject::disconnect(ms_socket, SIGNAL(error(QAbstractSocket::SocketError)), - this, - SLOT(on_ms_socket_error(QAbstractSocket::SocketError))); - - emit ms_connect_finished(false, true); - - ms_reconnect_timer->start(ms_reconnect_delay * 1000); -} - -void NetworkManager::retry_ms_connect() -{ - if (!ms_reconnect_timer->isActive() && - ms_socket->state() != QAbstractSocket::ConnectingState) - connect_to_master(); -} - void NetworkManager::handle_server_packet() { QByteArray buffer = server_socket->readAll(); @@ -228,10 +153,9 @@ void NetworkManager::handle_server_packet() } } - QStringList packet_list = - in_data.split("%", QString::SplitBehavior(QString::SkipEmptyParts)); + const QStringList packet_list = in_data.split("%", Qt::SkipEmptyParts); - for (QString packet : packet_list) { + for (const QString &packet : packet_list) { AOPacket *f_packet = new AOPacket(packet); ao_app->server_packet_received(f_packet); diff --git a/src/packet_distribution.cpp b/src/packet_distribution.cpp index bcbc667..4419676 100644 --- a/src/packet_distribution.cpp +++ b/src/packet_distribution.cpp @@ -67,8 +67,8 @@ void AOApplication::ms_packet_received(AOPacket *p_packet) } } else if (header == "AO2CHECK") { - send_ms_packet(new AOPacket("ID#AO2#" + get_version_string() + "#%")); - send_ms_packet(new AOPacket("HI#" + get_hdid() + "#%")); +// send_ms_packet(new AOPacket("ID#AO2#" + get_version_string() + "#%")); +// send_ms_packet(new AOPacket("HI#" + get_hdid() + "#%")); if (f_contents.size() < 1) goto end; @@ -718,21 +718,6 @@ end: delete p_packet; } -void AOApplication::send_ms_packet(AOPacket *p_packet) -{ - p_packet->net_encode(); - - QString f_packet = p_packet->to_string(); - - net_manager->ship_ms_packet(f_packet); - -#ifdef DEBUG_NETWORK - qDebug() << "S(ms):" << f_packet; -#endif - - delete p_packet; -} - void AOApplication::send_server_packet(AOPacket *p_packet, bool encoded) { if (encoded) From f1107aeac51658a0525d4231b2f1f39131acbcb5 Mon Sep 17 00:00:00 2001 From: oldmud0 Date: Sat, 18 Dec 2021 20:29:55 -0600 Subject: [PATCH 02/12] Finish out feature - Add periodic timer for heartbeat - Add option to settings for opting out from heartbeat/player metrics - Change base URL to permanent URL --- include/aoapplication.h | 3 +++ include/aooptionsdialog.h | 2 ++ include/networkmanager.h | 6 ++++-- src/aooptionsdialog.cpp | 16 +++++++++++++--- src/main.cpp | 1 + src/networkmanager.cpp | 9 ++++++++- src/text_file_functions.cpp | 6 ++++++ 7 files changed, 37 insertions(+), 6 deletions(-) diff --git a/include/aoapplication.h b/include/aoapplication.h index d0d5121..1cdcbc5 100644 --- a/include/aoapplication.h +++ b/include/aoapplication.h @@ -491,6 +491,9 @@ public: // Get the default scaling method QString get_default_scaling(); + // Get whether to opt out of player count metrics sent to the master server + bool get_player_count_optout(); + // Currently defined subtheme QString subtheme; diff --git a/include/aooptionsdialog.h b/include/aooptionsdialog.h index de1a3b5..d8ef49f 100644 --- a/include/aooptionsdialog.h +++ b/include/aooptionsdialog.h @@ -177,6 +177,8 @@ private: QWidget *ui_privacy_tab; QVBoxLayout *ui_privacy_layout; + QCheckBox *ui_privacy_optout_cb; + QFrame *ui_privacy_separator; QTextBrowser *ui_privacy_policy; bool needs_default_audiodev(); diff --git a/include/networkmanager.h b/include/networkmanager.h index a05c551..ebee481 100644 --- a/include/networkmanager.h +++ b/include/networkmanager.h @@ -28,10 +28,12 @@ public: AOApplication *ao_app; QNetworkAccessManager *http; QTcpSocket *server_socket; + QTimer *heartbeat_timer; - QString ms_baseurl = "https://ms3.oldmud0.workers.dev"; + QString ms_baseurl = "https://servers.aceattorneyonline.com"; const int timeout_milliseconds = 5000; + const int heartbeat_interval = 60 * 5; bool partial_packet = false; QString temp_packet = ""; @@ -47,8 +49,8 @@ public slots: void request_document(MSDocumentType document_type, const std::function &cb); + void send_heartbeat(); private slots: - void heartbeat_playing(); void ms_request_finished(QNetworkReply *reply, const std::function &cb); diff --git a/src/aooptionsdialog.cpp b/src/aooptionsdialog.cpp index f3ca768..eb0a3b5 100644 --- a/src/aooptionsdialog.cpp +++ b/src/aooptionsdialog.cpp @@ -908,7 +908,16 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app) ui_settings_tabs->addTab(ui_privacy_tab, tr("Privacy")); ui_privacy_layout = new QVBoxLayout(ui_privacy_tab); - ui_privacy_layout->setContentsMargins(0, 0, 0, 0); + + ui_privacy_optout_cb = new QCheckBox(ui_privacy_tab); + ui_privacy_optout_cb->setText(tr("Do not include me in public player counts")); + ui_privacy_layout->addWidget(ui_privacy_optout_cb); + + ui_privacy_separator = new QFrame(ui_privacy_tab); + ui_privacy_separator->setObjectName(QString::fromUtf8("line")); + ui_privacy_separator->setFrameShape(QFrame::HLine); + ui_privacy_separator->setFrameShadow(QFrame::Sunken); + ui_privacy_layout->addWidget(ui_privacy_separator); ui_privacy_policy = new QTextBrowser(ui_privacy_tab); QSizePolicy privacySizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); @@ -993,6 +1002,7 @@ void AOOptionsDialog::update_values() { ui_blips_volume_spinbox->setValue(ao_app->get_default_blip()); ui_bliprate_spinbox->setValue(ao_app->read_blip_rate()); ui_default_showname_textbox->setText(ao_app->get_default_showname()); + ui_privacy_optout_cb->setChecked(ao_app->get_player_count_optout()); ao_app->net_manager->request_document(MSDocumentType::PrivacyPolicy, [this](QString document) { if (document.isEmpty()) @@ -1079,11 +1089,11 @@ void AOOptionsDialog::save_pressed() configini->setValue("casing_can_host_cases", ui_casing_cm_cases_textbox->text()); + configini->setValue("player_count_optout", ui_privacy_optout_cb->isChecked()); + if (audioChanged) ao_app->initBASS(); - callwordsini->close(); - // We most probably pressed "Restore defaults" at some point. Since we're saving our settings, remove the temporary file. if (QFile::exists(ao_app->get_base_path() + "config.temp")) QFile::remove(ao_app->get_base_path() + "config.temp"); diff --git a/src/main.cpp b/src/main.cpp index 600f40f..e6e977c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -56,6 +56,7 @@ int main(int argc, char *argv[]) main_app.construct_lobby(); main_app.net_manager->get_server_list(std::bind(&Lobby::list_servers, main_app.w_lobby)); + main_app.net_manager->send_heartbeat(); main_app.w_lobby->show(); return main_app.exec(); } diff --git a/src/networkmanager.cpp b/src/networkmanager.cpp index 14c2686..f886c76 100644 --- a/src/networkmanager.cpp +++ b/src/networkmanager.cpp @@ -14,6 +14,7 @@ NetworkManager::NetworkManager(AOApplication *parent) : QObject(parent) server_socket = new QTcpSocket(this); http = new QNetworkAccessManager(this); + heartbeat_timer = new QTimer(this); connect(server_socket, SIGNAL(readyRead()), this, SLOT(handle_server_packet())); @@ -24,6 +25,9 @@ NetworkManager::NetworkManager(AOApplication *parent) : QObject(parent) ao_app->configini->value("master", "").value(); if (!master_config.isEmpty()) ms_baseurl = master_config; + + connect(heartbeat_timer, &QTimer::timeout, this, &NetworkManager::send_heartbeat); + heartbeat_timer->start(heartbeat_interval); } NetworkManager::~NetworkManager() {} @@ -69,12 +73,15 @@ void NetworkManager::ms_request_finished(QNetworkReply *reply, reply->deleteLater(); } -void NetworkManager::heartbeat_playing() +void NetworkManager::send_heartbeat() { // Ping the server periodically to tell the MS that you've been playing // within a 5 minute window, so that the the number of people playing within // that time period can be counted and an accurate player count be displayed. // What do I care about your personal information, I really don't want it. + if (ao_app->get_player_count_optout()) + return; + QNetworkRequest req(QUrl(ms_baseurl + "/playing")); req.setRawHeader("User-Agent", get_user_agent().toUtf8()); req.setTransferTimeout(timeout_milliseconds); diff --git a/src/text_file_functions.cpp b/src/text_file_functions.cpp index 1d36689..d0bebbb 100644 --- a/src/text_file_functions.cpp +++ b/src/text_file_functions.cpp @@ -1095,3 +1095,9 @@ QString AOApplication::get_default_scaling() { return configini->value("default_scaling", "fast").value(); } + +bool AOApplication::get_player_count_optout() +{ + return configini->value("player_count_optout", "false").value() + .startsWith("true"); +} From 133b3b58d976b8b923c2611b2b1177e25450147c Mon Sep 17 00:00:00 2001 From: oldmud0 Date: Sat, 18 Dec 2021 21:40:11 -0600 Subject: [PATCH 03/12] Remove markdown thing --- src/aooptionsdialog.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/aooptionsdialog.cpp b/src/aooptionsdialog.cpp index eb0a3b5..03c7334 100644 --- a/src/aooptionsdialog.cpp +++ b/src/aooptionsdialog.cpp @@ -1005,15 +1005,10 @@ void AOOptionsDialog::update_values() { ui_privacy_optout_cb->setChecked(ao_app->get_player_count_optout()); ao_app->net_manager->request_document(MSDocumentType::PrivacyPolicy, [this](QString document) { - if (document.isEmpty()) + if (document.isEmpty()) { document = tr("Couldn't get the privacy policy."); - bool isHtml = document.startsWith("", Qt::CaseInsensitive); - if (isHtml) { - ui_privacy_policy->setHtml(document); - } else { - ui_privacy_policy->setMarkdown(document); } + ui_privacy_policy->setHtml(document); }); } From d1370221742b2accf2cd8bfc129ca72c2ca09595 Mon Sep 17 00:00:00 2001 From: oldmud0 Date: Sat, 18 Dec 2021 22:02:30 -0600 Subject: [PATCH 04/12] Remove another markdown thing --- src/lobby.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/lobby.cpp b/src/lobby.cpp index feb922c..ad4ebb7 100644 --- a/src/lobby.cpp +++ b/src/lobby.cpp @@ -548,15 +548,10 @@ void Lobby::get_motd() { ao_app->net_manager->request_document(MSDocumentType::Motd, [this](QString document) { - if (document.isEmpty()) + if (document.isEmpty()) { document = tr("Couldn't get the message of the day."); - bool isHtml = document.startsWith("", Qt::CaseInsensitive); - if (isHtml) { - ui_chatbox->setHtml(document); - } else { - ui_chatbox->setMarkdown(document); } + ui_chatbox->setHtml(document); }); } From cf12168ebd426d7658d7f7021c47be519caa215a Mon Sep 17 00:00:00 2001 From: oldmud0 Date: Sat, 18 Dec 2021 22:22:30 -0600 Subject: [PATCH 05/12] Qt 5.9 compat; remove dead code --- include/networkmanager.h | 1 - src/aoapplication.cpp | 29 ----------------------------- src/courtroom.cpp | 3 --- src/lobby.cpp | 8 -------- src/networkmanager.cpp | 5 +---- src/packet_distribution.cpp | 3 --- 6 files changed, 1 insertion(+), 48 deletions(-) diff --git a/include/networkmanager.h b/include/networkmanager.h index ebee481..2e61291 100644 --- a/include/networkmanager.h +++ b/include/networkmanager.h @@ -32,7 +32,6 @@ public: QString ms_baseurl = "https://servers.aceattorneyonline.com"; - const int timeout_milliseconds = 5000; const int heartbeat_interval = 60 * 5; bool partial_packet = false; diff --git a/src/aoapplication.cpp b/src/aoapplication.cpp index 82635ab..a870156 100644 --- a/src/aoapplication.cpp +++ b/src/aoapplication.cpp @@ -151,35 +151,6 @@ void AOApplication::loading_cancelled() w_lobby->hide_loading_overlay(); } -/* -void AOApplication::ms_connect_finished(bool connected, bool will_retry) -{ - if (connected) { - AOPacket *f_packet = new AOPacket("ALL#%"); - send_ms_packet(f_packet); - } - else { - if (will_retry) { - if (lobby_constructed) - w_lobby->append_error( - tr("Error connecting to master server. Will try again in %1 " - "seconds.") - .arg(QString::number(net_manager->ms_reconnect_delay))); - } - else { - call_error(tr("There was an error connecting to the master server.\n" - "We deploy multiple master servers to mitigate any " - "possible downtime, " - "but the client appears to have exhausted all possible " - "methods of finding " - "and connecting to one.\n" - "Please check your Internet connection and firewall, and " - "please try again.")); - } - } -} -*/ - void AOApplication::call_settings_menu() { AOOptionsDialog settings(nullptr, this); diff --git a/src/courtroom.cpp b/src/courtroom.cpp index a4bbb13..f551c9e 100644 --- a/src/courtroom.cpp +++ b/src/courtroom.cpp @@ -4307,9 +4307,6 @@ void Courtroom::on_ooc_return_pressed() if (server_ooc) ao_app->send_server_packet(f_packet); - else { - // ao_app->send_ms_packet(f_packet); - } ui_ooc_chat_message->clear(); diff --git a/src/lobby.cpp b/src/lobby.cpp index ad4ebb7..5c3ff11 100644 --- a/src/lobby.cpp +++ b/src/lobby.cpp @@ -495,14 +495,6 @@ void Lobby::on_chatfield_return_pressed() if (ui_chatname->text() == "" || ui_chatmessage->text() == "") return; - QString f_header = "CT"; - QStringList f_contents{ui_chatname->text(), ui_chatmessage->text()}; - - append_chatmessage("", "Stubbed lmao"); - -// AOPacket *f_packet = new AOPacket(f_header, f_contents); -// ao_app->send_ms_packet(f_packet); - ui_chatmessage->clear(); } diff --git a/src/networkmanager.cpp b/src/networkmanager.cpp index f886c76..89a9bff 100644 --- a/src/networkmanager.cpp +++ b/src/networkmanager.cpp @@ -36,7 +36,6 @@ void NetworkManager::get_server_list(const std::function &cb) { QNetworkRequest req(QUrl(ms_baseurl + "/servers")); req.setRawHeader("User-Agent", get_user_agent().toUtf8()); - req.setTransferTimeout(timeout_milliseconds); QNetworkReply *reply = http->get(req); connect(reply, &QNetworkReply::finished, @@ -84,7 +83,6 @@ void NetworkManager::send_heartbeat() QNetworkRequest req(QUrl(ms_baseurl + "/playing")); req.setRawHeader("User-Agent", get_user_agent().toUtf8()); - req.setTransferTimeout(timeout_milliseconds); http->post(req, QByteArray()); } @@ -109,7 +107,6 @@ void NetworkManager::request_document(MSDocumentType document_type, language = QLocale::system().name(); req.setRawHeader("Accept-Language", language.toUtf8()); - req.setTransferTimeout(5000); qDebug().noquote().nospace() << "Getting " << endpoint << ", Accept-Language: " << language; @@ -160,7 +157,7 @@ void NetworkManager::handle_server_packet() } } - const QStringList packet_list = in_data.split("%", Qt::SkipEmptyParts); + const QStringList packet_list = in_data.split("%", QString::SkipEmptyParts); for (const QString &packet : packet_list) { AOPacket *f_packet = new AOPacket(packet); diff --git a/src/packet_distribution.cpp b/src/packet_distribution.cpp index 4419676..37f58c8 100644 --- a/src/packet_distribution.cpp +++ b/src/packet_distribution.cpp @@ -67,9 +67,6 @@ void AOApplication::ms_packet_received(AOPacket *p_packet) } } else if (header == "AO2CHECK") { -// send_ms_packet(new AOPacket("ID#AO2#" + get_version_string() + "#%")); -// send_ms_packet(new AOPacket("HI#" + get_hdid() + "#%")); - if (f_contents.size() < 1) goto end; From ecfb791e483234308b1edacb87e499860a63e510 Mon Sep 17 00:00:00 2001 From: oldmud0 Date: Sat, 18 Dec 2021 22:41:45 -0600 Subject: [PATCH 06/12] Roll back unintended changes --- src/aoapplication.cpp | 1 - src/aooptionsdialog.cpp | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/aoapplication.cpp b/src/aoapplication.cpp index f516be3..3d37c32 100644 --- a/src/aoapplication.cpp +++ b/src/aoapplication.cpp @@ -16,7 +16,6 @@ AOApplication::AOApplication(int &argc, char **argv) : QApplication(argc, argv) net_manager = new NetworkManager(this); discord = new AttorneyOnline::Discord(); - qApp->setStyleSheet("QFrame {background-color:transparent;} QAbstractItemView {background-color: transparent; color: black;}; QLineEdit {background-color:transparent;}"); asset_lookup_cache.reserve(2048); } diff --git a/src/aooptionsdialog.cpp b/src/aooptionsdialog.cpp index 54a11e1..7413db3 100644 --- a/src/aooptionsdialog.cpp +++ b/src/aooptionsdialog.cpp @@ -1255,12 +1255,12 @@ void AOOptionsDialog::save_pressed() mountPaths.append(ui_mount_list->item(i)->text()); configini->setValue("mount_paths", mountPaths); - if (asset_cache_dirty) - ao_app->invalidate_lookup_cache(); - if (audioChanged) ao_app->initBASS(); + if (asset_cache_dirty) + ao_app->invalidate_lookup_cache(); + // We most probably pressed "Restore defaults" at some point. Since we're saving our settings, remove the temporary file. if (QFile::exists(ao_app->get_base_path() + "config.temp")) QFile::remove(ao_app->get_base_path() + "config.temp"); From 5d79a83fb5a0f322271e5e3d6c37a8782d42a61a Mon Sep 17 00:00:00 2001 From: oldmud0 Date: Thu, 30 Dec 2021 21:26:28 -0600 Subject: [PATCH 07/12] Prevent old/bad "backup MS" values from preventing connection --- include/networkmanager.h | 7 ++++--- src/aooptionsdialog.cpp | 5 ++--- src/networkmanager.cpp | 12 ++++++++---- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/include/networkmanager.h b/include/networkmanager.h index 2e61291..1e1a60b 100644 --- a/include/networkmanager.h +++ b/include/networkmanager.h @@ -22,15 +22,16 @@ class NetworkManager : public QObject { Q_OBJECT public: - NetworkManager(AOApplication *parent); - ~NetworkManager(); + explicit NetworkManager(AOApplication *parent); + ~NetworkManager() = default; AOApplication *ao_app; QNetworkAccessManager *http; QTcpSocket *server_socket; QTimer *heartbeat_timer; - QString ms_baseurl = "https://servers.aceattorneyonline.com"; + const QString DEFAULT_MS_BASEURL = "https://servers.aceattorneyonline.com"; + QString ms_baseurl = DEFAULT_MS_BASEURL; const int heartbeat_interval = 60 * 5; diff --git a/src/aooptionsdialog.cpp b/src/aooptionsdialog.cpp index 5fd80b7..589bc92 100644 --- a/src/aooptionsdialog.cpp +++ b/src/aooptionsdialog.cpp @@ -382,10 +382,9 @@ AOOptionsDialog::AOOptionsDialog(QWidget *parent, AOApplication *p_ao_app) row += 1; ui_ms_lbl = new QLabel(ui_form_layout_widget); - ui_ms_lbl->setText(tr("Backup MS:")); + ui_ms_lbl->setText(tr("Alternate Server List:")); ui_ms_lbl->setToolTip( - tr("If the built-in server lookups fail, the game will try the " - "address given here and use it as a backup master server address.")); + tr("Overrides the base URL to retrieve server information from.")); ui_gameplay_form->setWidget(row, QFormLayout::LabelRole, ui_ms_lbl); diff --git a/src/networkmanager.cpp b/src/networkmanager.cpp index c1e8480..4c82385 100644 --- a/src/networkmanager.cpp +++ b/src/networkmanager.cpp @@ -23,15 +23,15 @@ NetworkManager::NetworkManager(AOApplication *parent) : QObject(parent) QString master_config = ao_app->configini->value("master", "").value(); - if (!master_config.isEmpty()) + if (!master_config.isEmpty() && QUrl(master_config).scheme().startsWith("http")) { + qInfo() << "using alternate master server" << master_config; ms_baseurl = master_config; + } connect(heartbeat_timer, &QTimer::timeout, this, &NetworkManager::send_heartbeat); heartbeat_timer->start(heartbeat_interval); } -NetworkManager::~NetworkManager() {} - void NetworkManager::get_server_list(const std::function &cb) { QNetworkRequest req(QUrl(ms_baseurl + "/servers")); @@ -120,7 +120,8 @@ void NetworkManager::request_document(MSDocumentType document_type, << "Failed to get " << endpoint << " (" << reply->errorString() << ") " << "(http status " << http_status << ")"; content = QString(); - } cb(content); + } + cb(content); reply->deleteLater(); }); } @@ -130,6 +131,9 @@ void NetworkManager::connect_to_server(server_type p_server) server_socket->close(); server_socket->abort(); + qInfo().nospace().noquote() << "connecting to " << p_server.ip << ":" + << p_server.port; + server_socket->connectToHost(p_server.ip, p_server.port); } From 8822db8e828b9d5fbb4f21124b5fb41d1acdeb55 Mon Sep 17 00:00:00 2001 From: oldmud0 Date: Thu, 30 Dec 2021 21:46:24 -0600 Subject: [PATCH 08/12] Remove lobby chat Goodbye, lobby chat :( --- include/lobby.h | 4 ---- src/lobby.cpp | 23 ----------------------- 2 files changed, 27 deletions(-) diff --git a/include/lobby.h b/include/lobby.h index 8083249..61c93c5 100644 --- a/include/lobby.h +++ b/include/lobby.h @@ -78,9 +78,6 @@ private: AOTextArea *ui_chatbox; - QLineEdit *ui_chatname; - QLineEdit *ui_chatmessage; - AOImage *ui_loading_background; QTextEdit *ui_loading_text; QProgressBar *ui_progress_bar; @@ -105,7 +102,6 @@ private slots: void on_server_list_clicked(QTreeWidgetItem *p_item, int column); void on_server_list_doubleclicked(QTreeWidgetItem *p_item, int column); void on_server_search_edited(QString p_text); - void on_chatfield_return_pressed(); }; #endif // LOBBY_H diff --git a/src/lobby.cpp b/src/lobby.cpp index 4449603..b3371e6 100644 --- a/src/lobby.cpp +++ b/src/lobby.cpp @@ -59,12 +59,6 @@ Lobby::Lobby(AOApplication *p_ao_app) : QMainWindow() ui_chatbox = new AOTextArea(this); ui_chatbox->setOpenExternalLinks(true); ui_chatbox->setObjectName("ui_chatbox"); - ui_chatname = new QLineEdit(this); - ui_chatname->setPlaceholderText(tr("Name")); - ui_chatname->setText(ao_app->get_ooc_name()); - ui_chatname->setObjectName("ui_chatname"); - ui_chatmessage = new QLineEdit(this); - ui_chatmessage->setObjectName("ui_chatmessage"); ui_loading_background = new AOImage(this, ao_app); ui_loading_background->setObjectName("ui_loading_background"); ui_loading_text = new QTextEdit(ui_loading_background); @@ -95,8 +89,6 @@ Lobby::Lobby(AOApplication *p_ao_app) : QMainWindow() this, &Lobby::on_server_list_doubleclicked); connect(ui_server_search, &QLineEdit::textChanged, this, &Lobby::on_server_search_edited); - connect(ui_chatmessage, &QLineEdit::returnPressed, this, - &Lobby::on_chatfield_return_pressed); connect(ui_cancel, &AOButton::clicked, ao_app, &AOApplication::loading_cancelled); ui_connect->setEnabled(false); @@ -175,10 +167,6 @@ void Lobby::set_widgets() set_size_and_pos(ui_chatbox, "chatbox"); ui_chatbox->setReadOnly(true); - set_size_and_pos(ui_chatname, "chatname"); - - set_size_and_pos(ui_chatmessage, "chatmessage"); - ui_loading_background->resize(this->width(), this->height()); ui_loading_background->set_image("loadingbackground"); @@ -221,8 +209,6 @@ void Lobby::set_fonts() set_font(ui_player_count, "player_count"); set_font(ui_description, "description"); set_font(ui_chatbox, "chatbox"); - set_font(ui_chatname, "chatname"); - set_font(ui_chatmessage, "chatmessage"); set_font(ui_loading_text, "loading_text"); set_font(ui_server_list, "server_list"); } @@ -496,15 +482,6 @@ void Lobby::on_server_search_edited(QString p_text) } } -void Lobby::on_chatfield_return_pressed() -{ - // no you can't send empty messages - if (ui_chatname->text() == "" || ui_chatmessage->text() == "") - return; - - ui_chatmessage->clear(); -} - void Lobby::list_servers() { public_servers_selected = true; From e29a41b58ffdcaaa8dc7d73c7d8e7b6674f4f51a Mon Sep 17 00:00:00 2001 From: oldmud0 Date: Thu, 30 Dec 2021 21:47:35 -0600 Subject: [PATCH 09/12] Remove AO1 MS code You won't be missed :') --- include/aoapplication.h | 1 - src/packet_distribution.cpp | 97 ------------------------------------- 2 files changed, 98 deletions(-) diff --git a/include/aoapplication.h b/include/aoapplication.h index 1102ffd..c094a33 100644 --- a/include/aoapplication.h +++ b/include/aoapplication.h @@ -75,7 +75,6 @@ public: void construct_courtroom(); void destruct_courtroom(); - void ms_packet_received(AOPacket *p_packet); void server_packet_received(AOPacket *p_packet); void send_server_packet(AOPacket *p_packet, bool encoded = true); diff --git a/src/packet_distribution.cpp b/src/packet_distribution.cpp index 9b56fae..26abf96 100644 --- a/src/packet_distribution.cpp +++ b/src/packet_distribution.cpp @@ -6,103 +6,6 @@ #include "lobby.h" #include "networkmanager.h" -void AOApplication::ms_packet_received(AOPacket *p_packet) -{ - QString header = p_packet->get_header(); - - // Some packets need to handle decode/encode separately - if (header != "SC") { - p_packet->net_decode(); - } - QStringList f_contents = p_packet->get_contents(); - -#ifdef DEBUG_NETWORK - if (header != "CHECK") - qDebug() << "R(ms):" << p_packet->to_string(); -#endif - - if (header == "ALL") { - server_list.clear(); - - for (QString i_string : p_packet->get_contents()) { - server_type f_server; - QStringList sub_contents = i_string.split("&"); - - if (sub_contents.size() < 4) { - qWarning() << "malformed packet"; - continue; - } - - f_server.name = sub_contents.at(0); - f_server.desc = sub_contents.at(1); - f_server.ip = sub_contents.at(2); - f_server.port = sub_contents.at(3).toInt(); - - server_list.append(f_server); - } - - if (lobby_constructed) { - w_lobby->list_servers(); - } - } - else if (header == "CT") { - QString f_name, f_message; - - if (f_contents.size() == 1) { - f_name = ""; - f_message = f_contents.at(0); - } - else if (f_contents.size() >= 2) { - f_name = f_contents.at(0); - f_message = f_contents.at(1); - } - else - goto end; - - if (lobby_constructed) { - w_lobby->append_chatmessage(f_name, f_message); - } - if (courtroom_constructed && courtroom_loaded) { - w_courtroom->append_server_chatmessage(tr("[Global] %1").arg(f_name), - f_message, "0"); - } - } - else if (header == "AO2CHECK") { - if (f_contents.size() < 1) - goto end; - - QStringList version_contents = f_contents.at(0).split("."); - - if (version_contents.size() < 3) - goto end; - - int f_release = version_contents.at(0).toInt(); - int f_major = version_contents.at(1).toInt(); - int f_minor = version_contents.at(2).toInt(); - - if (get_release() > f_release) - goto end; - else if (get_release() == f_release) { - if (get_major_version() > f_major) - goto end; - else if (get_major_version() == f_major) { - if (get_minor_version() >= f_minor) - goto end; - } - } - - call_notice(tr("Outdated version! Your version: %1\n" - "Please go to aceattorneyonline.com to update.") - .arg(get_version_string())); - destruct_courtroom(); - destruct_lobby(); - } - -end: - - delete p_packet; -} - void AOApplication::append_to_demofile(QString packet_string) { if (get_demo_logging_enabled() && !log_filename.isEmpty()) From 5adf775b4de0a3aed839450b2dbb4294333766ea Mon Sep 17 00:00:00 2001 From: oldmud0 Date: Thu, 30 Dec 2021 21:48:29 -0600 Subject: [PATCH 10/12] Update submodule ref --- base/themes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/themes b/base/themes index 0d8220b..c69f571 160000 --- a/base/themes +++ b/base/themes @@ -1 +1 @@ -Subproject commit 0d8220b1912e841ecaaa8f47198c8406e41fb5b4 +Subproject commit c69f571be736bec41bd08d6117c84979abec5c66 From 7b4d1e96c67d506fbbf765344f6cbe8eac1a7c50 Mon Sep 17 00:00:00 2001 From: oldmud0 Date: Fri, 31 Dec 2021 10:40:21 -0600 Subject: [PATCH 11/12] Disambiguate settings with lobby_settings and courtroom_settings --- src/courtroom.cpp | 2 +- src/lobby.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/courtroom.cpp b/src/courtroom.cpp index 1f8b3da..e4ab3ba 100644 --- a/src/courtroom.cpp +++ b/src/courtroom.cpp @@ -981,7 +981,7 @@ void Courtroom::set_widgets() set_size_and_pos(ui_settings, "settings"); ui_settings->setText(tr("Settings")); - ui_settings->set_image("settings"); + ui_settings->set_image("courtroom_settings"); ui_settings->setToolTip( tr("Allows you to change various aspects of the client.")); diff --git a/src/lobby.cpp b/src/lobby.cpp index b3371e6..44d483c 100644 --- a/src/lobby.cpp +++ b/src/lobby.cpp @@ -150,7 +150,7 @@ void Lobby::set_widgets() set_size_and_pos(ui_settings, "settings"); ui_settings->setText(tr("Settings")); - ui_settings->set_image("settings"); + ui_settings->set_image("lobby_settings"); ui_settings->setToolTip( tr("Allows you to change various aspects of the client.")); From 0cebf8c91e80d45b9fbaaa658ce5657c933f0b69 Mon Sep 17 00:00:00 2001 From: oldmud0 Date: Fri, 31 Dec 2021 10:40:34 -0600 Subject: [PATCH 12/12] Update submodule ref --- base/themes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/themes b/base/themes index c69f571..6fff460 160000 --- a/base/themes +++ b/base/themes @@ -1 +1 @@ -Subproject commit c69f571be736bec41bd08d6117c84979abec5c66 +Subproject commit 6fff4608360e91d86edac28c42c546ee31739f97