From b306929311f04dced4e5c0d9c55509df0553bfb1 Mon Sep 17 00:00:00 2001 From: TrickyLeifa Date: Fri, 17 May 2024 19:44:37 +0200 Subject: [PATCH] Resolved merge conflicts. This comment format is just tiring for the eyes. Imagine being on 1080p and not being able to read more than 5 method definitions due to comments. --- CMakeLists.txt | 2 + src/courtroom.cpp | 174 ++++++++++++------------ src/packet_distribution.cpp | 88 ++++++------ src/serverdata.cpp | 65 ++++----- src/serverdata.h | 257 ++++++++++++++++++------------------ 5 files changed, 302 insertions(+), 284 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f3684f1..d482a5c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -91,6 +91,8 @@ add_executable(Attorney_Online src/path_functions.cpp src/scrolltext.cpp src/scrolltext.h + src/serverdata.cpp + src/serverdata.h src/text_file_functions.cpp src/widgets/aooptionsdialog.cpp src/widgets/aooptionsdialog.h diff --git a/src/courtroom.cpp b/src/courtroom.cpp index 7c766cc..94f6af5 100644 --- a/src/courtroom.cpp +++ b/src/courtroom.cpp @@ -727,8 +727,8 @@ void Courtroom::set_widgets() // If there is a point to it, show all CCCC features. // We also do this this soon so that set_size_and_pos can hide them all later, // if needed. - if (ao_app->m_serverdata.get_feature( - server::BASE_FEATURE_SET::CCCC_IC_SUPPORT)) { + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::CCCC_IC_SUPPORT)) + { ui_pair_button->show(); ui_immediate->show(); ui_showname_enable->show(); @@ -1574,8 +1574,7 @@ void Courtroom::update_character(int p_cid, QString char_name, bool reset_emote) } ui_custom_objection->hide(); - if (ao_app->m_serverdata.get_feature( - server::BASE_FEATURE_SET::CUSTOMOBJECTIONS)) // if setting is enabled + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::CUSTOMOBJECTIONS)) // if setting is enabled { custom_obj_menu->clear(); custom_objections_list.clear(); @@ -1650,6 +1649,7 @@ void Courtroom::enter_courtroom() set_evidence_page(); if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::FLIPPING)) + { ui_flip->show(); } else @@ -1658,6 +1658,7 @@ void Courtroom::enter_courtroom() } if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::ADDITIVE)) + { ui_additive->show(); } else @@ -1754,7 +1755,6 @@ void Courtroom::list_music() { parent = treeItem; } - ++n_listed_songs; } ui_music_list->expandAll(); // Needs to somehow remember which categories were @@ -1776,7 +1776,8 @@ void Courtroom::list_areas() QString i_area; i_area.append(area_list.at(n_area)); - if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::ARUP)) { + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::ARUP)) + { i_area.append("\n "); i_area.append(arup_statuses.at(n_area)); @@ -1806,7 +1807,8 @@ void Courtroom::list_areas() treeItem->setText(0, area_list.at(n_area)); treeItem->setText(1, i_area); - if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::ARUP)) { + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::ARUP)) + { // Coloring logic here. treeItem->setBackground(1, free_brush); if (arup_locks.at(n_area) == "LOCKED") @@ -1873,12 +1875,11 @@ void Courtroom::append_server_chatmessage(QString p_name, QString p_message, QSt color = ao_app->get_color("ms_chatlog_sender_color", "courtroom_fonts.ini").name(); } if (p_color == "1") - {color = - ao_app->get_color("server_chatlog_sender_color", "courtroom_fonts.ini") - .name();} - if (!ao_app->m_serverdata.get_feature( - server::BASE_FEATURE_SET::AUTH_PACKET) && - p_message == "Logged in as a moderator.") { + { + color = ao_app->get_color("server_chatlog_sender_color", "courtroom_fonts.ini").name(); + } + if (!ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::AUTH_PACKET) && p_message == "Logged in as a moderator.") + { // Emulate successful authentication on_authentication_state_received(1); } @@ -1974,10 +1975,12 @@ void Courtroom::on_chat_return_pressed() int f_desk_mod = DESK_SHOW; - if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::DESKMOD)) { - f_desk_mod = ao_app->get_desk_mod(current_char, current_emote);{} - if (!ao_app->m_serverdata.get_feature( - server::BASE_FEATURE_SET::EXPANDED_DESK_MODS)) { + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::DESKMOD)) + { + f_desk_mod = ao_app->get_desk_mod(current_char, current_emote); + {} + if (!ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::EXPANDED_DESK_MODS)) + { if (f_desk_mod == DESK_PRE_ONLY_EX || f_desk_mod == DESK_PRE_ONLY) { f_desk_mod = DESK_HIDE; @@ -2028,8 +2031,8 @@ void Courtroom::on_chat_return_pressed() f_emote_mod = PREANIM; } // Turn zoom into preanim zoom - else if (f_emote_mod == ZOOM && ao_app->m_serverdata.get_feature( - server::BASE_FEATURE_SET::PREZOOM)) { + else if (f_emote_mod == ZOOM && ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::PREZOOM)) + { f_emote_mod = PREANIM_ZOOM; } // Play the sfx @@ -2091,10 +2094,8 @@ void Courtroom::on_chat_return_pressed() QString f_obj_state; - if ((objection_state == 4 && - !ao_app->m_serverdata.get_feature( - server::BASE_FEATURE_SET::CUSTOMOBJECTIONS)) || - (objection_state < 0)) { + if ((objection_state == 4 && !ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::CUSTOMOBJECTIONS)) || (objection_state < 0)) + { f_obj_state = "0"; } else if (objection_custom != "" && objection_state == 4) @@ -2128,7 +2129,8 @@ void Courtroom::on_chat_return_pressed() QString f_flip; - if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::FLIPPING)) { + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::FLIPPING)) + { if (ui_flip->isChecked()) { f_flip = "1"; @@ -2165,11 +2167,12 @@ void Courtroom::on_chat_return_pressed() packet_contents.append(f_text_color); // If the server we're on supports CCCC stuff, we should use it! - if (ao_app->m_serverdata.get_feature( - server::BASE_FEATURE_SET::CCCC_IC_SUPPORT)) { + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::CCCC_IC_SUPPORT)) + { // If there is a showname entered, use that -- else, just send an empty // packet-part. - if (!ui_ic_chat_name->text().isEmpty()) { + if (!ui_ic_chat_name->text().isEmpty()) + { packet_contents.append(ui_ic_chat_name->text()); } else @@ -2182,11 +2185,10 @@ void Courtroom::on_chat_return_pressed() if (other_charid > -1 && other_charid != m_cid) { QString packet = QString::number(other_charid); - if (ao_app->m_serverdata.get_feature( - server::BASE_FEATURE_SET::EFFECTS)) // Only servers with effects - // enabled will support pair - // reordering - { + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::EFFECTS)) // Only servers with effects + // enabled will support pair + // reordering + { packet += "^" + QString::number(pair_order); } packet_contents.append(packet); @@ -2196,9 +2198,10 @@ void Courtroom::on_chat_return_pressed() packet_contents.append("-1"); } // Send the offset as it's gonna be used regardless - if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::Y_OFFSET)){ - packet_contents.append(QString::number(char_offset) + "&" + - QString::number(char_vert_offset));} + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::Y_OFFSET)) + { + packet_contents.append(QString::number(char_offset) + "&" + QString::number(char_vert_offset)); + } else { packet_contents.append(QString::number(char_offset)); @@ -2217,9 +2220,9 @@ void Courtroom::on_chat_return_pressed() // If the server we're on supports Looping SFX and Screenshake, use it if the // emote uses it. - if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::LOOPING_SFX)) { - packet_contents.append( - ao_app->get_sfx_looping(current_char, current_emote)); + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::LOOPING_SFX)) + { + packet_contents.append(ao_app->get_sfx_looping(current_char, current_emote)); packet_contents.append(QString::number(screenshake_state)); QString pre_emote = ao_app->get_pre_emote(current_char, current_emote); @@ -2247,14 +2250,14 @@ void Courtroom::on_chat_return_pressed() } } - if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::ADDITIVE)) { + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::ADDITIVE)) + { packet_contents.append(ui_additive->isChecked() ? "1" : "0"); } - if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::EFFECTS)) { - QString p_effect_folder = - ao_app->read_char_ini(current_char, "effects", "Options"); - QString fx_sound = - ao_app->get_effect_property(effect, current_char, p_effect_folder, "sound"); + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::EFFECTS)) + { + QString p_effect_folder = ao_app->read_char_ini(current_char, "effects", "Options"); + QString fx_sound = ao_app->get_effect_property(effect, current_char, p_effect_folder, "sound"); // Don't overlap the two sfx if (!ui_pre->isChecked() && (!custom_sfx.isEmpty() || ui_sfx_dropdown->currentIndex() == 1)) @@ -2434,10 +2437,8 @@ void Courtroom::unpack_chatmessage(QStringList p_contents) // amongst the packet's content. We also have to check if the server even // supports CCCC's IC features, or if it's just japing us. Also, don't // forget! A size 15 message will have indices from 0 to 14. - if (n_string < p_contents.size() && - (n_string < MS_MINIMUM || - ao_app->m_serverdata.get_feature( - server::BASE_FEATURE_SET::CCCC_IC_SUPPORT))) { + if (n_string < p_contents.size() && (n_string < MS_MINIMUM || ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::CCCC_IC_SUPPORT))) + { m_chatmessage[n_string] = p_contents.at(n_string); } else @@ -2794,9 +2795,8 @@ void Courtroom::display_pair_character(QString other_charid, QString other_offse } } // Flip the pair character - if (ao_app->m_serverdata.get_feature( - server::BASE_FEATURE_SET::FLIPPING) && - m_chatmessage[OTHER_FLIP].toInt() == 1){ + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::FLIPPING) && m_chatmessage[OTHER_FLIP].toInt() == 1) + { ui_vp_sideplayer_char->set_flipped(true); } else @@ -4004,9 +4004,8 @@ void Courtroom::start_chat_ticking() QString f_blips = ao_app->get_blipname(m_chatmessage[CHAR_NAME]); f_blips = ao_app->get_blips(f_blips); - if (ao_app->m_serverdata.get_feature( - server::BASE_FEATURE_SET::CUSTOM_BLIPS) && - !m_chatmessage[BLIPNAME].isEmpty()) { + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::CUSTOM_BLIPS) && !m_chatmessage[BLIPNAME].isEmpty()) + { f_blips = ao_app->get_blips(m_chatmessage[BLIPNAME]); } blip_player->setBlip(f_blips); @@ -4463,11 +4462,9 @@ void Courtroom::handle_song(QStringList *p_contents) } } - if (!file_exists(ao_app->get_sfx_suffix(ao_app->get_music_path(f_song))) && - !f_song.startsWith("http") && f_song != "~stop.mp3" && - !ao_app->m_serverdata.get_asset_url().isEmpty()) { - f_song = (ao_app->m_serverdata.get_asset_url() + "sounds/music/" + f_song) - .toLower(); + if (!file_exists(ao_app->get_sfx_suffix(ao_app->get_music_path(f_song))) && !f_song.startsWith("http") && f_song != "~stop.mp3" && !ao_app->m_serverdata.get_asset_url().isEmpty()) + { + f_song = (ao_app->m_serverdata.get_asset_url() + "sounds/music/" + f_song).toLower(); } bool is_stop = (f_song == "~stop.mp3"); @@ -4686,11 +4683,12 @@ void Courtroom::on_ooc_return_pressed() { QString ooc_message = ui_ooc_chat_message->text(); - //We ignore it when the server is compatible with 2.8 - //Using an arbitrary 2.8 feature flag certainly won't cause issues someday. - if (ooc_message.startsWith("/pos") && - ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::EFFECTS)) { - if (ooc_message == "/pos jud") { + // We ignore it when the server is compatible with 2.8 + // Using an arbitrary 2.8 feature flag certainly won't cause issues someday. + if (ooc_message.startsWith("/pos") && ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::EFFECTS)) + { + if (ooc_message == "/pos jud") + { show_judge_controls(true); } else @@ -5514,12 +5512,12 @@ void Courtroom::on_music_list_double_clicked(QTreeWidgetItem *p_item, int column QStringList packet_contents; packet_contents.append(p_song); packet_contents.append(QString::number(m_cid)); - if ((!ui_ic_chat_name->text().isEmpty() && - ao_app->m_serverdata.get_feature( - server::BASE_FEATURE_SET::CCCC_IC_SUPPORT)) || - ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::EFFECTS)) + if ((!ui_ic_chat_name->text().isEmpty() && ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::CCCC_IC_SUPPORT)) || ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::EFFECTS)) + { packet_contents.append(ui_ic_chat_name->text()); - if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::EFFECTS)){ + } + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::EFFECTS)) + { packet_contents.append(QString::number(music_flags)); } ao_app->send_server_packet(AOPacket("MC", packet_contents)); @@ -5628,6 +5626,7 @@ void Courtroom::music_list_expand_all() { ui_music_list->expandAll(); } + void Courtroom::music_list_collapse_all() { ui_music_list->collapseAll(); @@ -5645,6 +5644,7 @@ void Courtroom::music_stop(bool no_effects) { return; } + // Default fake song is a song present in Vanilla content, the ~stop.mp3 QString fake_song = "~stop.mp3"; // If the fake song is not present in the music list @@ -5662,21 +5662,29 @@ void Courtroom::music_stop(bool no_effects) } } } + QStringList packet_contents; // its music list packet_contents.append(fake_song); // this is our fake song, playing it triggers special code packet_contents.append(QString::number(m_cid)); - if ((!ui_ic_chat_name->text().isEmpty() && - ao_app->m_serverdata.get_feature( - server::BASE_FEATURE_SET::CCCC_IC_SUPPORT)) || - ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::EFFECTS)) - packet_contents.append(ui_ic_chat_name->text()); - if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::EFFECTS)) { - if (no_effects) - packet_contents.append("0"); - else - packet_contents.append(QString::number(music_flags)); - ao_app->send_server_packet(AOPacket("MC", packet_contents)); + if ((!ui_ic_chat_name->text().isEmpty() && ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::CCCC_IC_SUPPORT)) || ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::EFFECTS)) + { + packet_contents.append(ui_ic_chat_name->text()); + } + + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::EFFECTS)) + { + if (no_effects) + { + packet_contents.append("0"); + } + else + { + packet_contents.append(QString::number(music_flags)); + } + + ao_app->send_server_packet(AOPacket("MC", packet_contents)); + } } void Courtroom::on_area_list_double_clicked(QTreeWidgetItem *p_item, int column) @@ -5866,7 +5874,9 @@ void Courtroom::on_pair_clicked() ui_pair_list->show(); ui_pair_offset_spinbox->show(); if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::Y_OFFSET)) + { ui_pair_vert_offset_spinbox->show(); + } ui_pair_order_dropdown->show(); ui_mute_list->hide(); ui_mute->setImage("mute"); @@ -6179,8 +6189,8 @@ void Courtroom::on_spectator_clicked() void Courtroom::on_call_mod_clicked() { - if (ao_app->m_serverdata.get_feature( - server::BASE_FEATURE_SET::MODCALL_REASON)) { + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::MODCALL_REASON)) + { QMessageBox errorBox; QInputDialog input; diff --git a/src/packet_distribution.cpp b/src/packet_distribution.cpp index 1a0e798..8b86b34 100644 --- a/src/packet_distribution.cpp +++ b/src/packet_distribution.cpp @@ -87,7 +87,8 @@ void AOApplication::server_packet_received(AOPacket packet) w_courtroom->append_server_chatmessage(content.at(0), content.at(1), "0"); } } - else if (header == "FL") { + else if (header == "FL") + { m_serverdata.set_features(content); log_to_demo = false; } @@ -114,44 +115,40 @@ void AOApplication::server_packet_received(AOPacket packet) return; } - char_list_size = content.at(0).toInt(); - evidence_list_size = content.at(1).toInt(); - music_list_size = content.at(2).toInt(); + generated_chars = 0; - if (char_list_size < 0 || evidence_list_size < 0 || music_list_size < 0) + destruct_courtroom(); + construct_courtroom(); + + courtroom_loaded = false; + + int selected_server = w_lobby->get_selected_server(); + QString server_address; + QString server_name; + switch (w_lobby->pageSelected()) { - return; + case 0: + if (selected_server >= 0 && selected_server < server_list.size()) + { + auto info = server_list.at(selected_server); + server_name = info.name; + server_address = QString("%1:%2").arg(info.ip, QString::number(info.port)); + window_title = server_name; + } + break; + + case 1: + { + QVector favorite_list = Options::getInstance().favorites(); + if (selected_server >= 0 && selected_server < favorite_list.size()) + { + auto info = favorite_list.at(selected_server); + server_name = info.name; + server_address = QString("%1:%2").arg(info.ip, QString::number(info.port)); + window_title = server_name; + } } - -generated_chars = 0; - -destruct_courtroom(); -construct_courtroom(); - -courtroom_loaded = false; - -int selected_server = w_lobby->get_selected_server(); -QString server_address ; -QString server_name ; -switch (w_lobby->pageSelected()) { -case 0: - if (selected_server >= 0 && selected_server < server_list.size()) { - auto info = server_list.at(selected_server); - server_name = info.name; - server_address = QString("%1:%2").arg(info.ip, QString::number(info.port)); - window_title = server_name; - } - break; - -case 1: { - QVector favorite_list = Options::getInstance().favorites(); - if (selected_server >= 0 && selected_server < favorite_list.size()) { - auto info = favorite_list.at(selected_server); - server_name = info.name; - server_address = QString("%1:%2").arg(info.ip, QString::number(info.port)); - window_title = server_name; - } -} break; + break; case 2: window_title = "Local Demo Recording"; break; @@ -254,9 +251,10 @@ case 1: { bool musics_time = false; int areas = 0; - for (int n_element = 0; n_element < content.size(); ++n_element) { - ++loaded_music; - if (musics_time) { + for (int n_element = 0; n_element < content.size(); ++n_element) + { + if (musics_time) + { w_courtroom->append_music(content.at(n_element)); } else @@ -629,11 +627,11 @@ case 1: { } } // Auth packet - else if (header == "AUTH") { - if (!is_courtroom_constructed() || - !m_serverdata.get_feature(server::BASE_FEATURE_SET::AUTH_PACKET) || - contents.isEmpty()) { - return; + else if (header == "AUTH") + { + if (!is_courtroom_constructed() || !m_serverdata.get_feature(server::BASE_FEATURE_SET::AUTH_PACKET) || content.isEmpty()) + { + return; } bool ok; int authenticated = content.at(0).toInt(&ok); @@ -676,7 +674,7 @@ case 1: { return; } - m_serverdata.set_asset_url(contents.at(0)); + m_serverdata.set_asset_url(content.at(0)); } if (log_to_demo) diff --git a/src/serverdata.cpp b/src/serverdata.cpp index b8a08df..5b3d139 100644 --- a/src/serverdata.cpp +++ b/src/serverdata.cpp @@ -3,38 +3,43 @@ #include #include -namespace server { - bool ServerData::get_feature(const BASE_FEATURE_SET &f_feature) const +namespace server +{ +bool ServerData::get_feature(const BASE_FEATURE_SET &f_feature) const +{ + return get_feature(QVariant::fromValue(f_feature).toString()); +} + +bool ServerData::get_feature(const QString &f_feature) const +{ + return m_features.contains(f_feature, Qt::CaseInsensitive); +} + +void ServerData::set_features(const QStringList &f_feature_list) +{ + m_features = f_feature_list; +} + +void ServerData::set_server_software(const QString &newServer_software) +{ + m_server_software = newServer_software; +} + +QString ServerData::get_asset_url() const +{ + return m_asset_url; +} + +void ServerData::set_asset_url(const QString &f_asset_url) +{ + QUrl l_asset_url = QUrl::fromPercentEncoding(f_asset_url.toUtf8()); + + if (l_asset_url.isValid()) { - return get_feature(QVariant::fromValue(f_feature).toString()); + m_asset_url = l_asset_url.toString(); } - bool ServerData::get_feature(const QString &f_feature) const - { - return m_features.contains(f_feature, Qt::CaseInsensitive); - } - - void ServerData::set_features(const QStringList &f_feature_list) - { - m_features = f_feature_list; - } - - void ServerData::set_server_software(const QString &newServer_software) - { - m_server_software = newServer_software; - } - - QString ServerData::get_asset_url() const { return m_asset_url; } - - void ServerData::set_asset_url(const QString &f_asset_url) - { - QUrl l_asset_url = QUrl::fromPercentEncoding(f_asset_url.toUtf8()); - - if (l_asset_url.isValid()) { - m_asset_url = l_asset_url.toString(); - } - - m_asset_url = f_asset_url; - } + m_asset_url = f_asset_url; +} } // namespace server diff --git a/src/serverdata.h b/src/serverdata.h index 0c34266..9935185 100644 --- a/src/serverdata.h +++ b/src/serverdata.h @@ -5,149 +5,152 @@ #include #include -namespace server { - Q_NAMESPACE +namespace server +{ +Q_NAMESPACE - /// The base feature set that almost all servers are supposed to support. - enum class BASE_FEATURE_SET { - YELLOWTEXT, ///< Yellow text in in-character messages. +/// The base feature set that almost all servers are supposed to support. +enum class BASE_FEATURE_SET +{ + YELLOWTEXT, ///< Yellow text in in-character messages. ///< @since 2.1.0 - FLIPPING, ///< The ability to mirror a character in-game. + FLIPPING, ///< The ability to mirror a character in-game. ///< @since 2.1.0 - CUSTOMOBJECTIONS, ///< Enables the use of a single custom objection named + CUSTOMOBJECTIONS, ///< Enables the use of a single custom objection named ///< `custom`. ///< @since 2.1.0 - FASTLOADING, ///< Enables the use of "fast loading" instead of the legacy - ///< loading protocol. - ///< @since 2.1.0 - NOENCRYPTION, ///< Disables "FantaCrypt" for the remainder of the session. - ///< @since 2.1.0 - DESKMOD, ///< Allows forcing the appearance or disappearance of the desk. - ///< @since 2.3 to 2.5 - EVIDENCE, ///< Allows creating and presenting evidence. - ///< @since 2.3 to 2.5 - CCCC_IC_SUPPORT, ///< The ability to pair up with another user's character, - ///< the ability to change one's displayed name - ///< in-character ("showname"), and the ability to perform - ///< "immediate" preanimations (ones that happen alongside - ///< text display). - ///< @since 2.6.0 - ARUP, ///< Areas have more data about them than just their name (including - ///< their status, their "lockedness", and who is the Case Master in - ///< the area), and sets the client up to receive and send ARUP - ///< packets. - ///< @since 2.6.0 - CASING_ALERTS, ///< The client gains a new window to announce cases with, - ///< and the settings to set itself up to receive case alerts - ///< based on casing preferences. No longer used. - ///< @since 2.6.0 - MODCALL_REASON, ///< Enables entering a custom reason for calling - ///< moderators. - ///< @since 2.6.0 - LOOPING_SFX, ///< Enables looping SFX extensions for the in-character - ///< command. - ///< @since 2.8.0 - ADDITIVE, ///< Enables "additive" text that allows in-character messages to - ///< concatenate to the previous one sent by the same character. - ///< @since 2.8.0 - EFFECTS, ///< Enables effect overlays. - ///< @since 2.8.0 - Y_OFFSET, ///< Enables support for vertical offsets. - ///< @since 2.9.0 - EXPANDED_DESK_MODS, ///< Enables desk modifiers 2 through 5. - ///< @since 2.9.0 - AUTH_PACKET, ///< Enables the use of the AUTH packet. - ///< @since 2.9.1 - PREZOOM, ///< Preanim zoom. - CUSTOM_BLIPS ///< Allows the in-character messages to contain data about - ///< what blips to use for the character's current message. - }; - Q_ENUM_NS(BASE_FEATURE_SET) + FASTLOADING, ///< Enables the use of "fast loading" instead of the legacy + ///< loading protocol. + ///< @since 2.1.0 + NOENCRYPTION, ///< Disables "FantaCrypt" for the remainder of the session. + ///< @since 2.1.0 + DESKMOD, ///< Allows forcing the appearance or disappearance of the desk. + ///< @since 2.3 to 2.5 + EVIDENCE, ///< Allows creating and presenting evidence. + ///< @since 2.3 to 2.5 + CCCC_IC_SUPPORT, ///< The ability to pair up with another user's character, + ///< the ability to change one's displayed name + ///< in-character ("showname"), and the ability to perform + ///< "immediate" preanimations (ones that happen alongside + ///< text display). + ///< @since 2.6.0 + ARUP, ///< Areas have more data about them than just their name (including + ///< their status, their "lockedness", and who is the Case Master in + ///< the area), and sets the client up to receive and send ARUP + ///< packets. + ///< @since 2.6.0 + CASING_ALERTS, ///< The client gains a new window to announce cases with, + ///< and the settings to set itself up to receive case alerts + ///< based on casing preferences. No longer used. + ///< @since 2.6.0 + MODCALL_REASON, ///< Enables entering a custom reason for calling + ///< moderators. + ///< @since 2.6.0 + LOOPING_SFX, ///< Enables looping SFX extensions for the in-character + ///< command. + ///< @since 2.8.0 + ADDITIVE, ///< Enables "additive" text that allows in-character messages to + ///< concatenate to the previous one sent by the same character. + ///< @since 2.8.0 + EFFECTS, ///< Enables effect overlays. + ///< @since 2.8.0 + Y_OFFSET, ///< Enables support for vertical offsets. + ///< @since 2.9.0 + EXPANDED_DESK_MODS, ///< Enables desk modifiers 2 through 5. + ///< @since 2.9.0 + AUTH_PACKET, ///< Enables the use of the AUTH packet. + ///< @since 2.9.1 + PREZOOM, ///< Preanim zoom. + CUSTOM_BLIPS ///< Allows the in-character messages to contain data about + ///< what blips to use for the character's current message. +}; +Q_ENUM_NS(BASE_FEATURE_SET) + +/** + * @brief Arranges data about the server the client is connected to. + */ +class ServerData +{ +public: + /** + * @brief Returns true if one of the standard features exists on the server. + * + * @details Internally, this calls get_feature(const QString &f_feature) + * with the enum's value converted to string. + * + * @param f_feature The feature to check for. + * + * @return True if the feature exists on the server. + */ + bool get_feature(const BASE_FEATURE_SET &f_feature) const; /** - * @brief Arranges data about the server the client is connected to. + * @brief Returns true if the feature exists on the server. + * + * @param f_feature The feature to check for. Case insensitive. + * + * @return True if the feature exists on the server. */ - class ServerData { - public: - /** - * @brief Returns true if one of the standard features exists on the server. - * - * @details Internally, this calls get_feature(const QString &f_feature) - * with the enum's value converted to string. - * - * @param f_feature The feature to check for. - * - * @return True if the feature exists on the server. - */ - bool get_feature(const BASE_FEATURE_SET &f_feature) const; + bool get_feature(const QString &f_feature) const; - /** - * @brief Returns true if the feature exists on the server. - * - * @param f_feature The feature to check for. Case insensitive. - * - * @return True if the feature exists on the server. - */ - bool get_feature(const QString &f_feature) const; + /** + * @brief Sets the feature list, overwriting the existing one. + * + * @param f_feature_list The new feature list of the server. + */ + void set_features(const QStringList &f_feature_list); - /** - * @brief Sets the feature list, overwriting the existing one. - * - * @param f_feature_list The new feature list of the server. - */ - void set_features(const QStringList &f_feature_list); + /** + * @brief Self-explanatory: gets the software the server is running on. + * + * @return As brief description. + */ + QString get_server_software() const; - /** - * @brief Self-explanatory: gets the software the server is running on. - * - * @return As brief description. - */ - QString get_server_software() const; + /** + * @brief Self-explanatory: setter for server software. + * + * @param f_software The new server software. + */ + void set_server_software(const QString &f_software); - /** - * @brief Self-explanatory: setter for server software. - * - * @param f_software The new server software. - */ - void set_server_software(const QString &f_software); + /** + * @brief Getter for the server's asset URL. + * + * @return As brief description. + * + * @see m_asset_url + */ + QString get_asset_url() const; - /** - * @brief Getter for the server's asset URL. - * - * @return As brief description. - * - * @see m_asset_url - */ - QString get_asset_url() const; + /** + * @brief Attempts to set the new asset URL for the server. + * + * @details The function converts the sole parameter into UTF-8, then + * attempts to percent decode it. The URL is only set if all these steps + * successfully happen. + * + * @param f_asset_url A QString that contains the URL. + */ + void set_asset_url(const QString &f_asset_url); - /** - * @brief Attempts to set the new asset URL for the server. - * - * @details The function converts the sole parameter into UTF-8, then - * attempts to percent decode it. The URL is only set if all these steps - * successfully happen. - * - * @param f_asset_url A QString that contains the URL. - */ - void set_asset_url(const QString &f_asset_url); +private: + /// The features available on the server. Determines what + QStringList m_features; - private: - /// The features available on the server. Determines what - QStringList m_features; + /// The software the server is running. + QString m_server_software; - /// The software the server is running. - QString m_server_software; - - /** - * @brief A QString of an URL that defines the content repository - * send by the server. - * - * @details Introduced in Version 2.9.2. - * Addresses the issue of contenturl devlivery for WebAO - * without relying on someone adding the link manually. - */ - QString m_asset_url; - }; + /** + * @brief A QString of an URL that defines the content repository + * send by the server. + * + * @details Introduced in Version 2.9.2. + * Addresses the issue of contenturl devlivery for WebAO + * without relying on someone adding the link manually. + */ + QString m_asset_url; +}; } // namespace server #endif // SERVERDATA_H