Lift out most server-related data into its own class (#955)
* Lift out most server-related data into its own class * Fix missing negation in the auth packet support check * Update `get_feature(BASE_FEATURE_SET)`'s documentation * Make the version numbers public * Add support for custom blips --------- Co-authored-by: in1tiate <32779090+in1tiate@users.noreply.github.com>
This commit is contained in:
parent
c9eabf35da
commit
4fb61b7afd
@ -1,11 +1,12 @@
|
|||||||
#ifndef AOAPPLICATION_H
|
#ifndef AOAPPLICATION_H
|
||||||
#define AOAPPLICATION_H
|
#define AOAPPLICATION_H
|
||||||
|
|
||||||
#include "widgets/aooptionsdialog.h"
|
|
||||||
#include "aopacket.h"
|
#include "aopacket.h"
|
||||||
#include "datatypes.h"
|
#include "datatypes.h"
|
||||||
#include "demoserver.h"
|
#include "demoserver.h"
|
||||||
#include "discord_rich_presence.h"
|
#include "discord_rich_presence.h"
|
||||||
|
#include "serverdata.h"
|
||||||
|
#include "widgets/aooptionsdialog.h"
|
||||||
|
|
||||||
#include "bass.h"
|
#include "bass.h"
|
||||||
|
|
||||||
@ -87,51 +88,31 @@ public:
|
|||||||
qint64 latency = 0;
|
qint64 latency = 0;
|
||||||
QString window_title;
|
QString window_title;
|
||||||
|
|
||||||
/////////////////server metadata//////////////////
|
/// Stores everything related to the server the client is connected to, if
|
||||||
|
/// any.
|
||||||
bool yellow_text_supported = false;
|
server::ServerData m_serverdata;
|
||||||
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;
|
|
||||||
|
|
||||||
///////////////loading info///////////////////
|
///////////////loading info///////////////////
|
||||||
|
|
||||||
// client ID. Not useful, to be removed eventually
|
// client ID. Not useful, to be removed eventually
|
||||||
int client_id = 0;
|
int client_id = 0;
|
||||||
|
|
||||||
QString server_software = "";
|
/// Used for a fancy loading bar upon joining a server.
|
||||||
|
|
||||||
int char_list_size = 0;
|
|
||||||
int loaded_chars = 0;
|
|
||||||
int generated_chars = 0;
|
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;
|
bool courtroom_loaded = false;
|
||||||
|
|
||||||
//////////////////versioning///////////////
|
/**
|
||||||
|
* @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();
|
||||||
|
|
||||||
int get_release() const { return RELEASE; }
|
static const int RELEASE = 2;
|
||||||
int get_major_version() const { return MAJOR_VERSION; }
|
static const int MAJOR_VERSION = 10;
|
||||||
int get_minor_version() const { return MINOR_VERSION; }
|
static const int MINOR_VERSION = 1;
|
||||||
QString get_version_string();
|
|
||||||
|
|
||||||
///////////////////////////////////////////
|
|
||||||
|
|
||||||
// Adds the server to favorite_servers.ini
|
// Adds the server to favorite_servers.ini
|
||||||
void add_favorite_server(int p_server);
|
void add_favorite_server(int p_server);
|
||||||
@ -365,16 +346,6 @@ public:
|
|||||||
// The file name of the log file in base/logs.
|
// The file name of the log file in base/logs.
|
||||||
QString log_filename;
|
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();
|
void initBASS();
|
||||||
static void load_bass_plugins();
|
static void load_bass_plugins();
|
||||||
static void CALLBACK BASSreset(HSTREAM handle, DWORD channel, DWORD data,
|
static void CALLBACK BASSreset(HSTREAM handle, DWORD channel, DWORD data,
|
||||||
@ -385,10 +356,6 @@ public:
|
|||||||
DemoServer* demo_server = nullptr;
|
DemoServer* demo_server = nullptr;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const int RELEASE = 2;
|
|
||||||
const int MAJOR_VERSION = 10;
|
|
||||||
const int MINOR_VERSION = 1;
|
|
||||||
|
|
||||||
QVector<server_type> server_list;
|
QVector<server_type> server_list;
|
||||||
QHash<uint, QString> asset_lookup_cache;
|
QHash<uint, QString> asset_lookup_cache;
|
||||||
QHash<uint, QString> dir_listing_cache;
|
QHash<uint, QString> dir_listing_cache;
|
||||||
|
153
include/serverdata.h
Normal file
153
include/serverdata.h
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
#ifndef SERVERDATA_H
|
||||||
|
#define SERVERDATA_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QString>
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
|
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
|
@ -665,7 +665,8 @@ void Courtroom::set_widgets()
|
|||||||
// If there is a point to it, show all CCCC features.
|
// 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,
|
// We also do this this soon so that set_size_and_pos can hide them all later,
|
||||||
// if needed.
|
// 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_pair_button->show();
|
||||||
ui_immediate->show();
|
ui_immediate->show();
|
||||||
ui_showname_enable->show();
|
ui_showname_enable->show();
|
||||||
@ -1524,7 +1525,8 @@ void Courtroom::update_character(int p_cid, QString char_name, bool reset_emote)
|
|||||||
set_iniswap_dropdown();
|
set_iniswap_dropdown();
|
||||||
|
|
||||||
ui_custom_objection->hide();
|
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_obj_menu->clear();
|
||||||
custom_objections_list.clear();
|
custom_objections_list.clear();
|
||||||
@ -1588,12 +1590,12 @@ void Courtroom::enter_courtroom()
|
|||||||
{
|
{
|
||||||
set_evidence_page();
|
set_evidence_page();
|
||||||
|
|
||||||
if (ao_app->flipping_supported)
|
if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::FLIPPING))
|
||||||
ui_flip->show();
|
ui_flip->show();
|
||||||
else
|
else
|
||||||
ui_flip->hide();
|
ui_flip->hide();
|
||||||
|
|
||||||
if (ao_app->additive_supported)
|
if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::ADDITIVE))
|
||||||
ui_additive->show();
|
ui_additive->show();
|
||||||
else
|
else
|
||||||
ui_additive->hide();
|
ui_additive->hide();
|
||||||
@ -1644,8 +1646,6 @@ void Courtroom::list_music()
|
|||||||
QBrush found_brush(ao_app->get_color("found_song_color", f_file));
|
QBrush found_brush(ao_app->get_color("found_song_color", f_file));
|
||||||
QBrush missing_brush(ao_app->get_color("missing_song_color", f_file));
|
QBrush missing_brush(ao_app->get_color("missing_song_color", f_file));
|
||||||
|
|
||||||
int n_listed_songs = 0;
|
|
||||||
|
|
||||||
QTreeWidgetItem *parent = nullptr;
|
QTreeWidgetItem *parent = nullptr;
|
||||||
for (int n_song = 0; n_song < music_list.size(); ++n_song) {
|
for (int n_song = 0; n_song < music_list.size(); ++n_song) {
|
||||||
QString i_song = music_list.at(n_song);
|
QString i_song = music_list.at(n_song);
|
||||||
@ -1680,7 +1680,6 @@ void Courtroom::list_music()
|
|||||||
if (i_song_listname ==
|
if (i_song_listname ==
|
||||||
i_song) // Not supposed to be a song to begin with - a category?
|
i_song) // Not supposed to be a song to begin with - a category?
|
||||||
parent = treeItem;
|
parent = treeItem;
|
||||||
++n_listed_songs;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ui_music_list->expandAll(); // Needs to somehow remember which categories were
|
ui_music_list->expandAll(); // Needs to somehow remember which categories were
|
||||||
@ -1700,7 +1699,7 @@ void Courtroom::list_areas()
|
|||||||
QString i_area = "";
|
QString i_area = "";
|
||||||
i_area.append(area_list.at(n_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("\n ");
|
||||||
|
|
||||||
i_area.append(arup_statuses.at(n_area));
|
i_area.append(arup_statuses.at(n_area));
|
||||||
@ -1720,7 +1719,6 @@ void Courtroom::list_areas()
|
|||||||
i_area.append(arup_locks.at(n_area));
|
i_area.append(arup_locks.at(n_area));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QTreeWidgetItem *treeItem = ui_area_list->topLevelItem(n_area);
|
QTreeWidgetItem *treeItem = ui_area_list->topLevelItem(n_area);
|
||||||
if (treeItem == nullptr) {
|
if (treeItem == nullptr) {
|
||||||
treeItem = new QTreeWidgetItem(ui_area_list);
|
treeItem = new QTreeWidgetItem(ui_area_list);
|
||||||
@ -1728,7 +1726,7 @@ void Courtroom::list_areas()
|
|||||||
treeItem->setText(0, area_list.at(n_area));
|
treeItem->setText(0, area_list.at(n_area));
|
||||||
treeItem->setText(1, i_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.
|
// Coloring logic here.
|
||||||
treeItem->setBackground(1, free_brush);
|
treeItem->setBackground(1, free_brush);
|
||||||
if (arup_locks.at(n_area) == "LOCKED") {
|
if (arup_locks.at(n_area) == "LOCKED") {
|
||||||
@ -1799,7 +1797,9 @@ void Courtroom::append_server_chatmessage(QString p_name, QString p_message,
|
|||||||
color =
|
color =
|
||||||
ao_app->get_color("server_chatlog_sender_color", "courtroom_fonts.ini")
|
ao_app->get_color("server_chatlog_sender_color", "courtroom_fonts.ini")
|
||||||
.name();
|
.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
|
// Emulate successful authentication
|
||||||
on_authentication_state_received(1);
|
on_authentication_state_received(1);
|
||||||
}
|
}
|
||||||
@ -1871,9 +1871,10 @@ void Courtroom::on_chat_return_pressed()
|
|||||||
|
|
||||||
int f_desk_mod = DESK_SHOW;
|
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);
|
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)
|
if (f_desk_mod == DESK_PRE_ONLY_EX || f_desk_mod == DESK_PRE_ONLY)
|
||||||
f_desk_mod = DESK_HIDE;
|
f_desk_mod = DESK_HIDE;
|
||||||
else if (f_desk_mod == DESK_EMOTE_ONLY_EX || f_desk_mod == DESK_EMOTE_ONLY)
|
else if (f_desk_mod == DESK_EMOTE_ONLY_EX || f_desk_mod == DESK_EMOTE_ONLY)
|
||||||
@ -1911,7 +1912,8 @@ void Courtroom::on_chat_return_pressed()
|
|||||||
f_emote_mod = PREANIM;
|
f_emote_mod = PREANIM;
|
||||||
}
|
}
|
||||||
// Turn zoom into preanim zoom
|
// 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;
|
f_emote_mod = PREANIM_ZOOM;
|
||||||
}
|
}
|
||||||
// Play the sfx
|
// Play the sfx
|
||||||
@ -1967,7 +1969,9 @@ void Courtroom::on_chat_return_pressed()
|
|||||||
|
|
||||||
QString f_obj_state;
|
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))
|
(objection_state < 0))
|
||||||
f_obj_state = "0";
|
f_obj_state = "0";
|
||||||
else if (objection_custom != "" && objection_state == 4) {
|
else if (objection_custom != "" && objection_state == 4) {
|
||||||
@ -1993,7 +1997,7 @@ void Courtroom::on_chat_return_pressed()
|
|||||||
|
|
||||||
QString f_flip;
|
QString f_flip;
|
||||||
|
|
||||||
if (ao_app->flipping_supported) {
|
if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::FLIPPING)) {
|
||||||
if (ui_flip->isChecked())
|
if (ui_flip->isChecked())
|
||||||
f_flip = "1";
|
f_flip = "1";
|
||||||
else
|
else
|
||||||
@ -2018,8 +2022,10 @@ void Courtroom::on_chat_return_pressed()
|
|||||||
packet_contents.append(f_text_color);
|
packet_contents.append(f_text_color);
|
||||||
|
|
||||||
// If the server we're on supports CCCC stuff, we should use it!
|
// If the server we're on supports CCCC stuff, we should use it!
|
||||||
if (ao_app->cccc_ic_supported) {
|
if (ao_app->m_serverdata.get_feature(
|
||||||
// If there is a showname entered, use that -- else, just send whatever the ini calls for.
|
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());
|
packet_contents.append(ui_ic_chat_name->text());
|
||||||
}
|
}
|
||||||
@ -2031,8 +2037,10 @@ void Courtroom::on_chat_return_pressed()
|
|||||||
// ourselves. Or a charid of -1 or lower, through some means.
|
// ourselves. Or a charid of -1 or lower, through some means.
|
||||||
if (other_charid > -1 && other_charid != m_cid) {
|
if (other_charid > -1 && other_charid != m_cid) {
|
||||||
QString packet = QString::number(other_charid);
|
QString packet = QString::number(other_charid);
|
||||||
if (ao_app->effects_supported) // Only servers with effects enabled will
|
if (ao_app->m_serverdata.get_feature(
|
||||||
// support pair reordering
|
server::BASE_FEATURE_SET::EFFECTS)) // Only servers with effects
|
||||||
|
// enabled will support pair
|
||||||
|
// reordering
|
||||||
packet += "^" + QString::number(pair_order);
|
packet += "^" + QString::number(pair_order);
|
||||||
packet_contents.append(packet);
|
packet_contents.append(packet);
|
||||||
}
|
}
|
||||||
@ -2040,8 +2048,9 @@ void Courtroom::on_chat_return_pressed()
|
|||||||
packet_contents.append("-1");
|
packet_contents.append("-1");
|
||||||
}
|
}
|
||||||
// Send the offset as it's gonna be used regardless
|
// Send the offset as it's gonna be used regardless
|
||||||
if(ao_app->y_offset_supported)
|
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));
|
packet_contents.append(QString::number(char_offset) + "&" +
|
||||||
|
QString::number(char_vert_offset));
|
||||||
else
|
else
|
||||||
packet_contents.append(QString::number(char_offset));
|
packet_contents.append(QString::number(char_offset));
|
||||||
|
|
||||||
@ -2056,7 +2065,7 @@ void Courtroom::on_chat_return_pressed()
|
|||||||
|
|
||||||
// If the server we're on supports Looping SFX and Screenshake, use it if the
|
// If the server we're on supports Looping SFX and Screenshake, use it if the
|
||||||
// emote uses it.
|
// 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(
|
packet_contents.append(
|
||||||
ao_app->get_sfx_looping(current_char, current_emote));
|
ao_app->get_sfx_looping(current_char, current_emote));
|
||||||
packet_contents.append(QString::number(screenshake_state));
|
packet_contents.append(QString::number(screenshake_state));
|
||||||
@ -2087,10 +2096,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");
|
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 =
|
QString p_effect_folder =
|
||||||
ao_app->read_char_ini(current_char, "effects", "Options");
|
ao_app->read_char_ini(current_char, "effects", "Options");
|
||||||
QString fx_sound =
|
QString fx_sound =
|
||||||
@ -2250,7 +2259,9 @@ void Courtroom::unpack_chatmessage(QStringList p_contents)
|
|||||||
// supports CCCC's IC features, or if it's just japing us. Also, don't
|
// 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.
|
// forget! A size 15 message will have indices from 0 to 14.
|
||||||
if (n_string < p_contents.size() &&
|
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);
|
m_chatmessage[n_string] = p_contents.at(n_string);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -2575,7 +2586,9 @@ void Courtroom::display_pair_character(QString other_charid, QString other_offse
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Flip the pair character
|
// 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);
|
ui_vp_sideplayer_char->set_flipped(true);
|
||||||
else
|
else
|
||||||
ui_vp_sideplayer_char->set_flipped(false);
|
ui_vp_sideplayer_char->set_flipped(false);
|
||||||
@ -3660,8 +3673,10 @@ void Courtroom::start_chat_ticking()
|
|||||||
|
|
||||||
QString f_blips = ao_app->get_blipname(m_chatmessage[CHAR_NAME]);
|
QString f_blips = ao_app->get_blipname(m_chatmessage[CHAR_NAME]);
|
||||||
f_blips = ao_app->get_blips(f_blips);
|
f_blips = ao_app->get_blips(f_blips);
|
||||||
if (ao_app->custom_blips_supported && !m_chatmessage[BLIPNAME].isEmpty()) {
|
if (ao_app->m_serverdata.get_feature(
|
||||||
f_blips = ao_app->get_blips(m_chatmessage[BLIPNAME]);
|
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);
|
blip_player->set_blips(f_blips);
|
||||||
|
|
||||||
@ -4053,9 +4068,11 @@ void Courtroom::handle_song(QStringList *p_contents)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!file_exists(ao_app->get_sfx_suffix(ao_app->get_music_path(f_song))) && !f_song.startsWith("http")
|
if (!file_exists(ao_app->get_sfx_suffix(ao_app->get_music_path(f_song))) &&
|
||||||
&& f_song != "~stop.mp3" && !ao_app->asset_url.isEmpty()) {
|
!f_song.startsWith("http") && f_song != "~stop.mp3" &&
|
||||||
f_song = (ao_app->asset_url + "sounds/music/" + f_song).toLower();
|
!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");
|
bool is_stop = (f_song == "~stop.mp3");
|
||||||
@ -4252,7 +4269,8 @@ void Courtroom::on_ooc_return_pressed()
|
|||||||
|
|
||||||
//We ignore it when the server is compatible with 2.8
|
//We ignore it when the server is compatible with 2.8
|
||||||
//Using an arbitrary 2.8 feature flag certainly won't cause issues someday.
|
//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") {
|
if (ooc_message == "/pos jud") {
|
||||||
show_judge_controls(true);
|
show_judge_controls(true);
|
||||||
}
|
}
|
||||||
@ -5006,10 +5024,12 @@ void Courtroom::on_music_list_double_clicked(QTreeWidgetItem *p_item,
|
|||||||
QStringList packet_contents;
|
QStringList packet_contents;
|
||||||
packet_contents.append(p_song);
|
packet_contents.append(p_song);
|
||||||
packet_contents.append(QString::number(m_cid));
|
packet_contents.append(QString::number(m_cid));
|
||||||
if ((!ui_ic_chat_name->text().isEmpty() && ao_app->cccc_ic_supported) ||
|
if ((!ui_ic_chat_name->text().isEmpty() &&
|
||||||
ao_app->effects_supported)
|
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());
|
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));
|
packet_contents.append(QString::number(music_flags));
|
||||||
ao_app->send_server_packet(new AOPacket("MC", packet_contents));
|
ao_app->send_server_packet(new AOPacket("MC", packet_contents));
|
||||||
}
|
}
|
||||||
@ -5136,10 +5156,12 @@ void Courtroom::music_stop(bool no_effects)
|
|||||||
packet_contents.append(
|
packet_contents.append(
|
||||||
fake_song); // this is our fake song, playing it triggers special code
|
fake_song); // this is our fake song, playing it triggers special code
|
||||||
packet_contents.append(QString::number(m_cid));
|
packet_contents.append(QString::number(m_cid));
|
||||||
if ((!ui_ic_chat_name->text().isEmpty() && ao_app->cccc_ic_supported) ||
|
if ((!ui_ic_chat_name->text().isEmpty() &&
|
||||||
ao_app->effects_supported)
|
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());
|
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)
|
if (no_effects)
|
||||||
packet_contents.append("0");
|
packet_contents.append("0");
|
||||||
else
|
else
|
||||||
@ -5311,8 +5333,8 @@ void Courtroom::on_pair_clicked()
|
|||||||
if (ui_pair_list->isHidden()) {
|
if (ui_pair_list->isHidden()) {
|
||||||
ui_pair_list->show();
|
ui_pair_list->show();
|
||||||
ui_pair_offset_spinbox->show();
|
ui_pair_offset_spinbox->show();
|
||||||
if(ao_app->y_offset_supported)
|
if (ao_app->m_serverdata.get_feature(server::BASE_FEATURE_SET::Y_OFFSET))
|
||||||
ui_pair_vert_offset_spinbox->show();
|
ui_pair_vert_offset_spinbox->show();
|
||||||
ui_pair_order_dropdown->show();
|
ui_pair_order_dropdown->show();
|
||||||
ui_mute_list->hide();
|
ui_mute_list->hide();
|
||||||
ui_mute->set_image("mute");
|
ui_mute->set_image("mute");
|
||||||
@ -5596,7 +5618,8 @@ void Courtroom::on_spectator_clicked() { char_clicked(-1); }
|
|||||||
|
|
||||||
void Courtroom::on_call_mod_clicked()
|
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;
|
QMessageBox errorBox;
|
||||||
QInputDialog input;
|
QInputDialog input;
|
||||||
|
|
||||||
|
@ -42,21 +42,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
|
|||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
// default(legacy) values
|
// default(legacy) values
|
||||||
yellow_text_supported = false;
|
m_serverdata.set_features(QStringList());
|
||||||
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;
|
|
||||||
|
|
||||||
QString f_hdid;
|
QString f_hdid;
|
||||||
f_hdid = get_hdid();
|
f_hdid = get_hdid();
|
||||||
@ -71,7 +57,7 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
|
|||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
client_id = f_contents.at(0).toInt();
|
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);
|
net_manager->server_connected(true);
|
||||||
|
|
||||||
@ -91,58 +77,11 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
|
|||||||
f_contents.at(1), "0");
|
f_contents.at(1), "0");
|
||||||
}
|
}
|
||||||
else if (header == "FL") {
|
else if (header == "FL") {
|
||||||
yellow_text_supported = false;
|
QStringList l_features = f_packet.split("#", Qt::SkipEmptyParts);
|
||||||
prezoom_supported = false;
|
l_features.removeAll("%");
|
||||||
flipping_supported = false;
|
l_features.removeAll("FL");
|
||||||
custom_objection_supported = false;
|
m_serverdata.set_features(l_features);
|
||||||
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;
|
|
||||||
log_to_demo = false;
|
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") {
|
else if (header == "PN") {
|
||||||
if (!lobby_constructed || f_contents.size() < 2)
|
if (!lobby_constructed || f_contents.size() < 2)
|
||||||
@ -162,47 +101,40 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
char_list_size = f_contents.at(0).toInt();
|
int char_list_size = f_contents.at(0).toInt();
|
||||||
evidence_list_size = f_contents.at(1).toInt();
|
int evidence_list_size = f_contents.at(1).toInt();
|
||||||
music_list_size = f_contents.at(2).toInt();
|
int music_list_size = f_contents.at(2).toInt();
|
||||||
|
|
||||||
if (char_list_size < 0 || evidence_list_size < 0 || music_list_size < 0)
|
if (char_list_size < 0 || evidence_list_size < 0 || music_list_size < 0)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
loaded_chars = 0;
|
generated_chars = 0;
|
||||||
loaded_evidence = 0;
|
|
||||||
loaded_music = 0;
|
|
||||||
generated_chars = 0;
|
|
||||||
|
|
||||||
destruct_courtroom();
|
destruct_courtroom();
|
||||||
construct_courtroom();
|
construct_courtroom();
|
||||||
|
|
||||||
courtroom_loaded = false;
|
courtroom_loaded = false;
|
||||||
|
|
||||||
int selected_server = w_lobby->get_selected_server();
|
int selected_server = w_lobby->get_selected_server();
|
||||||
QString server_address = "", server_name = "";
|
QString server_address = "", server_name = "";
|
||||||
switch (w_lobby->pageSelected()) {
|
switch (w_lobby->pageSelected()) {
|
||||||
case 0:
|
case 0:
|
||||||
if (selected_server >= 0 && selected_server < server_list.size()) {
|
if (selected_server >= 0 && selected_server < server_list.size()) {
|
||||||
auto info = server_list.at(selected_server);
|
auto info = server_list.at(selected_server);
|
||||||
server_name = info.name;
|
server_name = info.name;
|
||||||
server_address =
|
server_address = QString("%1:%2").arg(info.ip, QString::number(info.port));
|
||||||
QString("%1:%2").arg(info.ip, QString::number(info.port));
|
window_title = server_name;
|
||||||
window_title = server_name;
|
}
|
||||||
}
|
break;
|
||||||
break;
|
case 1: {
|
||||||
case 1:
|
QVector<server_type> favorite_list = Options::getInstance().favorites();
|
||||||
{
|
if (selected_server >= 0 && selected_server < favorite_list.size()) {
|
||||||
QVector<server_type> favorite_list = Options::getInstance().favorites();
|
auto info = favorite_list.at(selected_server);
|
||||||
if (selected_server >= 0 && selected_server < favorite_list.size()) {
|
server_name = info.name;
|
||||||
auto info = favorite_list.at(selected_server);
|
server_address = QString("%1:%2").arg(info.ip, QString::number(info.port));
|
||||||
server_name = info.name;
|
window_title = server_name;
|
||||||
server_address =
|
}
|
||||||
QString("%1:%2").arg(info.ip, QString::number(info.port));
|
} break;
|
||||||
window_title = server_name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 2:
|
case 2:
|
||||||
window_title = "Local Demo Recording";
|
window_title = "Local Demo Recording";
|
||||||
break;
|
break;
|
||||||
@ -285,7 +217,6 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
|
|||||||
int areas = 0;
|
int areas = 0;
|
||||||
|
|
||||||
for (int n_element = 0; n_element < f_contents.size(); ++n_element) {
|
for (int n_element = 0; n_element < f_contents.size(); ++n_element) {
|
||||||
++loaded_music;
|
|
||||||
if (musics_time) {
|
if (musics_time) {
|
||||||
w_courtroom->append_music(f_contents.at(n_element));
|
w_courtroom->append_music(f_contents.at(n_element));
|
||||||
}
|
}
|
||||||
@ -582,9 +513,11 @@ void AOApplication::server_packet_received(AOPacket *p_packet)
|
|||||||
}
|
}
|
||||||
// Auth packet
|
// Auth packet
|
||||||
else if (header == "AUTH") {
|
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;
|
goto end;
|
||||||
}
|
}
|
||||||
bool ok;
|
bool ok;
|
||||||
int authenticated = f_contents.at(0).toInt(&ok);
|
int authenticated = f_contents.at(0).toInt(&ok);
|
||||||
if (!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.
|
if (f_contents.size() > 1 || f_contents.isEmpty()) { // This can never be more than one link.
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
QUrl t_asset_url = QUrl::fromPercentEncoding(f_contents.at(0).toUtf8());
|
|
||||||
if (t_asset_url.isValid())
|
m_serverdata.set_asset_url(f_contents.at(0));
|
||||||
asset_url = t_asset_url.toString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (log_to_demo) {
|
if (log_to_demo) {
|
||||||
|
40
src/serverdata.cpp
Normal file
40
src/serverdata.cpp
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#include <serverdata.h>
|
||||||
|
|
||||||
|
#include <QUrl>
|
||||||
|
#include <QVariant>
|
||||||
|
|
||||||
|
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
|
Loading…
Reference in New Issue
Block a user