From 50a48505403a60fdeb2f4b06f2788266f3238743 Mon Sep 17 00:00:00 2001 From: Jessica James Date: Sat, 27 Jun 2020 11:50:30 -0500 Subject: [PATCH] Server attributes (untested) --- .../RenX/RenX.ServerList/RenX_ServerList.cpp | 63 ++++++++++++++++--- .../RenX/RenX.ServerList/RenX_ServerList.h | 1 + 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/src/Plugins/RenX/RenX.ServerList/RenX_ServerList.cpp b/src/Plugins/RenX/RenX.ServerList/RenX_ServerList.cpp index 4d4e06d..0a92e3c 100644 --- a/src/Plugins/RenX/RenX.ServerList/RenX_ServerList.cpp +++ b/src/Plugins/RenX/RenX.ServerList/RenX_ServerList.cpp @@ -205,6 +205,11 @@ Jupiter::StringS RenX_ServerListPlugin::server_as_json(const RenX::Server &serve Jupiter::String server_json_block(128); ListServerInfo serverInfo = getListServerInfo(server); + if (serverInfo.hostname.isEmpty()) { + server_json_block = "null"; + return server_json_block; + } + Jupiter::String server_name = jsonify(server.getName()); Jupiter::String server_map = jsonify(server.getMap().name); Jupiter::String server_version = jsonify(server.getGameVersion()); @@ -212,18 +217,35 @@ Jupiter::StringS RenX_ServerListPlugin::server_as_json(const RenX::Server &serve unsigned short server_port = serverInfo.port; Jupiter::String server_prefix = jsonify(serverInfo.namePrefix); - // We're just going to omit it if it's not populated instead of supplying blank strings, so make full JSON member + // Some members we only include if they're populated if (!server_prefix.isEmpty()) { server_prefix = R"json("NamePrefix":")json"_jrs + server_prefix + "\","_jrs; } - server_json_block.format(R"json({"Name":"%.*s",%.*s"Current Map":"%.*s","Bots":%u,"Players":%u,"Game Version":"%.*s","Variables":{"Mine Limit":%d,"bSteamRequired":%s,"bPrivateMessageTeamOnly":%s,"bPassworded":%s,"bAllowPrivateMessaging":%s,"bRanked":%s,"Game Type":%d,"Player Limit":%d,"Vehicle Limit":%d,"bAutoBalanceTeams":%s,"Team Mode":%d,"bSpawnCrates":%s,"CrateRespawnAfterPickup":%f,"Time Limit":%d},"Port":%u,"IP":"%.*s")json", + std::string server_attributes; + if (!serverInfo.attributes.empty()) { + server_attributes.reserve(16 * serverInfo.attributes.size() + 16); + server_attributes = R"json("Attributes":[)json"; + + for (Jupiter::ReferenceString& attribute : serverInfo.attributes) { + server_attributes += '\"'; + server_attributes.append(attribute.ptr(), attribute.size()); + server_attributes += "\","; + } + + server_attributes.back() = ']'; + server_attributes += ','; + } + + // Build block + server_json_block.format(R"json({"Name":"%.*s",%.*s"Current Map":"%.*s","Bots":%u,"Players":%u,"Game Version":"%.*s",%.*s"Variables":{"Mine Limit":%d,"bSteamRequired":%s,"bPrivateMessageTeamOnly":%s,"bPassworded":%s,"bAllowPrivateMessaging":%s,"bRanked":%s,"Game Type":%d,"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_prefix.size(), server_prefix.ptr(), server_map.size(), server_map.ptr(), server.getBotCount(), server.activePlayers(false).size(), server_version.size(), server_version.ptr(), + server_attributes.size(), server_attributes.data(), server.getMineLimit(), json_bool_as_cstring(server.isSteamRequired()), json_bool_as_cstring(server.isPrivateMessageTeamOnly()), @@ -259,6 +281,24 @@ Jupiter::StringS RenX_ServerListPlugin::server_as_long_json(const RenX::Server & Jupiter::String server_prefix = jsonify(serverInfo.namePrefix); std::vector activePlayers = server.activePlayers(false); + std::string server_attributes = "[]"; + if (!serverInfo.attributes.empty()) { + server_attributes.reserve(16 * serverInfo.attributes.size() + 16); + server_attributes = "["; + + const char* comma = "\n"; + for (Jupiter::ReferenceString& attribute : serverInfo.attributes) { + server_attributes += comma; + comma = ",\n"; + + server_attributes += "\t\t\t\""; + server_attributes.append(attribute.ptr(), attribute.size()); + server_attributes += "\""; + } + + server_attributes += "\n\t\t],"; + } + server_json_block.format(R"json({ "Name": "%.*s", "NamePrefix": "%.*s", @@ -266,6 +306,7 @@ Jupiter::StringS RenX_ServerListPlugin::server_as_long_json(const RenX::Server & "Bots": %u, "Players": %u, "Game Version": "%.*s", + "Attributes": %.*s, "Variables": { "Mine Limit": %d, "bSteamRequired": %s, @@ -288,6 +329,7 @@ Jupiter::StringS RenX_ServerListPlugin::server_as_long_json(const RenX::Server & server.getBotCount(), activePlayers.size(), server_version.size(), server_version.ptr(), + server_attributes.size(), server_attributes.data(), server.getMineLimit(), json_bool_as_cstring(server.isSteamRequired()), @@ -382,20 +424,19 @@ void RenX_ServerListPlugin::addServerToServerList(RenX::Server &server) Jupiter::String server_json_block(256); // append to server_list_json - + server_json_block = server_as_json(server); if (RenX_ServerListPlugin::server_list_json.size() <= 2) { RenX_ServerListPlugin::server_list_json = '['; - RenX_ServerListPlugin::server_list_json += server_as_json(server); - RenX_ServerListPlugin::server_list_json += ']'; } else { RenX_ServerListPlugin::server_list_json.truncate(1); // remove trailing ']'. RenX_ServerListPlugin::server_list_json += ','; - RenX_ServerListPlugin::server_list_json += server_as_json(server); - RenX_ServerListPlugin::server_list_json += ']'; } + RenX_ServerListPlugin::server_list_json += server_json_block; + RenX_ServerListPlugin::server_list_json += ']'; + server_json_block.erase(); // add to individual listing @@ -543,6 +584,14 @@ RenX_ServerListPlugin::ListServerInfo RenX_ServerListPlugin::getListServerInfo(c result.hostname = section->get("ListAddress"_jrs, result.hostname); result.port = section->get("ListPort"_jrs, result.port); result.namePrefix = section->get("ListNamePrefix"_jrs, result.namePrefix); + + // Attributes + Jupiter::ReferenceString attributes_str = section->get("ListAttributes"_jrs); + if (attributes_str.isNotEmpty()) { + // TODO: Make tokenize just return a vector instead of this crap + Jupiter::ReadableString::TokenizeResult attributes = Jupiter::ReferenceString::tokenize(attributes_str, ' '); + result.attributes.assign(attributes.tokens, attributes.tokens + attributes.token_count); + } }; // Populate with standard information diff --git a/src/Plugins/RenX/RenX.ServerList/RenX_ServerList.h b/src/Plugins/RenX/RenX.ServerList/RenX_ServerList.h index 33532f5..535827e 100644 --- a/src/Plugins/RenX/RenX.ServerList/RenX_ServerList.h +++ b/src/Plugins/RenX/RenX.ServerList/RenX_ServerList.h @@ -30,6 +30,7 @@ public: // RenX_ServerListPlugin Jupiter::ReferenceString hostname; unsigned short port; Jupiter::ReferenceString namePrefix; + std::vector attributes; }; Jupiter::ReadableString *getServerListJSON();