diff --git a/include/aoapplication.h b/include/aoapplication.h index 153a4ab6b..c4d862fbd 100644 --- a/include/aoapplication.h +++ b/include/aoapplication.h @@ -1,11 +1,12 @@ #ifndef AOAPPLICATION_H #define AOAPPLICATION_H -#include "widgets/aooptionsdialog.h" #include "aopacket.h" #include "datatypes.h" #include "demoserver.h" #include "discord_rich_presence.h" +#include "serverdata.h" +#include "widgets/aooptionsdialog.h" #include "bass.h" @@ -87,51 +88,31 @@ class AOApplication : public QApplication { qint64 latency = 0; QString window_title; - /////////////////server metadata////////////////// - - bool yellow_text_supported = false; - bool prezoom_supported = false; - bool flipping_supported = false; - bool custom_objection_supported = false; - bool desk_mod_supported = false; - bool evidence_supported = false; - bool cccc_ic_supported = false; - bool arup_supported = false; - bool casing_alerts_supported = false; - bool modcall_reason_supported = false; - bool looping_sfx_supported = false; - bool additive_supported = false; - bool effects_supported = false; - bool y_offset_supported = false; - bool expanded_desk_mods_supported = false; - bool auth_packet_supported = false; - bool custom_blips_supported = false; + /// Stores everything related to the server the client is connected to, if + /// any. + server::ServerData m_serverdata; ///////////////loading info/////////////////// // client ID. Not useful, to be removed eventually int client_id = 0; - QString server_software = ""; - - int char_list_size = 0; - int loaded_chars = 0; + /// Used for a fancy loading bar upon joining a server. int generated_chars = 0; - int evidence_list_size = 0; - int loaded_evidence = 0; - int music_list_size = 0; - int loaded_music = 0; bool courtroom_loaded = false; - //////////////////versioning/////////////// - - int get_release() const { return RELEASE; } - int get_major_version() const { return MAJOR_VERSION; } - int get_minor_version() const { return MINOR_VERSION; } - QString get_version_string(); + /** + * @brief Returns the version string of the software. + * + * @return The string "X.Y.Z", where X is the release of the software (usually + * '2'), Y is the major version, and Z is the minor version. + */ + static QString get_version_string(); - /////////////////////////////////////////// + static const int RELEASE = 2; + static const int MAJOR_VERSION = 10; + static const int MINOR_VERSION = 1; // Adds the server to favorite_servers.ini void add_favorite_server(int p_server); @@ -372,16 +353,6 @@ class AOApplication : public QApplication { // The file name of the log file in base/logs. QString log_filename; - /** - * @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 asset_url; - void initBASS(); static void load_bass_plugins(); static void CALLBACK BASSreset(HSTREAM handle, DWORD channel, DWORD data, @@ -392,10 +363,6 @@ class AOApplication : public QApplication { DemoServer* demo_server = nullptr; private: - const int RELEASE = 2; - const int MAJOR_VERSION = 10; - const int MINOR_VERSION = 1; - QVector server_list; QHash asset_lookup_cache; QHash dir_listing_cache; diff --git a/include/serverdata.h b/include/serverdata.h new file mode 100644 index 000000000..0c3426601 --- /dev/null +++ b/include/serverdata.h @@ -0,0 +1,153 @@ +#ifndef SERVERDATA_H +#define SERVERDATA_H + +#include +#include +#include + +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. + ///< @since 2.1.0 + FLIPPING, ///< The ability to mirror a character in-game. + ///< @since 2.1.0 + 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) + + /** + * @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 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 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 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); + + private: + /// The features available on the server. Determines what + QStringList m_features; + + /// 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; + }; +} // namespace server + +#endif // SERVERDATA_H diff --git a/src/courtroom.cpp b/src/courtroom.cpp index a8c2d6243..d36d74fd5 100644 --- a/src/courtroom.cpp +++ b/src/courtroom.cpp @@ -680,7 +680,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->cccc_ic_supported) { + 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(); @@ -1552,7 +1553,8 @@ void Courtroom::update_character(int p_cid, QString char_name, bool reset_emote) set_iniswap_dropdown(); ui_custom_objection->hide(); - if (ao_app->custom_objection_supported) // 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(); @@ -1616,12 +1618,12 @@ void Courtroom::enter_courtroom() { set_evidence_page(); - if (ao_app->flipping_supported) + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::FLIPPING)) ui_flip->show(); else ui_flip->hide(); - if (ao_app->additive_supported) + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::ADDITIVE)) ui_additive->show(); else ui_additive->hide(); @@ -1672,8 +1674,6 @@ void Courtroom::list_music() QBrush found_brush(ao_app->get_color("found_song_color", f_file)); QBrush missing_brush(ao_app->get_color("missing_song_color", f_file)); - int n_listed_songs = 0; - QTreeWidgetItem *parent = nullptr; for (int n_song = 0; n_song < music_list.size(); ++n_song) { QString i_song = music_list.at(n_song); @@ -1708,7 +1708,6 @@ void Courtroom::list_music() if (i_song_listname == i_song) // Not supposed to be a song to begin with - a category? parent = treeItem; - ++n_listed_songs; } ui_music_list->expandAll(); // Needs to somehow remember which categories were @@ -1728,7 +1727,7 @@ void Courtroom::list_areas() QString i_area = ""; i_area.append(area_list.at(n_area)); - if (ao_app->arup_supported) { + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::ARUP)) { i_area.append("\n "); i_area.append(arup_statuses.at(n_area)); @@ -1748,7 +1747,6 @@ void Courtroom::list_areas() i_area.append(arup_locks.at(n_area)); } - QTreeWidgetItem *treeItem = ui_area_list->topLevelItem(n_area); if (treeItem == nullptr) { treeItem = new QTreeWidgetItem(ui_area_list); @@ -1756,7 +1754,7 @@ void Courtroom::list_areas() treeItem->setText(0, area_list.at(n_area)); treeItem->setText(1, i_area); - if (ao_app->arup_supported) { + 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") { @@ -1827,7 +1825,9 @@ void Courtroom::append_server_chatmessage(QString p_name, QString p_message, color = ao_app->get_color("server_chatlog_sender_color", "courtroom_fonts.ini") .name(); - if (!ao_app->auth_packet_supported && p_message == "Logged in as a moderator.") { + 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); } @@ -1899,9 +1899,10 @@ void Courtroom::on_chat_return_pressed() int f_desk_mod = DESK_SHOW; - if (ao_app->desk_mod_supported) { + 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->expanded_desk_mods_supported) { + 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; else if (f_desk_mod == DESK_EMOTE_ONLY_EX || f_desk_mod == DESK_EMOTE_ONLY) @@ -1939,7 +1940,8 @@ void Courtroom::on_chat_return_pressed() f_emote_mod = PREANIM; } // Turn zoom into preanim zoom - else if (f_emote_mod == ZOOM && ao_app->prezoom_supported) { + 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 @@ -1995,7 +1997,9 @@ void Courtroom::on_chat_return_pressed() QString f_obj_state; - if ((objection_state == 4 && !ao_app->custom_objection_supported) || + 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) { @@ -2021,7 +2025,7 @@ void Courtroom::on_chat_return_pressed() QString f_flip; - if (ao_app->flipping_supported) { + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::FLIPPING)) { if (ui_flip->isChecked()) f_flip = "1"; else @@ -2046,8 +2050,10 @@ 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->cccc_ic_supported) { - // If there is a showname entered, use that -- else, just send whatever the ini calls for. + 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()) { packet_contents.append(ui_ic_chat_name->text()); } @@ -2059,8 +2065,10 @@ void Courtroom::on_chat_return_pressed() // ourselves. Or a charid of -1 or lower, through some means. if (other_charid > -1 && other_charid != m_cid) { QString packet = QString::number(other_charid); - if (ao_app->effects_supported) // 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); } @@ -2068,8 +2076,9 @@ void Courtroom::on_chat_return_pressed() packet_contents.append("-1"); } // Send the offset as it's gonna be used regardless - if(ao_app->y_offset_supported) - 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)); @@ -2084,7 +2093,7 @@ 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->looping_sfx_supported) { + 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)); @@ -2115,10 +2124,10 @@ void Courtroom::on_chat_return_pressed() } } - if (ao_app->additive_supported) { + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::ADDITIVE)) { packet_contents.append(ui_additive->isChecked() ? "1" : "0"); } - if (ao_app->effects_supported) { + 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 = @@ -2278,7 +2287,9 @@ void Courtroom::unpack_chatmessage(QStringList p_contents) // 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->cccc_ic_supported)) { + (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 { @@ -2601,7 +2612,9 @@ void Courtroom::display_pair_character(QString other_charid, QString other_offse } } // Flip the pair character - if (ao_app->flipping_supported && 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 ui_vp_sideplayer_char->set_flipped(false); @@ -3834,8 +3847,10 @@ 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->custom_blips_supported && !m_chatmessage[BLIPNAME].isEmpty()) { - f_blips = ao_app->get_blips(m_chatmessage[BLIPNAME]); + 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->set_blips(f_blips); @@ -4230,9 +4245,11 @@ void Courtroom::handle_song(QStringList *p_contents) return; } - 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->asset_url.isEmpty()) { - f_song = (ao_app->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"); @@ -4429,7 +4446,8 @@ void Courtroom::on_ooc_return_pressed() //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->effects_supported) { + 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); } @@ -5183,10 +5201,12 @@ void Courtroom::on_music_list_double_clicked(QTreeWidgetItem *p_item, QStringList packet_contents; packet_contents.append(p_song); packet_contents.append(QString::number(m_cid)); - if ((!ui_ic_chat_name->text().isEmpty() && ao_app->cccc_ic_supported) || - ao_app->effects_supported) + 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->effects_supported) + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::EFFECTS)) packet_contents.append(QString::number(music_flags)); ao_app->send_server_packet(new AOPacket("MC", packet_contents)); } @@ -5313,10 +5333,12 @@ void Courtroom::music_stop(bool no_effects) 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->cccc_ic_supported) || - ao_app->effects_supported) + 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->effects_supported) { + if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::EFFECTS)) { if (no_effects) packet_contents.append("0"); else @@ -5488,8 +5510,8 @@ void Courtroom::on_pair_clicked() if (ui_pair_list->isHidden()) { ui_pair_list->show(); ui_pair_offset_spinbox->show(); - if(ao_app->y_offset_supported) - ui_pair_vert_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->set_image("mute"); @@ -5773,7 +5795,8 @@ void Courtroom::on_spectator_clicked() { char_clicked(-1); } void Courtroom::on_call_mod_clicked() { - if (ao_app->modcall_reason_supported) { + 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 e5a17d27f..8cb78eb86 100644 --- a/src/packet_distribution.cpp +++ b/src/packet_distribution.cpp @@ -42,21 +42,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet) goto end; // default(legacy) values - yellow_text_supported = false; - prezoom_supported = false; - flipping_supported = false; - custom_objection_supported = false; - desk_mod_supported = false; - evidence_supported = false; - cccc_ic_supported = false; - arup_supported = false; - casing_alerts_supported = false; - modcall_reason_supported = false; - looping_sfx_supported = false; - additive_supported = false; - effects_supported = false; - y_offset_supported = false; - custom_blips_supported = false; + m_serverdata.set_features(QStringList()); QString f_hdid; f_hdid = get_hdid(); @@ -71,7 +57,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet) goto end; client_id = f_contents.at(0).toInt(); - server_software = f_contents.at(1); + m_serverdata.set_server_software(f_contents.at(1)); net_manager->server_connected(true); @@ -91,58 +77,11 @@ void AOApplication::server_packet_received(AOPacket *p_packet) f_contents.at(1), "0"); } else if (header == "FL") { - yellow_text_supported = false; - prezoom_supported = false; - flipping_supported = false; - custom_objection_supported = false; - desk_mod_supported = false; - evidence_supported = false; - cccc_ic_supported = false; - arup_supported = false; - casing_alerts_supported = false; - modcall_reason_supported = false; - looping_sfx_supported = false; - additive_supported = false; - effects_supported = false; - expanded_desk_mods_supported = false; - auth_packet_supported = false; - custom_blips_supported = false; + QStringList l_features = f_packet.split("#", Qt::SkipEmptyParts); + l_features.removeAll("%"); + l_features.removeAll("FL"); + m_serverdata.set_features(l_features); log_to_demo = false; - - if (f_packet.contains("yellowtext", Qt::CaseInsensitive)) - yellow_text_supported = true; - if (f_packet.contains("prezoom", Qt::CaseInsensitive)) - prezoom_supported = true; - if (f_packet.contains("flipping", Qt::CaseInsensitive)) - flipping_supported = true; - if (f_packet.contains("customobjections", Qt::CaseInsensitive)) - custom_objection_supported = true; - if (f_packet.contains("deskmod", Qt::CaseInsensitive)) - desk_mod_supported = true; - if (f_packet.contains("evidence", Qt::CaseInsensitive)) - evidence_supported = true; - if (f_packet.contains("cccc_ic_support", Qt::CaseInsensitive)) - cccc_ic_supported = true; - if (f_packet.contains("arup", Qt::CaseInsensitive)) - arup_supported = true; - if (f_packet.contains("casing_alerts", Qt::CaseInsensitive)) - casing_alerts_supported = true; - if (f_packet.contains("modcall_reason", Qt::CaseInsensitive)) - modcall_reason_supported = true; - if (f_packet.contains("looping_sfx", Qt::CaseInsensitive)) - looping_sfx_supported = true; - if (f_packet.contains("additive", Qt::CaseInsensitive)) - additive_supported = true; - if (f_packet.contains("effects", Qt::CaseInsensitive)) - effects_supported = true; - if (f_packet.contains("y_offset", Qt::CaseInsensitive)) - y_offset_supported = true; - if (f_packet.contains("expanded_desk_mods", Qt::CaseInsensitive)) - expanded_desk_mods_supported = true; - if (f_packet.contains("auth_packet", Qt::CaseInsensitive)) - auth_packet_supported = true; - if (f_packet.contains("custom_blips", Qt::CaseInsensitive)) - custom_blips_supported = true; } else if (header == "PN") { if (!lobby_constructed || f_contents.size() < 2) @@ -162,47 +101,40 @@ void AOApplication::server_packet_received(AOPacket *p_packet) goto end; } - char_list_size = f_contents.at(0).toInt(); - evidence_list_size = f_contents.at(1).toInt(); - music_list_size = f_contents.at(2).toInt(); +int char_list_size = f_contents.at(0).toInt(); +int evidence_list_size = f_contents.at(1).toInt(); +int music_list_size = f_contents.at(2).toInt(); - if (char_list_size < 0 || evidence_list_size < 0 || music_list_size < 0) - goto end; +if (char_list_size < 0 || evidence_list_size < 0 || music_list_size < 0) + goto end; - loaded_chars = 0; - loaded_evidence = 0; - loaded_music = 0; - generated_chars = 0; - - destruct_courtroom(); - construct_courtroom(); - - courtroom_loaded = false; - - int selected_server = w_lobby->get_selected_server(); - QString server_address = "", 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; +generated_chars = 0; + +destruct_courtroom(); +construct_courtroom(); + +courtroom_loaded = false; + +int selected_server = w_lobby->get_selected_server(); +QString server_address = "", 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; case 2: window_title = "Local Demo Recording"; break; @@ -285,7 +217,6 @@ void AOApplication::server_packet_received(AOPacket *p_packet) int areas = 0; for (int n_element = 0; n_element < f_contents.size(); ++n_element) { - ++loaded_music; if (musics_time) { w_courtroom->append_music(f_contents.at(n_element)); } @@ -582,9 +513,11 @@ void AOApplication::server_packet_received(AOPacket *p_packet) } // Auth packet else if (header == "AUTH") { - if (!courtroom_constructed || !auth_packet_supported || f_contents.isEmpty()) { + if (!courtroom_constructed || + !m_serverdata.get_feature(server::BASE_FEATURE_SET::AUTH_PACKET) || + f_contents.isEmpty()) { goto end; -} + } bool ok; int authenticated = f_contents.at(0).toInt(&ok); if (!ok) { @@ -617,9 +550,8 @@ void AOApplication::server_packet_received(AOPacket *p_packet) if (f_contents.size() > 1 || f_contents.isEmpty()) { // This can never be more than one link. goto end; } - QUrl t_asset_url = QUrl::fromPercentEncoding(f_contents.at(0).toUtf8()); - if (t_asset_url.isValid()) - asset_url = t_asset_url.toString(); + + m_serverdata.set_asset_url(f_contents.at(0)); } if (log_to_demo) { diff --git a/src/serverdata.cpp b/src/serverdata.cpp new file mode 100644 index 000000000..b8a08df81 --- /dev/null +++ b/src/serverdata.cpp @@ -0,0 +1,40 @@ +#include + +#include +#include + +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()) { + m_asset_url = l_asset_url.toString(); + } + + m_asset_url = f_asset_url; + } + +} // namespace server