From 5747df6ef29e7e7913a2ae2ea7b0cf27d74d2807 Mon Sep 17 00:00:00 2001 From: JAJames Date: Tue, 12 Jul 2016 18:44:40 -0400 Subject: [PATCH] RenX.Core: Further RCONv4 adjustments RenX.Commands: Added safety check RenX.Ladder: "OnlyPure" config option now has meaning RenX.ServerList: Added browser.jsp Updated Config.ini text --- Config.ini | 5 +- Release/Plugins/RenX.Core.lib | Bin 206580 -> 207686 bytes RenX.Commands/RenX_Commands.cpp | 11 +- RenX.Core/RenX_Core.h | 5 - RenX.Core/RenX_Server.cpp | 39 +++++-- RenX.Core/RenX_Server.h | 26 ++--- RenX.Ladder/RenX_Ladder.cpp | 16 ++- RenX.Ladder/RenX_Ladder.h | 1 + RenX.ServerList/RenX_ServerList.cpp | 156 ++++++++++++++++++++++++++-- RenX.ServerList/RenX_ServerList.h | 6 +- 10 files changed, 220 insertions(+), 45 deletions(-) diff --git a/Config.ini b/Config.ini index 3598451..46c45f1 100644 --- a/Config.ini +++ b/Config.ini @@ -8,10 +8,7 @@ ; ; This block is used to define settings that are global in nature. -; Currently, there is a "Servers" option to specify what sections -; to look at for server configuration options, and a "Plugins" -; option that specifies which plugins to load from the Plugins -; folder. +; "Plugins" specifies which plugins to load from the Plugins directory. ; DO NOT INCLUDE A PLUGIN'S FILE EXTENSION (.dll or .so). ; ; Settings: diff --git a/Release/Plugins/RenX.Core.lib b/Release/Plugins/RenX.Core.lib index 7074fe333ba9d9c272730027de8fea0b84716254..a3fa08637fa87ae667b674bc1469902d5aee884f 100644 GIT binary patch delta 23455 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 BRG|O> delta 23364 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 W@*oUV5&3-V3WNGjRi%getChannel(channel)->getType(); @@ -340,6 +340,12 @@ void PlayersIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString & noServers = false; if (server->players.size() != server->getBotCount()) { + if (server->players.size() == 0) + { + source->sendMessage(channel, Jupiter::StringS::Format("ERROR: NO PLAYERS BUT BOT_COUNT = %u.", server->getBotCount())); + continue; + } + // End string containers Jupiter::DLList gStrings; Jupiter::DLList nStrings; @@ -451,7 +457,8 @@ void PlayersIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString & } source->sendMessage(channel, out); } - else source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("No players are in-game.")); + else + source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("No players are in-game.")); } } if (noServers) diff --git a/RenX.Core/RenX_Core.h b/RenX.Core/RenX_Core.h index a26e8c9..c1fe2d2 100644 --- a/RenX.Core/RenX_Core.h +++ b/RenX.Core/RenX_Core.h @@ -170,11 +170,6 @@ namespace RenX */ void banCheck(); - /** - * @brief Initializes the Core. - */ - void init(); - /** * Destructor for the Core class. */ diff --git a/RenX.Core/RenX_Server.cpp b/RenX.Core/RenX_Server.cpp index c13e3a5..9c50276 100644 --- a/RenX.Core/RenX_Server.cpp +++ b/RenX.Core/RenX_Server.cpp @@ -931,6 +931,11 @@ void RenX::Server::setCommandPrefix(const Jupiter::ReadableString &prefix) RenX::Server::CommandPrefix = prefix; } +void RenX::Server::setRanked(bool in_value) +{ + RenX::Server::m_ranked = in_value; +} + const Jupiter::ReadableString &RenX::Server::getRules() const { return RenX::Server::rules; @@ -986,6 +991,16 @@ int RenX::Server::getTimeLimit() const return RenX::Server::timeLimit; } +int RenX::Server::getTeamMode() const +{ + return RenX::Server::m_team_mode; +} + +int RenX::Server::getGameType() const +{ + return RenX::Server::m_game_type; +} + double RenX::Server::getCrateRespawnDelay() const { return RenX::Server::crateRespawnAfterPickup; @@ -1006,14 +1021,14 @@ bool RenX::Server::isPrivateMessagingEnabled() const return RenX::Server::allowPrivateMessaging; } -bool RenX::Server::isPassworded() const +bool RenX::Server::isRanked() const { - return RenX::Server::passworded; + return RenX::Server::m_ranked; } -bool RenX::Server::isAutoBalanceEnabled() const +bool RenX::Server::isPassworded() const { - return RenX::Server::autoBalanceTeams; + return RenX::Server::passworded; } bool RenX::Server::isCratesEnabled() const @@ -1021,6 +1036,11 @@ bool RenX::Server::isCratesEnabled() const return RenX::Server::spawnCrates; } +bool RenX::Server::isBotsEnabled() const +{ + return RenX::Server::botsEnabled; +} + const Jupiter::ReadableString &RenX::Server::getPassword() const { return RenX::Server::pass; @@ -1912,7 +1932,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { if (this->lastCommandParams.isEmpty()) { - // "PlayerLimit" | PlayerLimit | "VehicleLimit" | VehicleLimit | "MineLimit" | MineLimit | "TimeLimit" | TimeLimit | "bPassworded" | bPassworded | "bSteamRequired" | bSteamRequired | "bPrivateMessageTeamOnly" | bPrivateMessageTeamOnly | "bAllowPrivateMessaging" | bAllowPrivateMessaging | "bAutoBalanceTeams" | bAutoBalanceTeams | "bSpawnCrates" | bSpawnCrates | "CrateRespawnAfterPickup" | CrateRespawnAfterPickup | bIsCompetitive | "bIsCompetitive" + // "PlayerLimit" | PlayerLimit | "VehicleLimit" | VehicleLimit | "MineLimit" | MineLimit | "TimeLimit" | TimeLimit | "bPassworded" | bPassworded | "bSteamRequired" | bSteamRequired | "bPrivateMessageTeamOnly" | bPrivateMessageTeamOnly | "bAllowPrivateMessaging" | bAllowPrivateMessaging | "TeamMode" | TeamMode | "bSpawnCrates" | bSpawnCrates | "CrateRespawnAfterPickup" | CrateRespawnAfterPickup | bIsCompetitive | "bIsCompetitive" this->playerLimit = tokens.getToken(1).asInt(); this->vehicleLimit = tokens.getToken(3).asInt(); this->mineLimit = tokens.getToken(5).asInt(); @@ -1921,7 +1941,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) this->steamRequired = tokens.getToken(11).asBool(); this->privateMessageTeamOnly = tokens.getToken(13).asBool(); this->allowPrivateMessaging = tokens.getToken(15).asBool(); - this->autoBalanceTeams = tokens.getToken(17).asBool(); + this->m_team_mode = this->rconVersion >= 4 ? tokens.getToken(17).asInt() : true; this->spawnCrates = tokens.getToken(19).asBool(); this->crateRespawnAfterPickup = tokens.getToken(21).asDouble(); @@ -1940,6 +1960,9 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) this->match_state = 3; else // Unknown state -- assume it's in progress this->match_state = 1; + + this->botsEnabled = tokens.getToken(27).asBool(); + this->m_game_type = tokens.getToken(29).asInt(); } } } @@ -3340,6 +3363,10 @@ void RenX::Server::wipeData() delete player; } RenX::Server::reliable = false; + RenX::Server::m_team_mode = 3; + RenX::Server::m_game_type = 1; + RenX::Server::m_ranked = false; + RenX::Server::botsEnabled = true; RenX::Server::match_state = 1; RenX::Server::subscribed = false; RenX::Server::fully_connected = false; diff --git a/RenX.Core/RenX_Server.h b/RenX.Core/RenX_Server.h index f2c2006..bb58ce4 100644 --- a/RenX.Core/RenX_Server.h +++ b/RenX.Core/RenX_Server.h @@ -686,6 +686,8 @@ namespace RenX */ void setCommandPrefix(const Jupiter::ReadableString &prefix); + void setRanked(bool in_value); + /** * @brief Fetches the rules of a server. * @@ -736,28 +738,17 @@ namespace RenX */ std::chrono::milliseconds getDelay() const; - /** - server->getMineLimit(), - json_bool_as_cstring(server->isSteamRequired()), - json_bool_as_cstring(server->isPrivateMessageTeamOnly()), - json_bool_as_cstring(server->isPassworded()), - json_bool_as_cstring(server->isPrivateMessagingEnabled()), - server->getPlayerLimit(), - server->getVehicleLimit(), - json_bool_as_cstring(server->isAutoBalanceTeams()), - json_bool_as_cstring(server->isCratesEnabled()), - server->getCrateRespawnDelay(), - server->getTimeLimit(), - */ - int getMineLimit() const; int getPlayerLimit() const; int getVehicleLimit() const; int getTimeLimit() const; + int getTeamMode() const; + int getGameType() const; double getCrateRespawnDelay() const; bool isSteamRequired() const; bool isPrivateMessageTeamOnly() const; bool isPrivateMessagingEnabled() const; + bool isRanked() const; /** * @brief Checks if the server has a game password. @@ -766,8 +757,8 @@ namespace RenX */ bool isPassworded() const; - bool isAutoBalanceEnabled() const; bool isCratesEnabled() const; + bool isBotsEnabled() const; /** * @brief Fetches the RCON password of a server. @@ -1033,12 +1024,15 @@ namespace RenX bool steamRequired = false; bool privateMessageTeamOnly = false; bool allowPrivateMessaging = true; - bool autoBalanceTeams = true; bool spawnCrates = true; + bool botsEnabled = true; bool competitive = false; bool devBot = false; bool reliable = false; + bool m_ranked = false; + int m_team_mode = 3; /** 0 = static, 1 = swap, 2 = random swap, 3 = shuffle, 4 = traditional (assign as players connect) */ int match_state = 1; /** 0 = pending, 1 = in progress, 2 = over, 3 = travelling */ + int m_game_type = 1; /** < 0 = Invalid, 0 = Main Menu, 1 = Rx_Game, 2 = TS_Game, > 2 = Unassigned */ int attempts = 0; int playerLimit = 0; int vehicleLimit = 0; diff --git a/RenX.Ladder/RenX_Ladder.cpp b/RenX.Ladder/RenX_Ladder.cpp index 5e2c57a..abe2153 100644 --- a/RenX.Ladder/RenX_Ladder.cpp +++ b/RenX.Ladder/RenX_Ladder.cpp @@ -35,14 +35,28 @@ bool RenX_LadderPlugin::initialize() else RenX_LadderPlugin::max_ladder_command_part_name_output = mlcpno; + RenX::Server *server; + for (size_t index = 0; index != RenX::getCore()->getServerCount(); ++index) + { + server = RenX::getCore()->getServer(index); + if (this->only_pure == false || server->isPure()) + server->setRanked(true); + } + return true; } +void RenX_LadderPlugin::RenX_OnServerFullyConnected(RenX::Server *server) +{ + if (this->only_pure == false || server->isPure()) + server->setRanked(true); +} + /** Wait until the client list has been updated to update the ladder */ void RenX_LadderPlugin::RenX_OnGameOver(RenX::Server *server, RenX::WinType winType, const RenX::TeamType &team, int gScore, int nScore) { - if (server->isReliable() && server->players.size() != server->getBotCount()) + if (server->isRanked() && server->isReliable() && server->players.size() != server->getBotCount()) { char chr = static_cast(team); server->varData.set(this->name, "t"_jrs, Jupiter::ReferenceString(&chr, 1)); diff --git a/RenX.Ladder/RenX_Ladder.h b/RenX.Ladder/RenX_Ladder.h index 5b129da..01b24c8 100644 --- a/RenX.Ladder/RenX_Ladder.h +++ b/RenX.Ladder/RenX_Ladder.h @@ -36,6 +36,7 @@ class RenX_LadderPlugin : public RenX::Plugin { public: virtual bool initialize() override; + void RenX_OnServerFullyConnected(RenX::Server *server) override; void RenX_OnGameOver(RenX::Server *server, RenX::WinType winType, const RenX::TeamType &team, int gScore, int nScore) override; void RenX_OnCommand(RenX::Server *server, const Jupiter::ReadableString &) override; diff --git a/RenX.ServerList/RenX_ServerList.cpp b/RenX.ServerList/RenX_ServerList.cpp index 06420db..0145a94 100644 --- a/RenX.ServerList/RenX_ServerList.cpp +++ b/RenX.ServerList/RenX_ServerList.cpp @@ -30,6 +30,9 @@ using namespace Jupiter::literals; static STRING_LITERAL_AS_NAMED_REFERENCE(CONTENT_TYPE_APPLICATION_JSON, "application/json"); +const Jupiter::ReferenceString server_list_game_header = ""_jrs; +const Jupiter::ReferenceString server_list_game_footer = "\n"_jrs; + Jupiter::String jsonify(const Jupiter::ReadableString &in_str) { const char *ptr = in_str.ptr(); @@ -49,7 +52,65 @@ Jupiter::String jsonify(const Jupiter::ReadableString &in_str) result += '\"'; } else if (*ptr < 0x20) // control characters - result += Jupiter::StringS::Format("\\u00%x", *ptr); + result.aformat("\\u00%x", *ptr); + else if ((*ptr & 0x80) != 0) // UTF-8 sequence; copy to bypass above processing + { + result += *ptr; + + if ((*ptr & 0x40) != 0) + { + // this is a 2+ byte sequence + + if ((*ptr & 0x20) != 0) + { + // this is a 3+ byte sequence + + if ((*ptr & 0x10) != 0) + { + // this is a 4 byte sequnce + result += *++ptr; + } + + result += *++ptr; + } + + result += *++ptr; + } + } + else // Character in standard ASCII table + result += *ptr; + + ++ptr; + --str_length; + } + + return result; +} + +Jupiter::String sanitize_game(const Jupiter::ReadableString &in_str) +{ + const char *ptr = in_str.ptr(); + size_t str_length = in_str.size(); + Jupiter::String result(str_length); + + while (str_length != 0) + { + if (*ptr == '\\') // backslash + { + result += '\\'; + result += '\\'; + } + else if (*ptr == '\"') // quotation + { + result += '\\'; + result += '\"'; + } + else if (*ptr < 0x20) // control characters + result.aformat("\\u00%x", *ptr); + else if (*ptr == '~') // Game server list control character + result += "\\u007E"_jrs; + else if (*ptr == ';') // Game server list control character + result += "\\u003B"_jrs; else if ((*ptr & 0x80) != 0) // UTF-8 sequence; copy to bypass above processing { result += *ptr; @@ -91,6 +152,7 @@ bool RenX_ServerListPlugin::initialize() RenX_ServerListPlugin::server_list_page_name = this->config.get(Jupiter::ReferenceString::empty, "ServersPageName"_jrs, "servers.jsp"_jrs); RenX_ServerListPlugin::server_list_long_page_name = this->config.get(Jupiter::ReferenceString::empty, "HumanServersPageName"_jrs, "servers_long.jsp"_jrs); RenX_ServerListPlugin::server_page_name = this->config.get(Jupiter::ReferenceString::empty, "ServerPageName"_jrs, "server.jsp"_jrs); + RenX_ServerListPlugin::game_server_list_page_name = this->config.get(Jupiter::ReferenceString::empty, "ServersGamePageName"_jrs, "browser.jsp"_jrs); /** Initialize content */ Jupiter::HTTP::Server &server = getHTTPServer(); @@ -119,6 +181,14 @@ bool RenX_ServerListPlugin::initialize() content->free_result = true; server.hook(RenX_ServerListPlugin::web_hostname, RenX_ServerListPlugin::web_path, content); + // Game server list page + content = new Jupiter::HTTP::Server::Content(RenX_ServerListPlugin::game_server_list_page_name, handle_game_server_list_page); + content->language = &Jupiter::HTTP::Content::Language::ENGLISH; + content->type = &Jupiter::HTTP::Content::Type::Text::HTML; + content->charset = &Jupiter::HTTP::Content::Type::Text::Charset::ASCII; + content->free_result = false; + server.hook(RenX_ServerListPlugin::web_hostname, RenX_ServerListPlugin::web_path, content); + this->updateServerList(); return true; } @@ -135,11 +205,14 @@ Jupiter::ReadableString *RenX_ServerListPlugin::getServerListJSON() return std::addressof(RenX_ServerListPlugin::server_list_json); } -const char *json_bool_as_cstring(bool in) +Jupiter::ReadableString *RenX_ServerListPlugin::getServerListGame() +{ + return std::addressof(RenX_ServerListPlugin::server_list_game); +} + +constexpr const char *json_bool_as_cstring(bool in) { - if (in) - return "true"; - return "false"; + return in ? "true" : "false"; } Jupiter::StringS server_as_json(const RenX::Server *server) @@ -150,7 +223,7 @@ Jupiter::StringS server_as_json(const RenX::Server *server) Jupiter::String server_map = jsonify(server->getMap().name); Jupiter::String server_version = jsonify(server->getGameVersion()); - server_json_block.format(R"json({"Name":"%.*s","Current Map":"%.*s","Bots":%u,"Players":%u,"Game Version":"%.*s","Variables":{"Mine Limit":%d,"bSteamRequired":%s,"bPrivateMessageTeamOnly":%s,"bPassworded":%s,"bAllowPrivateMessaging":%s,"Player Limit":%d,"Vehicle Limit":%d,"bAutoBalanceTeams":%s,"bSpawnCrates":%s,"CrateRespawnAfterPickup":%f,"Time Limit":%d},"Port":%u,"IP":"%.*s")json", + server_json_block.format(R"json({"Name":"%.*s","Current Map":"%.*s","Bots":%u,"Players":%u,"Game Version":"%.*s","Variables":{"Mine Limit":%d,"bSteamRequired":%s,"bPrivateMessageTeamOnly":%s,"bPassworded":%s,"bAllowPrivateMessaging":%s,"Player Limit":%d,"Vehicle Limit":%d,"bAutoBalanceTeams":%s,"Team Mode":%d,"bSpawnCrates":%s,"CrateRespawnAfterPickup":%f,"Time Limit":%d},"Port":%u,"IP":"%.*s")json", server_name.size(), server_name.ptr(), server_map.size(), server_map.ptr(), server->getBotCount(), @@ -163,7 +236,8 @@ Jupiter::StringS server_as_json(const RenX::Server *server) json_bool_as_cstring(server->isPrivateMessagingEnabled()), server->getPlayerLimit(), server->getVehicleLimit(), - json_bool_as_cstring(server->isAutoBalanceEnabled()), + json_bool_as_cstring(server->getTeamMode() == 3), + server->getTeamMode(), json_bool_as_cstring(server->isCratesEnabled()), server->getCrateRespawnDelay(), server->getTimeLimit(), @@ -175,6 +249,42 @@ Jupiter::StringS server_as_json(const RenX::Server *server) return server_json_block; } +Jupiter::StringS server_as_game(const RenX::Server *server) +{ + Jupiter::String server_game_block(128); + + Jupiter::String server_name = sanitize_game(server->getName()); + Jupiter::String server_map = sanitize_game(server->getMap().name); + Jupiter::String server_version = sanitize_game(server->getGameVersion()); + + server_game_block.format("\n<@>%.*s~%.*s~%u~%s~%.*s~" "%d;%d;%d;%s;%d;%d;%d;%s;%s;%s;%.*s;%s" "~%u~%d~%s~%s", + server_name.size(), server_name.ptr(), + server->getSocketHostname().size(), server->getSocketHostname().ptr(), + server->getPort(), + json_bool_as_cstring(server->isPassworded()), + server_map.size(), server_map.ptr(), + //START OPTIONS + server->getPlayerLimit(), + server->getVehicleLimit(), + server->getMineLimit(), + json_bool_as_cstring(server->isCratesEnabled()), + server->getGameType(), + server->getTeamMode(), + server->getTimeLimit(), + json_bool_as_cstring(server->isPrivateMessagingEnabled()), + json_bool_as_cstring(server->isPrivateMessageTeamOnly()), + json_bool_as_cstring(server->isSteamRequired()), + server_version.size(), server_version.ptr(), + json_bool_as_cstring(server->isBotsEnabled()), + //END OPTIONS + server->players.size() - server->getBotCount(), + server->getPlayerLimit(), + json_bool_as_cstring(server->isRanked()), // json_bool_as_cstring(plugin != nullptr && (reinterpret_cast(plugin)->isOnlyPure() == false || server->isPure())), + json_bool_as_cstring(server->isMatchInProgress())); + + return server_game_block; +} + Jupiter::StringS server_as_long_json(const RenX::Server *server) { Jupiter::String server_json_block(128); @@ -198,6 +308,7 @@ Jupiter::StringS server_as_long_json(const RenX::Server *server) "Player Limit": %d, "Vehicle Limit": %d, "bAutoBalanceTeams": %s, + "Team Mode": %d "bSpawnCrates": %s, "CrateRespawnAfterPickup": %f, "Time Limit": %d @@ -218,7 +329,8 @@ Jupiter::StringS server_as_long_json(const RenX::Server *server) json_bool_as_cstring(server->isPrivateMessagingEnabled()), server->getPlayerLimit(), server->getVehicleLimit(), - json_bool_as_cstring(server->isAutoBalanceEnabled()), + json_bool_as_cstring(server->getTeamMode() == 3), + server->getTeamMode(), json_bool_as_cstring(server->isCratesEnabled()), server->getCrateRespawnDelay(), server->getTimeLimit(), @@ -294,6 +406,21 @@ void RenX_ServerListPlugin::addServerToServerList(RenX::Server *server) RenX_ServerListPlugin::server_list_json += ']'; } + // append to server_list_game + + if (RenX_ServerListPlugin::server_list_game.isEmpty()) + { + RenX_ServerListPlugin::server_list_game = server_list_game_header; + RenX_ServerListPlugin::server_list_game += server_as_game(server); + RenX_ServerListPlugin::server_list_game += server_list_game_footer; + } + else + { + RenX_ServerListPlugin::server_list_game.truncate(server_list_game_footer.size()); // remove trailing "" + RenX_ServerListPlugin::server_list_game += server_as_game(server); + RenX_ServerListPlugin::server_list_game += server_list_game_footer; + } + // add to individual listing server_json_block = '{'; @@ -352,9 +479,10 @@ void RenX_ServerListPlugin::updateServerList() size_t index = 0; RenX::Server *server; - // regenerate server_list_json + // regenerate server_list_json and server_list_Game RenX_ServerListPlugin::server_list_json = '['; + RenX_ServerListPlugin::server_list_game = server_list_game_header; while (index != servers.size()) { @@ -362,6 +490,8 @@ void RenX_ServerListPlugin::updateServerList() if (server->isConnected() && server->isFullyConnected()) { RenX_ServerListPlugin::server_list_json += server_as_json(server); + RenX_ServerListPlugin::server_list_game += server_as_game(server); + ++index; break; } @@ -374,11 +504,14 @@ void RenX_ServerListPlugin::updateServerList() { RenX_ServerListPlugin::server_list_json += ','; RenX_ServerListPlugin::server_list_json += server_as_json(server); + + RenX_ServerListPlugin::server_list_game += server_as_game(server); } ++index; } RenX_ServerListPlugin::server_list_json += ']'; + RenX_ServerListPlugin::server_list_game += server_list_game_footer; } void RenX_ServerListPlugin::RenX_OnServerFullyConnected(RenX::Server *server) @@ -495,6 +628,11 @@ Jupiter::ReadableString *handle_server_page(const Jupiter::ReadableString &query return new Jupiter::ReferenceString(server->varData.get(pluginInstance.getName(), "j"_jrs)); } +Jupiter::ReadableString *handle_game_server_list_page(const Jupiter::ReadableString &query_string) +{ + return pluginInstance.getServerListGame(); +} + extern "C" __declspec(dllexport) Jupiter::Plugin *getPlugin() { return &pluginInstance; diff --git a/RenX.ServerList/RenX_ServerList.h b/RenX.ServerList/RenX_ServerList.h index 3179c98..7bc152c 100644 --- a/RenX.ServerList/RenX_ServerList.h +++ b/RenX.ServerList/RenX_ServerList.h @@ -27,6 +27,7 @@ class RenX_ServerListPlugin : public RenX::Plugin { public: // RenX_ServerListPlugin Jupiter::ReadableString *getServerListJSON(); + Jupiter::ReadableString *getServerListGame(); void addServerToServerList(RenX::Server *server); void updateServerList(); @@ -42,12 +43,13 @@ public: // RenX::Plugin void RenX_OnMapLoad(RenX::Server *server, const Jupiter::ReadableString &map) override; private: - Jupiter::StringS server_list_json; - Jupiter::StringS web_hostname, web_path, server_list_page_name, server_list_long_page_name, server_page_name; + Jupiter::StringS server_list_json, server_list_game; + Jupiter::StringS web_hostname, web_path, server_list_page_name, server_list_long_page_name, server_page_name, game_server_list_page_name; }; Jupiter::ReadableString *handle_server_list_page(const Jupiter::ReadableString &); Jupiter::ReadableString *handle_server_list_long_page(const Jupiter::ReadableString &); Jupiter::ReadableString *handle_server_page(const Jupiter::ReadableString &query_string); +Jupiter::ReadableString *handle_game_server_list_page(const Jupiter::ReadableString &); #endif // _RENX_SERVERLIST_H_HEADER