diff --git a/src/Jupiter b/src/Jupiter index 1827ab0..714d660 160000 --- a/src/Jupiter +++ b/src/Jupiter @@ -1 +1 @@ -Subproject commit 1827ab0047b5dcb8e88c096457c77c9d4177bd91 +Subproject commit 714d660508381bc2ff3c775f95b5be11e9eabc68 diff --git a/src/Plugins/RenX/RenX.Core/RenX_Server.cpp b/src/Plugins/RenX/RenX.Core/RenX_Server.cpp index 8eef14e..9ee04ac 100644 --- a/src/Plugins/RenX/RenX.Core/RenX_Server.cpp +++ b/src/Plugins/RenX/RenX.Core/RenX_Server.cpp @@ -17,6 +17,7 @@ */ #include +#include "jessilib/split.hpp" #include "Jupiter/String.hpp" #include "ServerManager.h" #include "IRC_Bot.h" @@ -94,16 +95,16 @@ int RenX::Server::think() { if (m_sock.recv() > 0) { // Data received cycle_player_rdns(); - Jupiter::ReadableString::TokenizeResult result = Jupiter::ReferenceString::tokenize(m_sock.getBuffer(), '\n'); - if (result.token_count != 0) { + auto tokens = jessilib::split_view(m_sock.getBuffer(), '\n'); + if (!tokens.empty()) { m_lastActivity = std::chrono::steady_clock::now(); - m_lastLine.concat(result.tokens[0]); - if (result.token_count != 1) { - processLine(m_lastLine); - m_lastLine = result.tokens[result.token_count - 1]; + m_lastLine += tokens[0]; + if (tokens.size() != 1) { + processLine(Jupiter::ReferenceString{m_lastLine}); + m_lastLine = tokens[tokens.size() - 1]; - for (size_t index = 1; index != result.token_count - 1; ++index) { - processLine(result.tokens[index]); + for (size_t index = 1; index != tokens.size() - 1; ++index) { + processLine(Jupiter::ReferenceString{tokens[index]}); } } } @@ -1296,10 +1297,38 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { return; auto& xPlugins = RenX::getCore()->getPlugins(); - Jupiter::ReadableString::TokenizeResult tokens = Jupiter::StringS::tokenize(line, m_rconVersion == 3 ? RenX::DelimC3 : RenX::DelimC); + auto tokens_view = jessilib::split_view(std::string_view{line}, m_rconVersion == 3 ? RenX::DelimC3 : RenX::DelimC); + std::vector tokens; - for (size_t index = 0; index != tokens.token_count; ++index) - tokens.tokens[index].processEscapeSequences(); + for (auto& token : tokens_view) { + tokens.push_back(Jupiter::StringS{std::string(token)}); // TODO: remove this extraneous copy + tokens.back().processEscapeSequences(); + } + + // Safety checker for getting a token at an index + auto getToken = [&tokens](size_t index) -> Jupiter::ReferenceString { + if (index < tokens.size()) { + return tokens[index]; + } + + return {}; + }; + + auto consume_tokens_as_command_list_format = [&tokens, this]() { + for (auto& token : tokens) { + m_commandListFormat.push_back(static_cast(token)); + } + }; + + auto tokens_as_command_table = [&tokens, this]() { + std::unordered_map table; + size_t total_tokens = std::min(tokens.size(), m_commandListFormat.size()); + for (size_t index = 0; index != total_tokens; ++index) { + table[m_commandListFormat[index]] = tokens[index]; + } + + return table; + }; /** Local functions */ auto onPreGameOver = [this](RenX::WinType winType, RenX::TeamType team, int gScore, int nScore) @@ -1516,7 +1545,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { }; auto gotoToken = [&line, &tokens, this](size_t index) { - if (index >= tokens.token_count) + if (index >= tokens.size()) return Jupiter::ReferenceString::empty; const char delim = getVersion() >= 4 ? RenX::DelimC : RenX::DelimC3; @@ -1540,49 +1569,50 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } }; - if (tokens.tokens[0].isNotEmpty()) + if (tokens[0].isNotEmpty()) { - char header = tokens.tokens[0].get(0); - tokens.tokens[0].shiftRight(1); + char header = tokens[0].get(0); + tokens[0].shiftRight(1); switch (header) { case 'r': if (m_lastCommand.equalsi("clientlist"_jrs)) { // ID | IP | Steam ID | Admin Status | Team | Name - if (tokens.tokens[0].isNotEmpty()) + if (tokens[0].isNotEmpty()) { bool isBot = false; int id; uint64_t steamid = 0; RenX::TeamType team = TeamType::Other; - Jupiter::ReferenceString steamToken = tokens.getToken(2); - Jupiter::ReferenceString adminToken = tokens.getToken(3); - Jupiter::ReferenceString teamToken = tokens.getToken(4); - if (tokens.tokens[0].get(0) == 'b') + Jupiter::ReferenceString steamToken = getToken(2); + Jupiter::ReferenceString adminToken = getToken(3); + Jupiter::ReferenceString teamToken = getToken(4); + if (tokens[0].get(0) == 'b') { isBot = true; - tokens.tokens[0].shiftRight(1); - id = tokens.tokens[0].asInt(); - tokens.tokens[0].shiftLeft(1); + tokens[0].shiftRight(1); + id = tokens[0].asInt(); + tokens[0].shiftLeft(1); } else - id = tokens.tokens[0].asInt(); + id = tokens[0].asInt(); if (steamToken.equals("-----NO-STEAM-----") == false) steamid = steamToken.asUnsignedLongLong(); team = RenX::getTeam(teamToken); if (adminToken.equalsi("None"_jrs)) - getPlayerOrAdd(tokens.getToken(5), id, team, isBot, steamid, tokens.getToken(1), Jupiter::ReferenceString::empty); + getPlayerOrAdd(getToken(5), id, team, isBot, steamid, getToken(1), Jupiter::ReferenceString::empty); else - getPlayerOrAdd(tokens.getToken(5), id, team, isBot, steamid, tokens.getToken(1), Jupiter::ReferenceString::empty)->adminType = adminToken; + getPlayerOrAdd(getToken(5), id, team, isBot, steamid, getToken(1), Jupiter::ReferenceString::empty)->adminType = adminToken; } } else if (m_lastCommand.equalsi("clientvarlist"_jrs)) { - if (m_commandListFormat.token_count == 0) - m_commandListFormat = tokens; + if (m_commandListFormat.empty()) { + consume_tokens_as_command_list_format(); + } else { /*e @@ -1590,10 +1620,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { rPlayerLog�Kills�PlayerKills�BotKills�Deaths�Score�Credits�Character�BoundVehicle�Vehicle�Spy�RemoteC4�ATMine�KDR�Ping�Admin�Steam�IP�ID�Name�Team�TeamNum rGDI,256,EKT-J�0�0�0�0�0�5217.9629�Rx_FamilyInfo_GDI_Soldier���False�0�0�0.0000�8�None�0x0110000104AE0666�127.0.0.1�256�EKT-J�GDI�0 */ - std::unordered_map table; - size_t i = tokens.token_count; - while (i-- != 0) - table[m_commandListFormat.getToken(i)] = tokens.getToken(i); + auto table = tokens_as_command_table(); auto table_get = [&table](const Jupiter::ReadableString& in_key) -> Jupiter::StringS* { auto value = table.find(in_key); @@ -1737,18 +1764,19 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } } } - else if (m_lastCommand.equalsi("botlist")) - { + else if (m_lastCommand.equalsi("botlist")) { // Team,ID,Name - if (m_commandListFormat.token_count == 0) - m_commandListFormat = tokens; - else - parseGetPlayerOrAdd(tokens.tokens[0]); + if (m_commandListFormat.empty()) { + consume_tokens_as_command_list_format(); + } + else { + parseGetPlayerOrAdd(tokens[0]); + } } - else if (m_lastCommand.equalsi("botvarlist")) - { - if (m_commandListFormat.token_count == 0) - m_commandListFormat = tokens; + else if (m_lastCommand.equalsi("botvarlist")) { + if (m_commandListFormat.empty()) { + consume_tokens_as_command_list_format(); + } else { /* @@ -1756,10 +1784,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { rPlayerLog�Kills�PlayerKills�BotKills�Deaths�Score�Credits�Character�BoundVehicle�Vehicle�Spy�RemoteC4�ATMine�KDR�Ping�Admin�Steam�IP�ID�Name�Team�TeamNum rGDI,256,EKT-J�0�0�0�0�0�5217.9629�Rx_FamilyInfo_GDI_Soldier���False�0�0�0.0000�8�None�0x0110000104AE0666�127.0.0.1�256�EKT-J�GDI�0 */ - std::unordered_map table; - size_t i = tokens.token_count; - while (i-- != 0) - table[m_commandListFormat.getToken(i)] = tokens.getToken(i); + auto table = tokens_as_command_table(); auto table_get = [&table](const Jupiter::ReadableString& in_key) -> Jupiter::StringS* { auto value = table.find(in_key); @@ -1863,8 +1888,9 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } else if (m_lastCommand.equalsi("binfo") || m_lastCommand.equalsi("buildinginfo") || m_lastCommand.equalsi("blist") || m_lastCommand.equalsi("buildinglist")) { - if (m_commandListFormat.token_count == 0) - m_commandListFormat = tokens; + if (m_commandListFormat.empty()) { + consume_tokens_as_command_list_format(); + } else { /* @@ -1872,10 +1898,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { rBuilding�Health�MaxHealth�Armor MaxArmor Team�Capturable Destroyed rRx_Building_Refinery_GDI�2000�2000�2000 2000 GDI�False False */ - std::unordered_map table; - size_t i = tokens.token_count; - while (i-- != 0) - table[m_commandListFormat.getToken(i)] = tokens.getToken(i); + auto table = tokens_as_command_table(); auto table_get = [&table](const Jupiter::ReadableString& in_key) -> Jupiter::StringS* { auto value = table.find(in_key); @@ -1932,7 +1955,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } else if (m_lastCommand.equalsi("ping")) { - if (tokens.getToken(1).equals("srv_init_done"_jrs)) + if (getToken(1).equals("srv_init_done"_jrs)) finished_connecting(); else m_awaitingPong = false; @@ -1940,8 +1963,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (m_lastCommand.equalsi("map")) { // Map | Guid - m_map.name = tokens.getToken(0); - const Jupiter::ReferenceString guid_token = tokens.getToken(1); + m_map.name = getToken(0); + const Jupiter::ReferenceString guid_token = getToken(1); if (guid_token.size() == 32U) { @@ -1954,11 +1977,11 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { if (m_lastCommandParams.isEmpty()) { // "Port"�| Port |�"Name" |�Name |�"Level"�| Level | "Players" | Players�| "Bots" | Bots | "LevelGUID" | Level GUID - m_port = static_cast(tokens.getToken(1).asUnsignedInt(10)); - m_serverName = tokens.getToken(3); - m_map.name = tokens.getToken(5); + m_port = static_cast(getToken(1).asUnsignedInt(10)); + m_serverName = getToken(3); + m_map.name = getToken(5); - const Jupiter::ReferenceString guid_token = tokens.getToken(11); + const Jupiter::ReferenceString guid_token = getToken(11); if (guid_token.size() == 32U) { m_map.guid[0] = guid_token.substring(size_t{ 0 }, 16U).asUnsignedLongLong(16); @@ -1971,23 +1994,23 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { if (m_lastCommandParams.isEmpty()) { // "PlayerLimit" | PlayerLimit | "VehicleLimit" | VehicleLimit | "MineLimit" | MineLimit | "TimeLimit" | TimeLimit | "bPassworded" | bPassworded | "bSteamRequired" | bSteamRequired | "bPrivateMessageTeamOnly" | bPrivateMessageTeamOnly | "bAllowPrivateMessaging" | bAllowPrivateMessaging | "TeamMode" | TeamMode | "bSpawnCrates" | bSpawnCrates | "CrateRespawnAfterPickup" | CrateRespawnAfterPickup | bIsCompetitive | "bIsCompetitive" - m_playerLimit = tokens.getToken(1).asInt(); - m_vehicleLimit = tokens.getToken(3).asInt(); - m_mineLimit = tokens.getToken(5).asInt(); - m_timeLimit = tokens.getToken(7).asInt(); - m_passworded = tokens.getToken(9).asBool(); - m_steamRequired = tokens.getToken(11).asBool(); - m_privateMessageTeamOnly = tokens.getToken(13).asBool(); - m_allowPrivateMessaging = tokens.getToken(15).asBool(); - m_team_mode = m_rconVersion >= 4 ? tokens.getToken(17).asInt() : true; - m_spawnCrates = tokens.getToken(19).asBool(); - m_crateRespawnAfterPickup = tokens.getToken(21).asDouble(); + m_playerLimit = getToken(1).asInt(); + m_vehicleLimit = getToken(3).asInt(); + m_mineLimit = getToken(5).asInt(); + m_timeLimit = getToken(7).asInt(); + m_passworded = getToken(9).asBool(); + m_steamRequired = getToken(11).asBool(); + m_privateMessageTeamOnly = getToken(13).asBool(); + m_allowPrivateMessaging = getToken(15).asBool(); + m_team_mode = m_rconVersion >= 4 ? getToken(17).asInt() : true; + m_spawnCrates = getToken(19).asBool(); + m_crateRespawnAfterPickup = getToken(21).asDouble(); if (m_rconVersion >= 4) { - m_competitive = tokens.getToken(23).asBool(); + m_competitive = getToken(23).asBool(); - const Jupiter::ReadableString &match_state_token = tokens.getToken(25); + const Jupiter::ReadableString &match_state_token = getToken(25); if (match_state_token.equalsi("PendingMatch"_jrs)) m_match_state = 0; else if (match_state_token.equalsi("MatchInProgress"_jrs)) @@ -1999,33 +2022,33 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else // Unknown state -- assume it's in progress m_match_state = 1; - m_botsEnabled = tokens.getToken(27).asBool(); - m_game_type = tokens.getToken(29).asInt(); + m_botsEnabled = getToken(27).asBool(); + m_game_type = getToken(29).asInt(); } } } else if (m_lastCommand.equalsi("mutatorlist"_jrs)) { // "The following mutators are loaded:" [ | Mutator [ | Mutator [ ... ] ] ] - if (tokens.token_count == 1) { + if (tokens.size() == 1) { m_pure = true; } - else if (tokens.token_count == 0) { + else if (tokens.size() == 0) { disconnect(RenX::DisconnectReason::ProtocolError); } else { RenX::Server::mutators.clear(); - size_t index = tokens.token_count; + size_t index = tokens.size(); while (--index != 0) - RenX::Server::mutators.emplace_back(tokens.tokens[index]); + RenX::Server::mutators.emplace_back(tokens[index]); } } else if (m_lastCommand.equalsi("rotation"_jrs)) { // Map | Guid - const Jupiter::ReadableString &in_map = tokens.getToken(0); + const Jupiter::ReadableString &in_map = getToken(0); if (hasMapInRotation(in_map) == false) { this->maps.emplace_back(in_map); - const Jupiter::ReferenceString guid_token = tokens.getToken(1); + const Jupiter::ReferenceString guid_token = getToken(1); if (guid_token.size() == 32U) { this->maps.back().guid[0] = guid_token.substring(size_t{ 0 }, 16U).asUnsignedLongLong(16); this->maps.back().guid[1] = guid_token.substring(16U).asUnsignedLongLong(16); @@ -2033,23 +2056,23 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } } else if (m_lastCommand.equalsi("changename")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(0)); - Jupiter::StringS newName = tokens.getToken(2); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(0)); + Jupiter::StringS newName = getToken(2); for (const auto& plugin : xPlugins) { plugin->RenX_OnNameChange(*this, *player, newName); } - player->name = tokens.getToken(2).gotoToken(2, ','); + player->name = getToken(2).gotoToken(2, ','); } break; case 'l': if (m_rconVersion >= 3) { - Jupiter::ReferenceString subHeader = tokens.getToken(1); - if (tokens.tokens[0].equals("GAME")) { + Jupiter::ReferenceString subHeader = getToken(1); + if (tokens[0].equals("GAME")) { if (subHeader.equals("Deployed;")) { // Object (Beacon/Mine) | Player // Object (Beacon/Mine) | Player | "on" | Surface - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(4)); - Jupiter::ReferenceString objectType = tokens.getToken(2); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(4)); + Jupiter::ReferenceString objectType = getToken(2); if (objectType.match("*Beacon")) ++player->beaconPlacements; else if (objectType.equals("Rx_Weapon_DeployedProxyC4"_jrs)) @@ -2062,15 +2085,15 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Disarmed;")) { // Object (Beacon/Mine) | "by" | Player // Object (Beacon/Mine) | "by" | Player | "owned by" | Owner - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(4)); - Jupiter::ReferenceString objectType = tokens.getToken(2); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(4)); + Jupiter::ReferenceString objectType = getToken(2); if (objectType.match("*Beacon")) ++player->beaconDisarms; else if (objectType.equals("Rx_Weapon_DeployedProxyC4"_jrs)) ++player->proxy_disarms; - if (tokens.getToken(5).equals("owned by")) { - RenX::PlayerInfo *victim = parseGetPlayerOrAdd(tokens.getToken(6)); + if (getToken(5).equals("owned by")) { + RenX::PlayerInfo *victim = parseGetPlayerOrAdd(getToken(6)); for (const auto& plugin : xPlugins) { plugin->RenX_OnDisarm(*this, *player, objectType, *victim); } @@ -2089,10 +2112,10 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { // 5.15+: // Explosive | "near" | Spot Location | "at" | Location | "by" | Owner // Explosive | "near" | Spot Location | "at" | Location - Jupiter::ReferenceString explosive = tokens.getToken(2); - if (tokens.getToken(5).equals("at")) { // 5.15+ - if (tokens.getToken(7).equals("by")) { // Player information specified - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(8)); + Jupiter::ReferenceString explosive = getToken(2); + if (getToken(5).equals("at")) { // 5.15+ + if (getToken(7).equals("by")) { // Player information specified + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(8)); for (const auto& plugin : xPlugins) { plugin->RenX_OnExplode(*this, *player, explosive); } @@ -2103,8 +2126,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } } } - else if (tokens.getToken(5).equals("by")) { // Pre-5.15 with player information specified - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(6)); + else if (getToken(5).equals("by")) { // Pre-5.15 with player information specified + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(6)); for (const auto& plugin : xPlugins) { plugin->RenX_OnExplode(*this, *player, explosive); } @@ -2119,9 +2142,9 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("ProjectileExploded;")) { // Explosive | "at" | Location // Explosive | "at" | Location | "by" | Owner - Jupiter::ReferenceString explosive = tokens.getToken(2); - if (tokens.getToken(5).equals("by")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(6)); + Jupiter::ReferenceString explosive = getToken(2); + if (getToken(5).equals("by")) { + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(6)); for (const auto& plugin : xPlugins) { plugin->RenX_OnExplode(*this, *player, explosive); } @@ -2135,10 +2158,10 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } else if (subHeader.equals("Captured;")) { // Team ',' Building | "id" | Building ID | "by" | Player - Jupiter::ReferenceString teamBuildingToken = tokens.getToken(2); + Jupiter::ReferenceString teamBuildingToken = getToken(2); Jupiter::ReferenceString building = teamBuildingToken.getToken(1, ','); TeamType oldTeam = RenX::getTeam(teamBuildingToken.getToken(0, ',')); - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(6)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(6)); player->captures++; for (const auto& plugin : xPlugins) { plugin->RenX_OnCapture(*this, *player, building, oldTeam); @@ -2147,10 +2170,10 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } else if (subHeader.equals("Neutralized;")) { // Team ',' Building | "id" | Building ID | "by" | Player - Jupiter::ReferenceString teamBuildingToken = tokens.getToken(2); + Jupiter::ReferenceString teamBuildingToken = getToken(2); Jupiter::ReferenceString building = teamBuildingToken.getToken(1, ','); TeamType oldTeam = RenX::getTeam(teamBuildingToken.getToken(0, ',')); - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(6)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(6)); for (const auto& plugin : xPlugins) { plugin->RenX_OnNeutralize(*this, *player, building, oldTeam); } @@ -2162,23 +2185,23 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { // "weapon" | Weapon | "by" | Player // "refill" | Player // "vehicle" | Vehicle | "by" | Player - Jupiter::ReferenceString type = tokens.getToken(2); - Jupiter::ReferenceString obj = tokens.getToken(3); + Jupiter::ReferenceString type = getToken(2); + Jupiter::ReferenceString obj = getToken(3); if (type.equals("character")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(5)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(5)); for (const auto& plugin : xPlugins) { plugin->RenX_OnCharacterPurchase(*this, *player, obj); } player->character = obj; } else if (type.equals("item")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(5)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(5)); for (const auto& plugin : xPlugins) { plugin->RenX_OnItemPurchase(*this, *player, obj); } } else if (type.equals("weapon")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(5)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(5)); for (const auto& plugin : xPlugins) { plugin->RenX_OnWeaponPurchase(*this, *player, obj); } @@ -2190,7 +2213,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } } else if (type.equals("vehicle")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(5)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(5)); for (const auto& plugin : xPlugins) { plugin->RenX_OnVehiclePurchase(*this, *player, obj); } @@ -2200,8 +2223,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { // "vehicle" | Vehicle Team, Vehicle // "player" | Player | "character" | Character // "bot" | Player - if (tokens.getToken(2).equals("vehicle")) { - Jupiter::ReferenceString vehicle = tokens.getToken(3); + if (getToken(2).equals("vehicle")) { + Jupiter::ReferenceString vehicle = getToken(3); Jupiter::ReferenceString vehicleTeamToken = vehicle.getToken(0, ','); vehicle.shiftRight(vehicleTeamToken.size() + 1); TeamType team = RenX::getTeam(vehicleTeamToken); @@ -2209,16 +2232,16 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { plugin->RenX_OnVehicleSpawn(*this, team, vehicle); } } - else if (tokens.getToken(2).equals("player")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(3)); - Jupiter::ReferenceString character = tokens.getToken(5); + else if (getToken(2).equals("player")) { + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(3)); + Jupiter::ReferenceString character = getToken(5); player->character = character; for (const auto& plugin : xPlugins) { plugin->RenX_OnSpawn(*this, *player, character); } } - else if (tokens.getToken(2).equals("bot")) { - RenX::PlayerInfo *bot = parseGetPlayerOrAdd(tokens.getToken(3)); + else if (getToken(2).equals("bot")) { + RenX::PlayerInfo *bot = parseGetPlayerOrAdd(getToken(3)); for (const auto& plugin : xPlugins) { plugin->RenX_OnBotJoin(*this, *bot); } @@ -2238,50 +2261,50 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { // "nuke" | "by" | Player // "abduction" | "by" | Player // "by" | Player - Jupiter::ReferenceString type = tokens.getToken(2); + Jupiter::ReferenceString type = getToken(2); if (type.equals("vehicle")) { - Jupiter::ReferenceString vehicle = tokens.getToken(3); - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(5)); + Jupiter::ReferenceString vehicle = getToken(3); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(5)); for (const auto& plugin : xPlugins) { plugin->RenX_OnVehicleCrate(*this, *player, vehicle); } } else if (type.equals("tsvehicle")) { - Jupiter::ReferenceString vehicle = tokens.getToken(3); - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(5)); + Jupiter::ReferenceString vehicle = getToken(3); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(5)); for (const auto& plugin : xPlugins) { plugin->RenX_OnVehicleCrate(*this, *player, vehicle); } } else if (type.equals("ravehicle")) { - Jupiter::ReferenceString vehicle = tokens.getToken(3); - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(5)); + Jupiter::ReferenceString vehicle = getToken(3); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(5)); for (const auto& plugin : xPlugins) { plugin->RenX_OnVehicleCrate(*this, *player, vehicle); } } else if (type.equals("death") || type.equals("suicide")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(4)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(4)); for (const auto& plugin : xPlugins) { plugin->RenX_OnDeathCrate(*this, *player); } } else if (type.equals("money")) { - int amount = tokens.getToken(3).asInt(); - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(5)); + int amount = getToken(3).asInt(); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(5)); for (const auto& plugin : xPlugins) { plugin->RenX_OnMoneyCrate(*this, *player, amount); } } else if (type.equals("character")) { - Jupiter::ReferenceString character = tokens.getToken(3); - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(5)); + Jupiter::ReferenceString character = getToken(3); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(5)); for (const auto& plugin : xPlugins) { plugin->RenX_OnCharacterCrate(*this, *player, character); } @@ -2289,8 +2312,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } else if (type.equals("spy")) { - Jupiter::ReferenceString character = tokens.getToken(3); - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(5)); + Jupiter::ReferenceString character = getToken(3); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(5)); for (const auto& plugin : xPlugins) { plugin->RenX_OnSpyCrate(*this, *player, character); } @@ -2298,50 +2321,50 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } else if (type.equals("refill")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(4)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(4)); for (const auto& plugin : xPlugins) { plugin->RenX_OnRefillCrate(*this, *player); } } else if (type.equals("timebomb")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(4)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(4)); for (const auto& plugin : xPlugins) { plugin->RenX_OnTimeBombCrate(*this, *player); } } else if (type.equals("speed")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(4)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(4)); for (const auto& plugin : xPlugins) { plugin->RenX_OnSpeedCrate(*this, *player); } } else if (type.equals("nuke")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(4)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(4)); for (const auto& plugin : xPlugins) { plugin->RenX_OnNukeCrate(*this, *player); } } else if (type.equals("abduction")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(4)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(4)); for (const auto& plugin : xPlugins) { plugin->RenX_OnAbductionCrate(*this, *player); } } else if (type.equals("by")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(3)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(3)); for (const auto& plugin : xPlugins) { plugin->RenX_OnUnspecifiedCrate(*this, *player); } } else { RenX::PlayerInfo *player = nullptr; - if (tokens.getToken(3).equals("by")) { - player = parseGetPlayerOrAdd(tokens.getToken(4)); + if (getToken(3).equals("by")) { + player = parseGetPlayerOrAdd(getToken(4)); } if (player != nullptr) { @@ -2357,16 +2380,16 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { // "player" | Player | "died by" | Damage Type // "player" | Player | "suicide by" | Damage Type // NOTE: Filter these out when Player.isEmpty(). - Jupiter::ReferenceString playerToken = tokens.getToken(3); + Jupiter::ReferenceString playerToken = getToken(3); if (playerToken.isNotEmpty()) { RenX::PlayerInfo *player = parseGetPlayerOrAdd(playerToken); - Jupiter::ReferenceString type = tokens.getToken(4); + Jupiter::ReferenceString type = getToken(4); Jupiter::ReferenceString damageType; if (type.equals("by")) { - damageType = tokens.getToken(7); - Jupiter::ReferenceString killerData = tokens.getToken(5); + damageType = getToken(7); + Jupiter::ReferenceString killerData = getToken(5); Jupiter::ReferenceString kName = killerData.getToken(2, ','); Jupiter::ReferenceString kIDToken = killerData.getToken(1, ','); RenX::TeamType vTeam = RenX::getTeam(killerData.getToken(0, ',')); @@ -2404,7 +2427,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (type.equals("died by")) { player->deaths++; - damageType = tokens.getToken(5); + damageType = getToken(5); for (const auto& plugin : xPlugins) { plugin->RenX_OnDie(*this, *player, damageType); } @@ -2413,7 +2436,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { { player->deaths++; player->suicides++; - damageType = tokens.getToken(5); + damageType = getToken(5); for (const auto& plugin : xPlugins) { plugin->RenX_OnSuicide(*this, *player, damageType); } @@ -2426,11 +2449,11 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { { // Vehicle | "by" | Player // Vehicle | "bound to" | Bound Player | "by" | Player - Jupiter::ReferenceString vehicle = tokens.getToken(2); - Jupiter::ReferenceString byLine = tokens.getToken(3); + Jupiter::ReferenceString vehicle = getToken(2); + Jupiter::ReferenceString byLine = getToken(3); if (byLine.equals("by")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(4)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(4)); player->steals++; for (const auto& plugin : xPlugins) { plugin->RenX_OnSteal(*this, *player, vehicle); @@ -2438,8 +2461,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } else if (byLine.equals("bound to")) { - RenX::PlayerInfo *victim = parseGetPlayerOrAdd(tokens.getToken(4)); - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(6)); + RenX::PlayerInfo *victim = parseGetPlayerOrAdd(getToken(4)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(6)); player->steals++; victim->stolen++; for (const auto& plugin : xPlugins) { @@ -2454,7 +2477,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { // "defence" | Defence | "by" | Killer | "with" | Damage Type // "emplacement" | Emplacement | "by" | Killer Player | "with" | Damage Type // "building" | Building | "by" | Killer | "with" | Damage Type - Jupiter::ReferenceString typeToken = tokens.getToken(2); + Jupiter::ReferenceString typeToken = getToken(2); RenX::ObjectType type = ObjectType::None; if (typeToken.equals("vehicle")) type = ObjectType::Vehicle; @@ -2465,13 +2488,13 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { if (type != ObjectType::None) { - Jupiter::ReferenceString objectName = tokens.getToken(3); - if (tokens.getToken(4).equals("by")) + Jupiter::ReferenceString objectName = getToken(3); + if (getToken(4).equals("by")) { - Jupiter::ReferenceString killerToken = tokens.getToken(5); + Jupiter::ReferenceString killerToken = getToken(5); Jupiter::ReferenceString idToken = killerToken.getToken(1, ','); Jupiter::ReferenceString name = killerToken.gotoToken(2, ','); - Jupiter::ReferenceString damageType = tokens.getToken(7); + Jupiter::ReferenceString damageType = getToken(7); RenX::TeamType team = RenX::getTeam(killerToken.getToken(0, ',')); @@ -2531,11 +2554,11 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Donated;")) { // Amount | "to" | Recipient | "by" | Donor - if (tokens.getToken(5).equals("by")) + if (getToken(5).equals("by")) { - double amount = tokens.getToken(2).asDouble(); - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(4)); - RenX::PlayerInfo *donor = parseGetPlayerOrAdd(tokens.getToken(6)); + double amount = getToken(2).asDouble(); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(4)); + RenX::PlayerInfo *donor = parseGetPlayerOrAdd(getToken(6)); for (const auto& plugin : xPlugins) { plugin->RenX_OnDonate(*this, *donor, *player, amount); } @@ -2544,8 +2567,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("OverMine;")) { // Player | "near" | Location - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); - Jupiter::ReferenceString location = tokens.getToken(4); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); + Jupiter::ReferenceString location = getToken(4); for (const auto& plugin : xPlugins) { plugin->RenX_OnOverMine(*this, *player, location); @@ -2555,12 +2578,12 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { { // "winner" | Winner | Reason("TimeLimit" etc) | "GDI=" GDI Score | "Nod=" Nod Score // "tie" | Reason | "GDI=" GDI Score | "Nod=" Nod Score - Jupiter::ReferenceString winTieToken = tokens.getToken(2); + Jupiter::ReferenceString winTieToken = getToken(2); m_match_state = 2; if (winTieToken.equals("winner")) { - Jupiter::ReferenceString sWinType = tokens.getToken(4); + Jupiter::ReferenceString sWinType = getToken(4); WinType winType = WinType::Unknown; if (sWinType.equals("TimeLimit")) winType = WinType::Score; @@ -2571,10 +2594,10 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (sWinType.equals("Surrender")) winType = WinType::Surrender; - TeamType team = RenX::getTeam(tokens.getToken(3)); + TeamType team = RenX::getTeam(getToken(3)); - int gScore = tokens.getToken(5).getToken(1, '=').asInt(); - int nScore = tokens.getToken(6).getToken(1, '=').asInt(); + int gScore = getToken(5).getToken(1, '=').asInt(); + int nScore = getToken(6).getToken(1, '=').asInt(); onPreGameOver(winType, team, gScore, nScore); for (const auto& plugin : xPlugins) { @@ -2583,8 +2606,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } else if (winTieToken.equals("tie")) { - int gScore = tokens.getToken(4).getToken(1, '=').asInt(); - int nScore = tokens.getToken(5).getToken(1, '=').asInt(); + int gScore = getToken(4).getToken(1, '=').asInt(); + int nScore = getToken(5).getToken(1, '=').asInt(); for (const auto& plugin : xPlugins) { plugin->RenX_OnGameOver(*this, RenX::WinType::Tie, RenX::TeamType::None, gScore, nScore); } @@ -2599,12 +2622,12 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } } } - else if (tokens.tokens[0].equals("CHAT")) + else if (tokens[0].equals("CHAT")) { if (subHeader.equals("Say;")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); - Jupiter::ReferenceString message = tokens.getToken(4); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); + Jupiter::ReferenceString message = getToken(4); onChat(*player, message); for (const auto& plugin : xPlugins) { plugin->RenX_OnChat(*this, *player, message); @@ -2613,8 +2636,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } else if (subHeader.equals("TeamSay;")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); - Jupiter::ReferenceString message = tokens.getToken(4); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); + Jupiter::ReferenceString message = getToken(4); onChat(*player, message); for (const auto& plugin : xPlugins) { plugin->RenX_OnTeamChat(*this, *player, message); @@ -2623,8 +2646,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } else if (subHeader.equals("Radio;")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); - Jupiter::ReferenceString message = tokens.getToken(4); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); + Jupiter::ReferenceString message = getToken(4); for (const auto& plugin : xPlugins) { plugin->RenX_OnRadioChat(*this, *player, message); } @@ -2632,8 +2655,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } else if (subHeader.equals("AdminMsg;")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); - Jupiter::ReferenceString message = tokens.getToken(4); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); + Jupiter::ReferenceString message = getToken(4); for (const auto& plugin : xPlugins) { plugin->RenX_OnAdminMessage(*this, *player, message); } @@ -2641,8 +2664,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } else if (subHeader.equals("AdminWarn;")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); - Jupiter::ReferenceString message = tokens.getToken(4); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); + Jupiter::ReferenceString message = getToken(4); for (const auto& plugin : xPlugins) { plugin->RenX_OnWarnMessage(*this, *player, message); } @@ -2650,9 +2673,9 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } else if (subHeader.equals("PAdminMsg;")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); - RenX::PlayerInfo *target = parseGetPlayerOrAdd(tokens.getToken(4)); - Jupiter::ReferenceString message = tokens.getToken(6); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); + RenX::PlayerInfo *target = parseGetPlayerOrAdd(getToken(4)); + Jupiter::ReferenceString message = getToken(6); for (const auto& plugin : xPlugins) { plugin->RenX_OnAdminPMessage(*this, *player, *target, message); } @@ -2660,9 +2683,9 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } else if (subHeader.equals("PAdminWarn;")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); - RenX::PlayerInfo *target = parseGetPlayerOrAdd(tokens.getToken(4)); - Jupiter::ReferenceString message = tokens.getToken(6); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); + RenX::PlayerInfo *target = parseGetPlayerOrAdd(getToken(4)); + Jupiter::ReferenceString message = getToken(6); for (const auto& plugin : xPlugins) { plugin->RenX_OnWarnPMessage(*this, *player, *target, message); } @@ -2670,42 +2693,42 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } else if (subHeader.equals("HostSay;")) { - Jupiter::ReferenceString message = tokens.getToken(3); + Jupiter::ReferenceString message = getToken(3); for (const auto& plugin : xPlugins) { plugin->RenX_OnHostChat(*this, message); } } else if (subHeader.equals("HostPMsg;")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); - Jupiter::ReferenceString message = tokens.getToken(4); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); + Jupiter::ReferenceString message = getToken(4); for (const auto& plugin : xPlugins) { plugin->RenX_OnHostPage(*this, *player, message); } } else if (subHeader.equals("HostAdminMsg;")) { - Jupiter::ReferenceString message = tokens.getToken(3); + Jupiter::ReferenceString message = getToken(3); for (const auto& plugin : xPlugins) { plugin->RenX_OnHostAdminMessage(*this, message); } } else if (subHeader.equals("HostAdminWarn;")) { - Jupiter::ReferenceString message = tokens.getToken(3); + Jupiter::ReferenceString message = getToken(3); for (const auto& plugin : xPlugins) { plugin->RenX_OnHostWarnMessage(*this, message); } } else if (subHeader.equals("HostPAdminMsg;")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); - Jupiter::ReferenceString message = tokens.getToken(4); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); + Jupiter::ReferenceString message = getToken(4); for (const auto& plugin : xPlugins) { plugin->RenX_OnHostAdminPMessage(*this, *player, message); } } else if (subHeader.equals("HostPAdminWarn;")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); - Jupiter::ReferenceString message = tokens.getToken(4); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); + Jupiter::ReferenceString message = getToken(4); for (const auto& plugin : xPlugins) { plugin->RenX_OnHostWarnPMessage(*this, *player, message); } @@ -2728,29 +2751,29 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } } } - else if (tokens.tokens[0].equals("PLAYER")) + else if (tokens[0].equals("PLAYER")) { if (subHeader.equals("Enter;")) { - PARSE_PLAYER_DATA_P(tokens.getToken(2)); + PARSE_PLAYER_DATA_P(getToken(2)); uint64_t steamid = 0; RenX::PlayerInfo *player; - if (tokens.getToken(5).equals("hwid")) + if (getToken(5).equals("hwid")) { // New format - if (tokens.getToken(7).equals("steamid")) - steamid = tokens.getToken(8).asUnsignedLongLong(); + if (getToken(7).equals("steamid")) + steamid = getToken(8).asUnsignedLongLong(); - player = getPlayerOrAdd(name, id, team, isBot, steamid, tokens.getToken(4), tokens.getToken(6)); + player = getPlayerOrAdd(name, id, team, isBot, steamid, getToken(4), getToken(6)); } else { // Old format - if (tokens.getToken(5).equals("steamid")) - steamid = tokens.getToken(6).asUnsignedLongLong(); + if (getToken(5).equals("steamid")) + steamid = getToken(6).asUnsignedLongLong(); - player = getPlayerOrAdd(name, id, team, isBot, steamid, tokens.getToken(4), Jupiter::ReferenceString::empty); + player = getPlayerOrAdd(name, id, team, isBot, steamid, getToken(4), Jupiter::ReferenceString::empty); } if (steamid != 0ULL && default_ladder_database != nullptr && (player->ban_flags & RenX::BanDatabase::Entry::FLAG_TYPE_LADDER) == 0) @@ -2781,11 +2804,11 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { { // Player | "joined" | Team | "score" | Score | "last round score" | Score | "time" | Timestamp // Player | "joined" | Team | "left" | Old Team | "score" | Score | "last round score" | Score | "time" | Timestamp - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); player->character = Jupiter::ReferenceString::empty; - if (tokens.getToken(5) == "left") + if (getToken(5) == "left") { - RenX::TeamType oldTeam = RenX::getTeam(tokens.getToken(6)); + RenX::TeamType oldTeam = RenX::getTeam(getToken(6)); if (oldTeam != RenX::TeamType::None) for (const auto& plugin : xPlugins) { plugin->RenX_OnTeamChange(*this, *player, oldTeam); @@ -2796,11 +2819,11 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { { // ["player" |] Player | "hwid" | HWID size_t offset = 0; - if (tokens.getToken(2).equals("player")) + if (getToken(2).equals("player")) offset = 1; - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2 + offset)); - player->hwid = tokens.getToken(4 + offset); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2 + offset)); + player->hwid = getToken(4 + offset); if (player->isBot == false) { banCheck(*player); @@ -2819,11 +2842,11 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Exit;")) { // Player - Jupiter::ReferenceString playerToken = tokens.getToken(2); + Jupiter::ReferenceString playerToken = getToken(2); PARSE_PLAYER_DATA_P(playerToken); RenX::PlayerInfo *player = getPlayer(id); - //RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); + //RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); if (player != nullptr) { @@ -2840,8 +2863,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Kick;")) { // Player | "for" | Reason - const Jupiter::ReadableString &reason = tokens.getToken(4); - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); + const Jupiter::ReadableString &reason = getToken(4); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); for (const auto& plugin : xPlugins) { plugin->RenX_OnKick(*this, *player, reason); } @@ -2849,8 +2872,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("NameChange;")) { // Player | "to:" | New Name - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); - Jupiter::StringS newName = tokens.getToken(4); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); + Jupiter::StringS newName = getToken(4); for (const auto& plugin : xPlugins) { plugin->RenX_OnNameChange(*this, *player, newName); } @@ -2860,11 +2883,11 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("ChangeID;")) { // "to" | New ID | "from" | Old ID - int oldID = tokens.getToken(5).asInt(); + int oldID = getToken(5).asInt(); RenX::PlayerInfo *player = getPlayer(oldID); if (player != nullptr) { - player->id = tokens.getToken(3).asInt(); + player->id = getToken(3).asInt(); if (player->isBot == false) banCheck(*player); @@ -2885,9 +2908,9 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { // Player | Rank if (m_devBot == false) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); if (player != nullptr) - player->global_rank = tokens.getToken(3).asUnsignedInt(); + player->global_rank = getToken(3).asUnsignedInt(); for (const auto& plugin : xPlugins) { plugin->RenX_OnRank(*this, *player); @@ -2897,9 +2920,9 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Dev;")) { // Player | true/false - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); if (player != nullptr) - player->is_dev = tokens.getToken(3).asBool(); + player->is_dev = getToken(3).asBool(); for (const auto& plugin : xPlugins) { plugin->RenX_OnDev(*this, *player); @@ -2908,7 +2931,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("SpeedHack;")) { // Player - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); for (const auto& plugin : xPlugins) { plugin->RenX_OnSpeedHack(*this, *player); } @@ -2916,7 +2939,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Command;")) { // Player | Command - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); Jupiter::ReferenceString message = gotoToken(3); RenX::GameCommand *command = triggerCommand(Jupiter::ReferenceString::getWord(message, 0, WHITESPACE), *player, Jupiter::ReferenceString::gotoWord(message, 1, WHITESPACE)); @@ -2933,13 +2956,13 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } } } - else if (tokens.tokens[0].equals("RCON")) + else if (tokens[0].equals("RCON")) { if (subHeader.equals("Command;")) { // User | "executed:" | Command - Jupiter::ReferenceString user = tokens.getToken(2); - if (tokens.getToken(3).equals("executed:")) + Jupiter::ReferenceString user = getToken(2); + if (getToken(3).equals("executed:")) { Jupiter::ReferenceString command = gotoToken(4); Jupiter::ReferenceString cmd = command.getWord(0, " "); @@ -2958,7 +2981,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Subscribed;")) { // User - Jupiter::ReferenceString user = tokens.getToken(2); + Jupiter::ReferenceString user = getToken(2); if (user.equals(m_rconUser)) m_subscribed = true; @@ -2970,7 +2993,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Unsubscribed;")) { // User - Jupiter::ReferenceString user = tokens.getToken(2); + Jupiter::ReferenceString user = getToken(2); if (user.equals(m_rconUser)) m_subscribed = false; @@ -2982,8 +3005,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Blocked;")) { // User | Reason="(Denied by IP Policy)" / "(Not on Whitelist)" - Jupiter::ReferenceString user = tokens.getToken(2); - Jupiter::ReferenceString message = tokens.getToken(3); + Jupiter::ReferenceString user = getToken(2); + Jupiter::ReferenceString message = getToken(3); for (const auto& plugin : xPlugins) { plugin->RenX_OnBlock(*this, user, message); } @@ -2991,7 +3014,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Connected;")) { // User - Jupiter::ReferenceString user = tokens.getToken(2); + Jupiter::ReferenceString user = getToken(2); for (const auto& plugin : xPlugins) { plugin->RenX_OnConnect(*this, user); } @@ -2999,7 +3022,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Authenticated;")) { // User - Jupiter::ReferenceString user = tokens.getToken(2); + Jupiter::ReferenceString user = getToken(2); for (const auto& plugin : xPlugins) { plugin->RenX_OnAuthenticate(*this, user); } @@ -3007,8 +3030,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Banned;")) { // User | "reason" | Reason="(Too many password attempts)" - Jupiter::ReferenceString user = tokens.getToken(2); - Jupiter::ReferenceString message = tokens.getToken(4); + Jupiter::ReferenceString user = getToken(2); + Jupiter::ReferenceString message = getToken(4); for (const auto& plugin : xPlugins) { plugin->RenX_OnBan(*this, user, message); } @@ -3016,7 +3039,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("InvalidPassword;")) { // User - Jupiter::ReferenceString user = tokens.getToken(2); + Jupiter::ReferenceString user = getToken(2); for (const auto& plugin : xPlugins) { plugin->RenX_OnInvalidPassword(*this, user); } @@ -3024,8 +3047,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Dropped;")) { // User | "reason" | Reason="(Auth Timeout)" - Jupiter::ReferenceString user = tokens.getToken(2); - Jupiter::ReferenceString message = tokens.getToken(4); + Jupiter::ReferenceString user = getToken(2); + Jupiter::ReferenceString message = getToken(4); for (const auto& plugin : xPlugins) { plugin->RenX_OnDrop(*this, user, message); } @@ -3033,7 +3056,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Disconnected;")) { // User - Jupiter::ReferenceString user = tokens.getToken(2); + Jupiter::ReferenceString user = getToken(2); for (const auto& plugin : xPlugins) { plugin->RenX_OnDisconnect(*this, user); } @@ -3041,7 +3064,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("StoppedListen;")) { // Reason="(Reached Connection Limit)" - Jupiter::ReferenceString message = tokens.getToken(2); + Jupiter::ReferenceString message = getToken(2); for (const auto& plugin : xPlugins) { plugin->RenX_OnStopListen(*this, message); } @@ -3049,7 +3072,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("ResumedListen;")) { // Reason="(No longer at Connection Limit)" - Jupiter::ReferenceString message = tokens.getToken(2); + Jupiter::ReferenceString message = getToken(2); for (const auto& plugin : xPlugins) { plugin->RenX_OnResumeListen(*this, message); } @@ -3057,7 +3080,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Warning;")) { // Warning="(Hit Max Attempt Records - You should investigate Rcon attempts and/or decrease prune time)" - Jupiter::ReferenceString message = tokens.getToken(2); + Jupiter::ReferenceString message = getToken(2); for (const auto& plugin : xPlugins) { plugin->RenX_OnWarning(*this, message); } @@ -3070,14 +3093,14 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } } } - else if (tokens.tokens[0].equals("ADMIN")) + else if (tokens[0].equals("ADMIN")) { if (subHeader.equals("Rcon;")) { // Player | "executed:" | Command - if (tokens.getToken(3).equals("executed:")) + if (getToken(3).equals("executed:")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); Jupiter::ReferenceString cmd = gotoToken(4); for (const auto& plugin : xPlugins) { plugin->RenX_OnExecute(*this, *player, cmd); @@ -3087,8 +3110,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Login;")) { // Player | "as" | Type="moderator" / "administrator" - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); - player->adminType = tokens.getToken(4); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); + player->adminType = getToken(4); for (const auto& plugin : xPlugins) { plugin->RenX_OnAdminLogin(*this, *player); } @@ -3096,7 +3119,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Logout;")) { // Player | "as" | Type="moderator" / "administrator" - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); for (const auto& plugin : xPlugins) { plugin->RenX_OnAdminLogout(*this, *player); @@ -3107,8 +3130,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Granted;")) { // Player | "as" | Type="moderator" / "administrator" - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(2)); - player->adminType = tokens.getToken(4); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(2)); + player->adminType = getToken(4); for (const auto& plugin : xPlugins) { plugin->RenX_OnAdminGrant(*this, *player); } @@ -3121,7 +3144,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } } } - else if (tokens.tokens[0].equals("VOTE")) + else if (tokens[0].equals("VOTE")) { if (subHeader.equals("Called;")) { @@ -3139,8 +3162,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { // TeamType="Global" / "GDI" / "Nod" / "" | "Rx_VoteMenuChoice_Surrender" | "by" | Player // TeamType="Global" / "GDI" / "Nod" / "" | "Rx_VoteMenuChoice_Survey" | "by" | Player | "text" | Survey Text - Jupiter::ReferenceString voteType = tokens.getToken(3); - Jupiter::ReferenceString teamToken = tokens.getToken(2); + Jupiter::ReferenceString voteType = getToken(3); + Jupiter::ReferenceString teamToken = getToken(2); RenX::TeamType team; if (teamToken.equals("Global")) team = TeamType::None; @@ -3151,9 +3174,9 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else team = TeamType::Other; - if (tokens.getToken(4).equals("parameters")) // Pre-5.15 style parameters; throw away parameters + if (getToken(4).equals("parameters")) // Pre-5.15 style parameters; throw away parameters { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(tokens.token_count - 1)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(tokens.size() - 1)); if ((player->ban_flags & RenX::BanDatabase::Entry::FLAG_TYPE_VOTE) != 0) sendData(Jupiter::StringS::Format("ccancelvote %.*s\n", teamToken.size(), teamToken.ptr())); @@ -3164,7 +3187,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } else // 5.15+ (or empty) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(5)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(5)); if ((player->ban_flags & RenX::BanDatabase::Entry::FLAG_TYPE_VOTE) != 0) sendData(Jupiter::StringS::Format("ccancelvote %.*s\n", teamToken.size(), teamToken.ptr())); @@ -3177,7 +3200,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { if (voteType.equals("AddBots"_jrs)) { - Jupiter::ReferenceString victimToken = tokens.getToken(7); + Jupiter::ReferenceString victimToken = getToken(7); RenX::TeamType victim; if (teamToken.equals("Global")) victim = TeamType::None; @@ -3188,8 +3211,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else victim = TeamType::Other; - int amount = tokens.getToken(9).asInt(10); - int skill = tokens.getToken(11).asInt(10); + int amount = getToken(9).asInt(10); + int skill = getToken(11).asInt(10); for (const auto& plugin : xPlugins) { plugin->RenX_OnVoteAddBots(*this, team, *player, victim, amount, skill); @@ -3203,21 +3226,21 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } else if (voteType.equals("Kick"_jrs)) { - RenX::PlayerInfo *victim = parseGetPlayerOrAdd(tokens.getToken(7)); + RenX::PlayerInfo *victim = parseGetPlayerOrAdd(getToken(7)); for (const auto& plugin : xPlugins) { plugin->RenX_OnVoteKick(*this, team, *player, *victim); } } else if (voteType.equals("MineBan"_jrs)) { - RenX::PlayerInfo *victim = parseGetPlayerOrAdd(tokens.getToken(7)); + RenX::PlayerInfo *victim = parseGetPlayerOrAdd(getToken(7)); for (const auto& plugin : xPlugins) { plugin->RenX_OnVoteMineBan(*this, team, *player, *victim); } } else if (voteType.equals("RemoveBots"_jrs)) { - Jupiter::ReferenceString victimToken = tokens.getToken(7); + Jupiter::ReferenceString victimToken = getToken(7); RenX::TeamType victim; if (teamToken.equals("Global")) victim = TeamType::None; @@ -3228,7 +3251,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else victim = TeamType::Other; - int amount = tokens.getToken(9).asInt(10); + int amount = getToken(9).asInt(10); for (const auto& plugin : xPlugins) { plugin->RenX_OnVoteRemoveBots(*this, team, *player, victim, amount); @@ -3248,7 +3271,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } else if (voteType.equals("Survey"_jrs)) { - const Jupiter::ReadableString &text = tokens.getToken(7); + const Jupiter::ReadableString &text = getToken(7); for (const auto& plugin : xPlugins) { plugin->RenX_OnVoteSurvey(*this, team, *player, text); } @@ -3272,8 +3295,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Results;")) { // TeamType="Global" / "GDI" / "Nod" / "" | VoteType="Rx_VoteMenuChoice_"... | Success="pass" / "fail" | "Yes=" Yes votes | "No=" No votes - Jupiter::ReferenceString voteType = tokens.getToken(3); - Jupiter::ReferenceString teamToken = tokens.getToken(2); + Jupiter::ReferenceString voteType = getToken(3); + Jupiter::ReferenceString teamToken = getToken(2); RenX::TeamType team; if (teamToken.equals("Global")) team = TeamType::None; @@ -3285,11 +3308,11 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { team = TeamType::Other; bool success = true; - if (tokens.getToken(4).equals("fail")) + if (getToken(4).equals("fail")) success = false; int yesVotes = 0; - Jupiter::ReferenceString votes_token = tokens.getToken(5); + Jupiter::ReferenceString votes_token = getToken(5); if (votes_token.size() > 4) { votes_token.shiftRight(4); @@ -3297,7 +3320,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } int noVotes = 0; - votes_token = tokens.getToken(6); + votes_token = getToken(6); if (votes_token.size() > 3) { votes_token.shiftRight(3); @@ -3311,8 +3334,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Cancelled;")) { // TeamType="Global" / "GDI" / "Nod" | VoteType="Rx_VoteMenuChoice_"... - Jupiter::ReferenceString voteType = tokens.getToken(3); - Jupiter::ReferenceString teamToken = tokens.getToken(2); + Jupiter::ReferenceString voteType = getToken(3); + Jupiter::ReferenceString teamToken = getToken(2); RenX::TeamType team; if (teamToken.equals("Global")) team = TeamType::None; @@ -3335,15 +3358,15 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } } } - else if (tokens.tokens[0].equals("MAP")) + else if (tokens[0].equals("MAP")) { if (subHeader.equals("Changing;")) { // Map | Mode="seamless" / "nonseamless" - Jupiter::ReferenceString map = tokens.getToken(2); + Jupiter::ReferenceString map = getToken(2); m_match_state = 3; - if (tokens.getToken(3).equals("seamless")) + if (getToken(3).equals("seamless")) m_seamless = true; else m_seamless = false; @@ -3358,7 +3381,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Loaded;")) { // Map - Jupiter::ReferenceString map = tokens.getToken(2); + Jupiter::ReferenceString map = getToken(2); m_match_state = 0; m_map = map; @@ -3370,7 +3393,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { else if (subHeader.equals("Start;")) { // Map - Jupiter::ReferenceString map = tokens.getToken(2); + Jupiter::ReferenceString map = getToken(2); m_match_state = 1; m_reliable = true; @@ -3389,24 +3412,24 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } } } - else if (tokens.tokens[0].equals("DEMO")) + else if (tokens[0].equals("DEMO")) { if (subHeader.equals("Record;")) { // "client request by" | Player // "admin command by" | Player // "rcon command" - Jupiter::ReferenceString type = tokens.getToken(2); + Jupiter::ReferenceString type = getToken(2); if (type.equals("client request by") || type.equals("admin command by")) { - RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(3)); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(getToken(3)); for (const auto& plugin : xPlugins) { plugin->RenX_OnDemoRecord(*this, *player); } } else { - Jupiter::ReferenceString user = tokens.getToken(3); // not actually used, but here for possible future usage + Jupiter::ReferenceString user = getToken(3); // not actually used, but here for possible future usage for (const auto& plugin : xPlugins) { plugin->RenX_OnDemoRecord(*this, user); } @@ -3427,7 +3450,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { } } } - /*else if (tokens.tokens[0].equals("ERROR;")) // Decided to disable this entirely, since it's unreachable anyways. + /*else if (tokens[0].equals("ERROR;")) // Decided to disable this entirely, since it's unreachable anyways. { // Should be under RCON. // "Could not open TCP Port" Port "- Rcon Disabled" @@ -3454,7 +3477,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { for (const auto& plugin : xPlugins) { plugin->RenX_OnCommand(*this, raw); } - m_commandListFormat.erase(); + m_commandListFormat.clear(); m_lastCommand = Jupiter::ReferenceString::empty; m_lastCommandParams = Jupiter::ReferenceString::empty; } @@ -3480,8 +3503,8 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { m_gameVersion = raw.substring(3); else // New format: 004 | Game Version Number | Game Version { - m_gameVersionNumber = tokens.getToken(1).asInt(10); - m_gameVersion = tokens.getToken(2); + m_gameVersionNumber = getToken(1).asInt(10); + m_gameVersion = getToken(2); if (m_gameVersion.isEmpty()) { @@ -3627,7 +3650,7 @@ const Jupiter::ReadableString &RenX::Server::getGameVersion() const { return m_gameVersion; } -const Jupiter::ReadableString &RenX::Server::getRCONUsername() const { +std::string_view RenX::Server::getRCONUsername() const { return m_rconUser; } diff --git a/src/Plugins/RenX/RenX.Core/RenX_Server.h b/src/Plugins/RenX/RenX.Core/RenX_Server.h index 6cc16a4..b8659bd 100644 --- a/src/Plugins/RenX/RenX.Core/RenX_Server.h +++ b/src/Plugins/RenX/RenX.Core/RenX_Server.h @@ -1038,7 +1038,7 @@ namespace RenX * * @return String containing the RCON user name */ - const Jupiter::ReadableString &getRCONUsername() const; + std::string_view getRCONUsername() const; /** * @brief Creates a server object using the provided socket, and loads settings from the specified configuration section. @@ -1110,7 +1110,7 @@ namespace RenX std::chrono::steady_clock::time_point m_lastActivity = std::chrono::steady_clock::now(); std::chrono::steady_clock::time_point m_lastSendActivity = std::chrono::steady_clock::now(); std::chrono::steady_clock::time_point m_gameover_time; - Jupiter::String m_lastLine; + std::string m_lastLine; Jupiter::StringS m_rconUser; Jupiter::StringS m_gameVersion; Jupiter::StringS m_serverName; @@ -1118,7 +1118,7 @@ namespace RenX Jupiter::StringS m_lastCommandParams; RenX::Map m_map; Jupiter::TCPSocket m_sock; - Jupiter::ReadableString::TokenizeResult m_commandListFormat; + std::vector m_commandListFormat; std::vector> m_commands; /** Configuration variables */ diff --git a/src/Plugins/RenX/RenX.Ladder.Web/RenX_Ladder_Web.cpp b/src/Plugins/RenX/RenX.Ladder.Web/RenX_Ladder_Web.cpp index 4956540..c220095 100644 --- a/src/Plugins/RenX/RenX.Ladder.Web/RenX_Ladder_Web.cpp +++ b/src/Plugins/RenX/RenX.Ladder.Web/RenX_Ladder_Web.cpp @@ -16,6 +16,7 @@ * Written by Jessica James */ +#include "jessilib/unicode.hpp" #include "Jupiter/IRC_Client.h" #include "Jupiter/HTTP.h" #include "Jupiter/HTTP_QueryString.h" @@ -23,6 +24,7 @@ #include "RenX_Tags.h" #include "RenX_Ladder_Web.h" +using namespace std::literals; using namespace Jupiter::literals; bool RenX_Ladder_WebPlugin::initialize() { @@ -167,7 +169,7 @@ Jupiter::String generate_search(RenX::LadderDatabase *db) { } /** Database selector */ -Jupiter::String generate_database_selector(RenX::LadderDatabase *db, const Jupiter::HTTP::HTMLFormResponse::TableType &query_params) { +Jupiter::String generate_database_selector(RenX::LadderDatabase *db, const Jupiter::HTTP::HTMLFormResponse& query_params) { Jupiter::String result(256); result = R"database-select(
second; result += R"html("/>)html"_jrs; @@ -283,7 +285,7 @@ Jupiter::String RenX_Ladder_WebPlugin::generate_entry_table(RenX::LadderDatabase return result; } -Jupiter::String *RenX_Ladder_WebPlugin::generate_ladder_page(RenX::LadderDatabase *db, uint8_t format, size_t index, size_t count, const Jupiter::HTTP::HTMLFormResponse::TableType &query_params) { +Jupiter::String *RenX_Ladder_WebPlugin::generate_ladder_page(RenX::LadderDatabase *db, uint8_t format, size_t index, size_t count, const Jupiter::HTTP::HTMLFormResponse& query_params) { Jupiter::String *result = new Jupiter::String(2048); if ((format & this->FLAG_INCLUDE_PAGE_HEADER) != 0) // Header @@ -307,7 +309,7 @@ Jupiter::String *RenX_Ladder_WebPlugin::generate_ladder_page(RenX::LadderDatabas // include_header | include_footer | include_any_headers | include_any_footers /** Search page */ -Jupiter::String *RenX_Ladder_WebPlugin::generate_search_page(RenX::LadderDatabase *db, uint8_t format, size_t start_index, size_t count, const Jupiter::ReadableString &name, const Jupiter::HTTP::HTMLFormResponse::TableType &query_params) { +Jupiter::String *RenX_Ladder_WebPlugin::generate_search_page(RenX::LadderDatabase *db, uint8_t format, size_t start_index, size_t count, std::string_view name, const Jupiter::HTTP::HTMLFormResponse& query_params) { Jupiter::String *result = new Jupiter::String(2048); if ((format & this->FLAG_INCLUDE_PAGE_HEADER) != 0) // Header @@ -335,7 +337,7 @@ Jupiter::String *RenX_Ladder_WebPlugin::generate_search_page(RenX::LadderDatabas Jupiter::String row(256); RenX::LadderDatabase::Entry *node = db->getHead(); while (node != nullptr) { - if (node->most_recent_name.findi(name) != Jupiter::INVALID_INDEX) { // match found + if (node->most_recent_name.findi(Jupiter::ReferenceString{name}) != Jupiter::INVALID_INDEX) { // match found row = RenX_Ladder_WebPlugin::entry_table_row; row.replace(RenX::tags->INTERNAL_OBJECT_TAG, db->getName()); RenX::processTags(row, *node); @@ -354,7 +356,7 @@ Jupiter::String *RenX_Ladder_WebPlugin::generate_search_page(RenX::LadderDatabas } /** Profile page */ -Jupiter::String *RenX_Ladder_WebPlugin::generate_profile_page(RenX::LadderDatabase *db, uint8_t format, uint64_t steam_id, const Jupiter::HTTP::HTMLFormResponse::TableType &query_params) { +Jupiter::String *RenX_Ladder_WebPlugin::generate_profile_page(RenX::LadderDatabase *db, uint8_t format, uint64_t steam_id, const Jupiter::HTTP::HTMLFormResponse& query_params) { Jupiter::String *result = new Jupiter::String(2048); if ((format & this->FLAG_INCLUDE_PAGE_HEADER) != 0) @@ -418,7 +420,7 @@ Jupiter::String *RenX_Ladder_WebPlugin::generate_profile_page(RenX::LadderDataba /** Content functions */ -Jupiter::ReadableString *generate_no_db_page(const Jupiter::HTTP::HTMLFormResponse::TableType &query_params) { +Jupiter::ReadableString *generate_no_db_page(const Jupiter::HTTP::HTMLFormResponse& query_params) { Jupiter::String *result = new Jupiter::String(pluginInstance.header); if (RenX::ladder_databases.size() != 0) { result->concat(generate_search(nullptr)); @@ -432,22 +434,22 @@ Jupiter::ReadableString *generate_no_db_page(const Jupiter::HTTP::HTMLFormRespon return result; } -Jupiter::ReadableString *handle_ladder_page(const Jupiter::ReadableString &query_string) { +Jupiter::ReadableString *handle_ladder_page(std::string_view query_string) { Jupiter::HTTP::HTMLFormResponse html_form_response(query_string); RenX::LadderDatabase *db = RenX::default_ladder_database; size_t start_index = 0, count = pluginInstance.getEntriesPerPage(); uint8_t format = 0xFF; if (html_form_response.table.size() != 0) { - format = html_form_response.tableGetCast("format"_jrs, format); - start_index = html_form_response.tableGetCast("start"_jrs, start_index); - count = html_form_response.tableGetCast("count"_jrs, count); + format = html_form_response.tableGetCast("format"sv, format); + start_index = html_form_response.tableGetCast("start"sv, start_index); + count = html_form_response.tableGetCast("count"sv, count); - const Jupiter::ReadableString &db_name = html_form_response.tableGet("database"_jrs, Jupiter::ReferenceString::empty); - if (db_name.isNotEmpty()) { + std::string_view db_name = html_form_response.tableGet("database"sv, {}); + if (!db_name.empty()) { db = nullptr; for (const auto& database : RenX::ladder_databases) { - if (database->getName().equalsi(db_name)) { + if (jessilib::equalsi(std::string_view{database->getName()}, db_name)) { db = database; break; } @@ -456,29 +458,29 @@ Jupiter::ReadableString *handle_ladder_page(const Jupiter::ReadableString &query } if (db == nullptr) - return generate_no_db_page(html_form_response.table); + return generate_no_db_page(html_form_response); - return pluginInstance.generate_ladder_page(db, format, start_index, count, html_form_response.table); + return pluginInstance.generate_ladder_page(db, format, start_index, count, html_form_response); } -Jupiter::ReadableString *handle_search_page(const Jupiter::ReadableString &query_string) { +Jupiter::ReadableString *handle_search_page(std::string_view query_string) { Jupiter::HTTP::HTMLFormResponse html_form_response(query_string); RenX::LadderDatabase *db = RenX::default_ladder_database; uint8_t format = 0xFF; size_t start_index = 0, count = pluginInstance.getEntriesPerPage(); - Jupiter::ReferenceString name; + std::string_view name; if (html_form_response.table.size() != 0) { - format = html_form_response.tableGetCast("format"_jrs, format); - start_index = html_form_response.tableGetCast("start"_jrs, start_index); - count = html_form_response.tableGetCast("count"_jrs, count); - name = html_form_response.tableGet("name"_jrs, name); + format = html_form_response.tableGetCast("format"sv, format); + start_index = html_form_response.tableGetCast("start"sv, start_index); + count = html_form_response.tableGetCast("count"sv, count); + name = html_form_response.tableGet("name"sv, name); - const Jupiter::ReadableString &db_name = html_form_response.tableGet("database"_jrs, Jupiter::ReferenceString::empty); - if (db_name.isNotEmpty()) { + std::string_view db_name = html_form_response.tableGet("database"sv, {}); + if (!db_name.empty()) { db = nullptr; for (const auto& database : RenX::ladder_databases) { - if (database->getName().equalsi(db_name)) { + if (jessilib::equalsi(std::string_view{database->getName()}, db_name)) { db = database; break; } @@ -487,15 +489,15 @@ Jupiter::ReadableString *handle_search_page(const Jupiter::ReadableString &query } if (db == nullptr) - return generate_no_db_page(html_form_response.table); + return generate_no_db_page(html_form_response); if (name.size() < pluginInstance.getMinSearchNameLength()) // Generate ladder page when no name specified return handle_ladder_page(query_string); - return pluginInstance.generate_search_page(db, format, start_index, count, name, html_form_response.table); + return pluginInstance.generate_search_page(db, format, start_index, count, name, html_form_response); } -Jupiter::ReadableString *handle_profile_page(const Jupiter::ReadableString &query_string) +Jupiter::ReadableString *handle_profile_page(std::string_view query_string) { Jupiter::HTTP::HTMLFormResponse html_form_response(query_string); RenX::LadderDatabase *db = RenX::default_ladder_database; @@ -507,12 +509,11 @@ Jupiter::ReadableString *handle_profile_page(const Jupiter::ReadableString &quer format = html_form_response.tableGetCast("format"_jrs, format); steam_id = html_form_response.tableGetCast("id"_jrs, steam_id); - const Jupiter::ReadableString &db_name = html_form_response.tableGet("database"_jrs, Jupiter::ReferenceString::empty); - if (db_name.isNotEmpty()) - { + std::string_view db_name = html_form_response.tableGet("database"sv, {}); + if (!db_name.empty()) { db = nullptr; for (const auto& database : RenX::ladder_databases) { - if (database->getName().equalsi(db_name)) { + if (jessilib::equalsi(std::string_view{database->getName()}, db_name)) { db = database; break; } @@ -521,9 +522,9 @@ Jupiter::ReadableString *handle_profile_page(const Jupiter::ReadableString &quer } if (db == nullptr) - return generate_no_db_page(html_form_response.table); + return generate_no_db_page(html_form_response); - return pluginInstance.generate_profile_page(db, format, steam_id, html_form_response.table); + return pluginInstance.generate_profile_page(db, format, steam_id, html_form_response); } extern "C" JUPITER_EXPORT Jupiter::Plugin *getPlugin() diff --git a/src/Plugins/RenX/RenX.Ladder.Web/RenX_Ladder_Web.h b/src/Plugins/RenX/RenX.Ladder.Web/RenX_Ladder_Web.h index 9c2b84f..7434063 100644 --- a/src/Plugins/RenX/RenX.Ladder.Web/RenX_Ladder_Web.h +++ b/src/Plugins/RenX/RenX.Ladder.Web/RenX_Ladder_Web.h @@ -39,9 +39,9 @@ public: Jupiter::StringS header; Jupiter::StringS footer; - Jupiter::String *generate_ladder_page(RenX::LadderDatabase *db, uint8_t format, size_t start_index, size_t count, const Jupiter::HTTP::HTMLFormResponse::TableType &query_params); - Jupiter::String *generate_search_page(RenX::LadderDatabase *db, uint8_t format, size_t start_index, size_t count, const Jupiter::ReadableString &name, const Jupiter::HTTP::HTMLFormResponse::TableType &query_params); - Jupiter::String *generate_profile_page(RenX::LadderDatabase *db, uint8_t format, uint64_t steam_id, const Jupiter::HTTP::HTMLFormResponse::TableType &query_params); + Jupiter::String *generate_ladder_page(RenX::LadderDatabase *db, uint8_t format, size_t start_index, size_t count, const Jupiter::HTTP::HTMLFormResponse& query_params); + Jupiter::String *generate_search_page(RenX::LadderDatabase *db, uint8_t format, size_t start_index, size_t count, std::string_view name, const Jupiter::HTTP::HTMLFormResponse& query_params); + Jupiter::String *generate_profile_page(RenX::LadderDatabase *db, uint8_t format, uint64_t steam_id, const Jupiter::HTTP::HTMLFormResponse& query_params); inline size_t getEntriesPerPage() const { return this->entries_per_page; } inline size_t getMinSearchNameLength() const { return this->min_search_name_length; }; @@ -57,9 +57,9 @@ private: /** Configuration variables */ size_t entries_per_page; size_t min_search_name_length; - Jupiter::StringS ladder_page_name, search_page_name, profile_page_name, ladder_table_header, ladder_table_footer; - Jupiter::StringS web_hostname; - Jupiter::StringS web_path; + std::string ladder_page_name, search_page_name, profile_page_name, ladder_table_header, ladder_table_footer; + std::string web_hostname; + std::string web_path; std::string web_header_filename; std::string web_footer_filename; std::string web_profile_filename; @@ -69,8 +69,8 @@ private: Jupiter::StringS entry_table_row, entry_profile, entry_profile_previous, entry_profile_next; }; -Jupiter::ReadableString *handle_ladder_page(const Jupiter::ReadableString ¶meters); -Jupiter::ReadableString *handle_search_page(const Jupiter::ReadableString ¶meters); -Jupiter::ReadableString *handle_profile_page(const Jupiter::ReadableString ¶meters); +Jupiter::ReadableString *handle_ladder_page(std::string_view query_string); +Jupiter::ReadableString *handle_search_page(std::string_view query_string); +Jupiter::ReadableString *handle_profile_page(std::string_view query_string); #endif // _RENX_LADDER_WEB_H \ No newline at end of file diff --git a/src/Plugins/RenX/RenX.Relay/RenX_Relay.cpp b/src/Plugins/RenX/RenX.Relay/RenX_Relay.cpp index 31d6107..c13bc0b 100644 --- a/src/Plugins/RenX/RenX.Relay/RenX_Relay.cpp +++ b/src/Plugins/RenX/RenX.Relay/RenX_Relay.cpp @@ -11,6 +11,9 @@ #include #include #include +#include "fmt/format.h" // TODO: replace with later +#include +#include "jessilib/split.hpp" #include "Jupiter/IRC.h" #include "RenX_Functions.h" #include "RenX_Server.h" @@ -62,18 +65,17 @@ int RenX_RelayPlugin::think() { else { // Connected and fine if (upstream_socket->recv() > 0) { // Data received - auto& buffer = upstream_socket->getBuffer(); - Jupiter::ReadableString::TokenizeResult result = Jupiter::ReferenceString::tokenize(buffer, '\n'); - if (result.token_count != 0) { + auto tokens = jessilib::split_view(upstream_socket->getBuffer(), '\n'); + if (!tokens.empty()) { server_info.m_last_activity = std::chrono::steady_clock::now(); - server_info.m_last_line.concat(result.tokens[0]); - if (result.token_count != 1) { + server_info.m_last_line += tokens[0]; + if (tokens.size() != 1) { // Process upstream message received process_upstream_message(server, server_info.m_last_line, server_info); - server_info.m_last_line = result.tokens[result.token_count - 1]; + server_info.m_last_line = tokens[tokens.size() - 1]; - for (size_t index = 1; index != result.token_count - 1; ++index) { - process_upstream_message(server, result.tokens[index], server_info); + for (size_t index = 1; index != tokens.size() - 1; ++index) { + process_upstream_message(server, tokens[index], server_info); } } } @@ -279,10 +281,10 @@ std::string to_hex(T in_integer) { void RenX_RelayPlugin::RenX_OnRaw(RenX::Server &server, const Jupiter::ReadableString &line) { // Not parsing any escape sequences, so data gets sent upstream exactly as it's received here. Copy tokens where needed to process escape sequences. - Jupiter::ReadableString::TokenizeResult tokens = Jupiter::StringS::tokenize(line, RenX::DelimC); + auto tokens = jessilib::split(std::string_view{line}, RenX::DelimC); // Ensure valid message received - if (tokens.token_count == 0) { + if (tokens.empty()) { return; } @@ -294,12 +296,12 @@ void RenX_RelayPlugin::RenX_OnRaw(RenX::Server &server, const Jupiter::ReadableS } // Suppress unassociated command execution logs from going upstream - if (tokens.token_count >= 5 - && tokens.tokens[0] == "lRCON" - && tokens.tokens[1] == "Command;" - && tokens.tokens[3] == "executed:" - && tokens.tokens[4].isNotEmpty()) { - if (tokens.tokens[2] != server.getRCONUsername()) { + if (tokens.size() >= 5 + && tokens[0] == "lRCON" + && tokens[1] == "Command;" + && tokens[3] == "executed:" + && !tokens[4].empty()) { + if (tokens[2] != server.getRCONUsername()) { if (m_default_settings.m_suppress_rcon_command_logs) { // TODO: move away from per-stream settings // Suppress RCON command logs from other RCON users return; @@ -313,7 +315,7 @@ void RenX_RelayPlugin::RenX_OnRaw(RenX::Server &server, const Jupiter::ReadableS upstream_server_info* front_server_info = m_command_tracker.front(); if (front_server_info == nullptr || front_server_info->m_processing_command - || tokens.tokens[4] != front_server_info->m_response_queue.front().m_command) { + || tokens[4] != front_server_info->m_response_queue.front().m_command) { // This command response wasn't requested by any current upstream connections; suppress it return; } @@ -331,13 +333,13 @@ void RenX_RelayPlugin::RenX_OnRaw(RenX::Server &server, const Jupiter::ReadableS } else { // TODO: add assignment operators to Jupiter::string crap - tokens.tokens[2].set(rcon_username.data(), rcon_username.size()); + tokens[2] = rcon_username; // Construct line to send and send it - line_sanitized = tokens.tokens[0]; - for (size_t index = 1; index != tokens.token_count; ++index) { + line_sanitized = tokens[0]; + for (size_t index = 1; index != tokens.size(); ++index) { line_sanitized += RenX::DelimC; - line_sanitized += tokens.tokens[index]; + line_sanitized += tokens[index]; } } line_sanitized += '\n'; @@ -355,7 +357,7 @@ void RenX_RelayPlugin::RenX_OnRaw(RenX::Server &server, const Jupiter::ReadableS } } -void RenX_RelayPlugin::process_renx_message(RenX::Server& server, upstream_server_info& server_info, const Jupiter::ReadableString& line, Jupiter::ReadableString::TokenizeResult tokens) { +void RenX_RelayPlugin::process_renx_message(RenX::Server& server, upstream_server_info& server_info, std::string_view line, std::vector tokens) { bool required_sanitization = false; if (!server_info.m_socket) { // early out: no upstream RCON session @@ -364,21 +366,21 @@ void RenX_RelayPlugin::process_renx_message(RenX::Server& server, upstream_serve const upstream_settings& settings = *server_info.m_settings; if (settings.m_suppress_chat_logs - && tokens.getToken(0) == "lCHAT") { + && tokens[0] == "lCHAT") { return; } // Suppress unassociated command responses from going upstream - if (tokens.tokens[0].isNotEmpty() - && (tokens.tokens[0][0] == 'r' || tokens.tokens[0][0] == 'c') + if (!tokens[0].empty() + && (tokens[0][0] == 'r' || tokens[0][0] == 'c') && !server_info.m_processing_command) { // This command response wasn't requested upstream; suppress it return; } - auto findPlayerByIP = [&server](const Jupiter::ReadableString& in_ip) -> const RenX::PlayerInfo* { + auto findPlayerByIP = [&server](std::string in_ip) -> const RenX::PlayerInfo* { // Parse into integer so we're doing int comparisons instead of strings - auto ip32 = Jupiter::Socket::pton4(static_cast(in_ip).c_str()); + auto ip32 = Jupiter::Socket::pton4(in_ip.c_str()); if (ip32 == 0) { return nullptr; } @@ -393,8 +395,8 @@ void RenX_RelayPlugin::process_renx_message(RenX::Server& server, upstream_serve return nullptr; }; - auto findPlayerByHWID = [&server](const Jupiter::ReadableString& in_hwid) -> const RenX::PlayerInfo* { - if (in_hwid.isEmpty()) { + auto findPlayerByHWID = [&server](std::string_view in_hwid) -> const RenX::PlayerInfo* { + if (in_hwid.empty()) { return nullptr; } @@ -407,8 +409,9 @@ void RenX_RelayPlugin::process_renx_message(RenX::Server& server, upstream_serve return nullptr; }; - auto findPlayerBySteamID = [&server](const Jupiter::ReadableString& in_steamid) -> const RenX::PlayerInfo* { - uint64_t steamid = in_steamid.asUnsignedLongLong(); + auto findPlayerBySteamID = [&server](std::string_view in_steamid) -> const RenX::PlayerInfo* { + uint64_t steamid{}; + std::from_chars(in_steamid.data(), in_steamid.data() + in_steamid.size(), steamid); if (steamid == 0) { return nullptr; } @@ -423,19 +426,19 @@ void RenX_RelayPlugin::process_renx_message(RenX::Server& server, upstream_serve }; if (settings.m_sanitize_names) { - for (size_t index = 0; index != tokens.token_count; ++index) { - auto& token = tokens.tokens[index]; - if (is_player_token(token.ptr(), token.ptr() + token.size())) { + for (size_t index = 0; index != tokens.size(); ++index) { + auto& token = tokens[index]; + if (is_player_token(token.data(), token.data() + token.size())) { // Get token pieces - Jupiter::ReferenceString teamToken = Jupiter::ReferenceString::getToken(token, 0, ','); - Jupiter::ReferenceString idToken = Jupiter::ReferenceString::getToken(token, 1, ','); + auto player_tokens = jessilib::split_n_view(token, ',', 2); + std::string_view idToken = player_tokens[1]; - Jupiter::StringS replacement_player = teamToken; + std::string replacement_player = static_cast(player_tokens[0]); replacement_player += ','; replacement_player += idToken; replacement_player += ','; - if (idToken.isNotEmpty() && idToken.get(0) == 'b') { - idToken.shiftRight(1); + if (!idToken.empty() && idToken.front() == 'b') { + idToken.remove_prefix(1); } // Name (sanitized) @@ -452,8 +455,8 @@ void RenX_RelayPlugin::process_renx_message(RenX::Server& server, upstream_serve // It's way too much of a pain to check for command usages, and it's not full-proof either (an alias or similar could be added). // So instead, we'll just search all messages for any tokens containing any player's IP or HWID. // This isn't terribly efficient, but there's only up to 64 players, so not a huge concern - for (size_t index = 0; index != tokens.token_count; ++index) { - auto& token = tokens.tokens[index]; + for (size_t index = 0; index != tokens.size(); ++index) { + auto& token = tokens[index]; const RenX::PlayerInfo* player; if (settings.m_sanitize_ips) { player = findPlayerByIP(token); @@ -464,7 +467,8 @@ void RenX_RelayPlugin::process_renx_message(RenX::Server& server, upstream_serve std::uniform_int_distribution dist(10, 200); // Replace real IP with fake - token.format("%u.%u.%u.%u", + //token.format("%u.%u.%u.%u", + token = fmt::format("{}.{}.{}.{}", static_cast(dist(randgen)), static_cast(dist(randgen)), static_cast(dist(randgen)), @@ -506,13 +510,13 @@ void RenX_RelayPlugin::process_renx_message(RenX::Server& server, upstream_serve } } - Jupiter::StringS line_sanitized; + std::string line_sanitized; if (required_sanitization) { // Construct line to send and send it - line_sanitized = tokens.tokens[0]; - for (size_t index = 1; index != tokens.token_count; ++index) { + line_sanitized = tokens[0]; + for (size_t index = 1; index != tokens.size(); ++index) { line_sanitized += RenX::DelimC; - line_sanitized += tokens.tokens[index]; + line_sanitized += tokens[index]; } } else { @@ -666,17 +670,17 @@ void RenX_RelayPlugin::upstream_disconnected(RenX::Server&, upstream_server_info } } -void RenX_RelayPlugin::process_upstream_message(RenX::Server* in_server, const Jupiter::ReadableString& in_line, upstream_server_info& in_server_info) { - if (in_line.isEmpty()) { +void RenX_RelayPlugin::process_upstream_message(RenX::Server* in_server, std::string_view in_line, upstream_server_info& in_server_info) { + if (in_line.empty()) { return; } - if (in_line == 's') { + if (in_line.front() == 's') { // we're already subscribed return; } - if (in_line[0] == 'a') { + if (in_line.front() == 'a') { // we're already authenticated return; } @@ -695,10 +699,7 @@ void RenX_RelayPlugin::process_upstream_message(RenX::Server* in_server, const J if (in_line[0] == 'c' && in_line.size() > 1) { // Sanitize unknown & blacklisted commands if (settings.m_suppress_unknown_commands || (settings.m_suppress_blacklisted_commands && !settings.m_fake_ignored_commands)) { - Jupiter::ReferenceString command_str = Jupiter::ReferenceString::getToken(in_line, 0, ' '); - command_str.shiftRight(1); - std::string_view command_view{ command_str.ptr(), command_str.size() }; - + std::string_view command_view = jessilib::split_once_view(in_line, ' ').first.substr(1); if (settings.m_suppress_unknown_commands && g_known_commands.find(command_view) == g_known_commands.end()) { // Command not in known commands list; ignore it @@ -731,7 +732,7 @@ void RenX_RelayPlugin::process_upstream_message(RenX::Server* in_server, const J } } - std::string_view command_line{ in_line.ptr() + 1, in_line.size() - 1 }; + std::string_view command_line = in_line.substr(1); std::string_view command_word = command_line.substr(0, std::min(command_line.find(' '), command_line.size())); std::string command_word_lower; command_word_lower.reserve(command_word.size()); @@ -764,7 +765,7 @@ void RenX_RelayPlugin::process_upstream_message(RenX::Server* in_server, const J } // Send line to game server - Jupiter::StringS sanitized_message = in_line; + std::string sanitized_message = static_cast(in_line); sanitized_message += '\n'; send_downstream(*in_server, sanitized_message, in_server_info); } diff --git a/src/Plugins/RenX/RenX.Relay/RenX_Relay.h b/src/Plugins/RenX/RenX.Relay/RenX_Relay.h index 5658d8b..edabb04 100644 --- a/src/Plugins/RenX/RenX.Relay/RenX_Relay.h +++ b/src/Plugins/RenX/RenX.Relay/RenX_Relay.h @@ -64,7 +64,7 @@ private: bool m_connected{}; std::chrono::steady_clock::time_point m_last_connect_attempt{}; std::chrono::steady_clock::time_point m_last_activity{}; - Jupiter::StringL m_last_line; + std::string m_last_line; std::deque m_response_queue; // Contains both real & fake commands bool m_processing_command{}; const upstream_settings* m_settings; // weak_ptr to upstream_settings owned by m_configured_upstreams @@ -79,8 +79,8 @@ private: void upstream_connected(RenX::Server& in_server, upstream_server_info& in_server_info); void upstream_disconnected(RenX::Server& in_server, upstream_server_info& in_server_info); - void process_upstream_message(RenX::Server* in_server, const Jupiter::ReadableString& in_line, upstream_server_info& in_server_info); - void process_renx_message(RenX::Server& server, upstream_server_info& in_server_info, const Jupiter::ReadableString &raw, Jupiter::ReadableString::TokenizeResult tokens); + void process_upstream_message(RenX::Server* in_server, std::string_view in_line, upstream_server_info& in_server_info); + void process_renx_message(RenX::Server& server, upstream_server_info& in_server_info, std::string_view raw, std::vector tokens); std::unordered_map> m_server_info_map; std::deque m_command_tracker; // Tracks the order of REAL commands executed across upstreams, to keep things from getting fudged diff --git a/src/Plugins/RenX/RenX.ServerList/RenX_ServerList.cpp b/src/Plugins/RenX/RenX.ServerList/RenX_ServerList.cpp index 2c10441..167e659 100644 --- a/src/Plugins/RenX/RenX.ServerList/RenX_ServerList.cpp +++ b/src/Plugins/RenX/RenX.ServerList/RenX_ServerList.cpp @@ -16,6 +16,7 @@ * Written by Jessica James */ +#include "jessilib/split.hpp" #include "Jupiter/IRC_Client.h" #include "Jupiter/HTTP.h" #include "Jupiter/HTTP_QueryString.h" @@ -27,6 +28,7 @@ #include "RenX_ServerList.h" using namespace Jupiter::literals; +using namespace std::literals; static STRING_LITERAL_AS_NAMED_REFERENCE(CONTENT_TYPE_APPLICATION_JSON, "application/json"); @@ -190,9 +192,9 @@ Jupiter::StringS RenX_ServerListPlugin::server_as_json(const RenX::Server &serve server_attributes.reserve(16 * serverInfo.attributes.size() + 16); server_attributes = R"json("Attributes":[)json"; - for (Jupiter::ReferenceString& attribute : serverInfo.attributes) { + for (std::string_view attribute : serverInfo.attributes) { server_attributes += '\"'; - server_attributes.append(attribute.ptr(), attribute.size()); + server_attributes += attribute; server_attributes += "\","; } @@ -331,12 +333,12 @@ Jupiter::StringS RenX_ServerListPlugin::server_as_long_json(const RenX::Server & server_attributes = "["; const char* comma = "\n"; - for (Jupiter::ReferenceString& attribute : serverInfo.attributes) { + for (std::string_view attribute : serverInfo.attributes) { server_attributes += comma; comma = ",\n"; server_attributes += "\t\t\t\""; - server_attributes.append(attribute.ptr(), attribute.size()); + server_attributes += attribute; server_attributes += "\""; } @@ -567,11 +569,9 @@ RenX_ServerListPlugin::ListServerInfo RenX_ServerListPlugin::getListServerInfo(c 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); + std::string_view attributes_str = section->get("ListAttributes"_jrs); + if (!attributes_str.empty()) { + result.attributes = jessilib::split_view(attributes_str, ' '); } }; @@ -619,11 +619,11 @@ void RenX_ServerListPlugin::RenX_OnMapLoad(RenX::Server &server, const Jupiter:: // Plugin instantiation and entry point. RenX_ServerListPlugin pluginInstance; -Jupiter::ReadableString *handle_server_list_page(const Jupiter::ReadableString &) { +Jupiter::ReadableString *handle_server_list_page(std::string_view) { return pluginInstance.getServerListJSON(); } -Jupiter::ReadableString *handle_server_list_long_page(const Jupiter::ReadableString &) { +Jupiter::ReadableString *handle_server_list_long_page(std::string_view) { const auto& servers = RenX::getCore()->getServers(); size_t index = 0; RenX::Server *server; @@ -657,7 +657,7 @@ Jupiter::ReadableString *handle_server_list_long_page(const Jupiter::ReadableStr return server_list_long_json; } -Jupiter::ReadableString *handle_server_page(const Jupiter::ReadableString &query_string) { +Jupiter::ReadableString *handle_server_page(std::string_view query_string) { Jupiter::HTTP::HTMLFormResponse html_form_response(query_string); Jupiter::ReferenceString address; int port = 0; @@ -669,8 +669,8 @@ Jupiter::ReadableString *handle_server_page(const Jupiter::ReadableString &query return new Jupiter::ReferenceString(); if (html_form_response.table.size() != 0) { - address = html_form_response.tableGet("ip"_jrs, address); - port = html_form_response.tableGetCast("port"_jrs, port); + address = html_form_response.tableGet("ip"sv, address); + port = html_form_response.tableGetCast("port"sv, port); } // search for server @@ -693,11 +693,11 @@ Jupiter::ReadableString *handle_server_page(const Jupiter::ReadableString &query return new Jupiter::ReferenceString(server->varData[pluginInstance.getName()].get("j"_jrs)); } -Jupiter::ReadableString *handle_metadata_page(const Jupiter::ReadableString&) { +Jupiter::ReadableString *handle_metadata_page(std::string_view) { return pluginInstance.getMetadataJSON(); } -Jupiter::ReadableString *handle_metadata_prometheus_page(const Jupiter::ReadableString&) { +Jupiter::ReadableString *handle_metadata_prometheus_page(std::string_view) { return pluginInstance.getMetadataPrometheus(); } diff --git a/src/Plugins/RenX/RenX.ServerList/RenX_ServerList.h b/src/Plugins/RenX/RenX.ServerList/RenX_ServerList.h index 483a419..031c603 100644 --- a/src/Plugins/RenX/RenX.ServerList/RenX_ServerList.h +++ b/src/Plugins/RenX/RenX.ServerList/RenX_ServerList.h @@ -30,7 +30,7 @@ public: // RenX_ServerListPlugin Jupiter::ReferenceString hostname; unsigned short port; Jupiter::ReferenceString namePrefix; - std::vector attributes; + std::vector attributes; }; size_t getListedPlayerCount(const RenX::Server& server); @@ -62,14 +62,14 @@ public: // RenX::Plugin private: Jupiter::StringS m_server_list_json, m_metadata_json, m_metadata_prometheus; - Jupiter::StringS m_web_hostname, m_web_path; - Jupiter::StringS m_server_list_page_name, m_server_list_long_page_name, m_server_page_name, m_metadata_page_name, m_metadata_prometheus_page_name; + std::string m_web_hostname, m_web_path; + std::string m_server_list_page_name, m_server_list_long_page_name, m_server_page_name, m_metadata_page_name, m_metadata_prometheus_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 &); -Jupiter::ReadableString *handle_metadata_page(const Jupiter::ReadableString &); -Jupiter::ReadableString *handle_metadata_prometheus_page(const Jupiter::ReadableString&); +Jupiter::ReadableString *handle_server_list_page(std::string_view); +Jupiter::ReadableString *handle_server_list_long_page(std::string_view); +Jupiter::ReadableString *handle_server_page(std::string_view); +Jupiter::ReadableString *handle_metadata_page(std::string_view); +Jupiter::ReadableString *handle_metadata_prometheus_page(std::string_view); #endif // _RENX_SERVERLIST_H_HEADER