From ca101466cb9d1dca07071b482e823c88f3e3a0a4 Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Fri, 1 May 2015 02:28:37 -0400 Subject: [PATCH] UUID revamp * UUIDMode variable removed (moving to a plugin-based system) * RenX_OnPlayerUUIDChange event added * Added functions to RenX::Server: ** setUUIDFunction() ** getUUIDFunction() ** setUUID() ** setUUIDIfDifferent() * Added default calc_uuid implementation - sets UUID to formatted SteamID. * Removed some lambdas in RenX::Server::processLine() --- Release/Plugins/RenX.Core.lib | Bin 110530 -> 113434 bytes RenX.Core/RenX_Plugin.cpp | 5 + RenX.Core/RenX_Plugin.h | 1 + RenX.Core/RenX_Server.cpp | 177 ++++++++++++++++++---------------- RenX.Core/RenX_Server.h | 43 ++++++++- 5 files changed, 144 insertions(+), 82 deletions(-) diff --git a/Release/Plugins/RenX.Core.lib b/Release/Plugins/RenX.Core.lib index a7391881adc2052bafbdf6d183f798f05d84032d..97f09d5e55082406733a25190dcafac4b4902503 100644 GIT binary patch delta 14347 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 N5eP;J#V>Kle*^kqxVr!V diff --git a/RenX.Core/RenX_Plugin.cpp b/RenX.Core/RenX_Plugin.cpp index 6403751..d6696b0 100644 --- a/RenX.Core/RenX_Plugin.cpp +++ b/RenX.Core/RenX_Plugin.cpp @@ -55,6 +55,11 @@ void RenX::Plugin::RenX_OnPlayerDelete(Server *, const RenX::PlayerInfo *) return; } +void RenX::Plugin::RenX_OnPlayerUUIDChange(Server *, const RenX::PlayerInfo *, const Jupiter::ReadableString &) +{ + return; +} + bool RenX::Plugin::RenX_OnBan(Server *, const RenX::PlayerInfo *, Jupiter::StringType &) { return false; diff --git a/RenX.Core/RenX_Plugin.h b/RenX.Core/RenX_Plugin.h index 4497f55..cb4273a 100644 --- a/RenX.Core/RenX_Plugin.h +++ b/RenX.Core/RenX_Plugin.h @@ -45,6 +45,7 @@ namespace RenX /** Non-RCON RenX logs */ virtual void RenX_OnPlayerCreate(Server *server, const PlayerInfo *player); virtual void RenX_OnPlayerDelete(Server *server, const PlayerInfo *player); + virtual void RenX_OnPlayerUUIDChange(Server *server, const PlayerInfo *player, const Jupiter::ReadableString &newUUID); virtual bool RenX_OnBan(Server *server, const PlayerInfo *player, Jupiter::StringType &data); /** Player type logs */ diff --git a/RenX.Core/RenX_Server.cpp b/RenX.Core/RenX_Server.cpp index d0596d5..cf5dafe 100644 --- a/RenX.Core/RenX_Server.cpp +++ b/RenX.Core/RenX_Server.cpp @@ -27,6 +27,11 @@ #include "RenX_Plugin.h" #include "RenX_BanDatabase.h" +Jupiter::StringS default_uuid_func(RenX::Server *server, RenX::PlayerInfo *player) +{ + return server->formatSteamID(player); +} + int RenX::Server::think() { if (RenX::Server::connected == false) @@ -80,35 +85,10 @@ int RenX::Server::OnRehash() unsigned short oldPort = RenX::Server::port; Jupiter::StringS oldClientHostname = RenX::Server::clientHostname; Jupiter::StringS oldPass = RenX::Server::pass; - unsigned int oldUUIDMode = RenX::Server::uuidMode; int oldSteamFormat = RenX::Server::steamFormat; RenX::Server::commands.emptyAndDelete(); RenX::Server::init(); - if (oldHostname.equalsi(RenX::Server::hostname) && oldPort == RenX::Server::port && oldClientHostname.equalsi(RenX::Server::clientHostname) && oldPass.equalsi(RenX::Server::pass)) - { - if ((oldUUIDMode != RenX::Server::uuidMode || (RenX::Server::uuidMode == 0 && oldSteamFormat != RenX::Server::steamFormat)) && RenX::Server::players.size() != 0) - { - RenX::PlayerInfo *player; - for (Jupiter::DLList::Node *n = RenX::Server::players.getNode(0); n != nullptr; n = n->next) - { - player = n->data; - switch (this->uuidMode) - { - default: - case 0: - if (player->steamid != 0) - player->uuid = this->formatSteamID(player); - else - player->uuid = Jupiter::ReferenceString::empty; - break; - case 1: - player->uuid = player->name; - break; - } - } - } - } - else + if (oldHostname.equalsi(RenX::Server::hostname) == false || oldPort != RenX::Server::port || oldClientHostname.equalsi(RenX::Server::clientHostname) == false || oldPass.equalsi(RenX::Server::pass) == false) RenX::Server::reconnect(); return 0; } @@ -639,6 +619,42 @@ bool RenX::Server::removeCommand(const Jupiter::ReadableString &trigger) return false; } +void RenX::Server::setUUIDFunction(RenX::Server::uuid_func func) +{ + RenX::Server::calc_uuid = func; + if (RenX::Server::players.size() != 0) + { + Jupiter::DLList::Node *node = RenX::Server::players.getNode(0); + do + { + RenX::Server::setUUIDIfDifferent(node->data, RenX::Server::calc_uuid(this, node->data)); + node = node->next; + } + while (node != nullptr); + } +} + +RenX::Server::uuid_func RenX::Server::getUUIDFunction() const +{ + return RenX::Server::calc_uuid; +} + +void RenX::Server::setUUID(RenX::PlayerInfo *player, const Jupiter::ReadableString &uuid) +{ + Jupiter::ArrayList &xPlugins = *getCore()->getPlugins(); + for (size_t index = 0; index < xPlugins.size(); index++) + xPlugins.get(index)->RenX_OnPlayerUUIDChange(this, player, uuid); + player->uuid = uuid; +} + +bool RenX::Server::setUUIDIfDifferent(RenX::PlayerInfo *player, const Jupiter::ReadableString &uuid) +{ + if (player->uuid.equals(uuid)) + return false; + setUUID(player, uuid); + return true; +} + void RenX::Server::sendPubChan(const char *fmt, ...) const { va_list args; @@ -852,18 +868,6 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) this->silenceJoins = false; } }; - auto setPlayerSteamID = [this](RenX::PlayerInfo *player, uint64_t steamid) - { - player->steamid = steamid; - if (this->uuidMode == 0) - player->uuid = this->formatSteamID(steamid); - }; - auto setPlayerName = [this](RenX::PlayerInfo *player, const Jupiter::ReadableString &name) - { - player->name = name; - if (this->uuidMode == 1) - player->uuid = name; - }; auto parsePlayerData = [this](const Jupiter::ReadableString &data, Jupiter::ReferenceString &name, TeamType &team, int &id, bool &isBot) { Jupiter::ReferenceString idToken = Jupiter::ReferenceString::getToken(data, 1, ','); @@ -901,48 +905,54 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) }; auto getPlayerOrAdd = [&](const Jupiter::ReadableString &name, int id, RenX::TeamType team, bool isBot, uint64_t steamid, const Jupiter::ReadableString &ip) { - bool checkBans = false; RenX::PlayerInfo *r = this->getPlayer(id); - auto checkMissing = [&]() - { - if (r->ip32 == 0 && ip.isEmpty() == false) - { - r->ip = ip; - r->ip32 = Jupiter::Socket::pton4(Jupiter::CStringS(r->ip).c_str()); - checkBans = true; - } - if (r->steamid == 0U && steamid != 0U) - { - setPlayerSteamID(r, steamid); - checkBans = true; - } - }; if (r == nullptr) { - checkBans = true; r = new RenX::PlayerInfo(); r->id = id; - setPlayerName(r, name); - checkMissing(); + r->name = name; + r->team = team; + r->ip = ip; + r->ip32 = Jupiter::Socket::pton4(Jupiter::CStringS(r->ip).c_str()); + r->steamid = steamid; if (r->isBot = isBot) r->formatNamePrefix = IRCCOLOR "05[B]"; r->joinTime = time(nullptr); if (id != 0) this->players.add(r); + r->uuid = calc_uuid(this, r); + for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnPlayerCreate(this, r); } else { - checkMissing(); + bool recalcUUID = false; + r->team = team; + if (r->ip32 == 0 && ip.isEmpty() == false) + { + r->ip = ip; + r->ip32 = Jupiter::Socket::pton4(Jupiter::CStringS(r->ip).c_str()); + recalcUUID = true; + } + if (r->steamid == 0U && steamid != 0U) + { + r->steamid = steamid; + recalcUUID = true; + } if (r->name.size() == 0) + { r->name = name; + recalcUUID = true; + } + if (recalcUUID) + { + this->setUUIDIfDifferent(r, calc_uuid(this, r)); + if (banCheck(r)) + this->kickPlayer(r); + } } - r->team = team; - if (checkBans) - if (banCheck(r)) - this->kickPlayer(r); return r; }; auto parseGetPlayerOrAdd = [&parsePlayerData, &getPlayerOrAdd](const Jupiter::ReadableString &token) @@ -950,21 +960,6 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) PARSE_PLAYER_DATA_P(token); return getPlayerOrAdd(name, id, team, isBot, 0U, Jupiter::ReferenceString::empty); }; - auto resetPlayerCharacter = [](PlayerInfo *player) - { - switch (player->team) - { - case TeamType::GDI: - player->character = STRING_LITERAL_AS_REFERENCE("Rx_FamilyInfo_GDI_Soldier"); - break; - case TeamType::Nod: - player->character = STRING_LITERAL_AS_REFERENCE("Rx_FamilyInfo_Nod_Soldier"); - break; - default: - player->character = Jupiter::ReferenceString::empty; - break; - } - }; if (buff.size() != 0) { @@ -1080,7 +1075,17 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) if (player->ip.isEmpty()) player->ip = table.get(STRING_LITERAL_AS_REFERENCE("IP")); if (player->steamid == 0) - setPlayerSteamID(player, table.get(STRING_LITERAL_AS_REFERENCE("STEAM")).asUnsignedLongLong()); + { + uint64_t steamid = table.get(STRING_LITERAL_AS_REFERENCE("STEAM")).asUnsignedLongLong(); + if (steamid != 0) + { + player->steamid = steamid; + if (calc_uuid == default_uuid_func) + setUUID(player, this->formatSteamID(steamid)); + else + this->setUUIDIfDifferent(player, calc_uuid(this, player)); + } + } pair = table.getPair(STRING_LITERAL_AS_REFERENCE("TeamNum")); if (pair != nullptr) @@ -1105,7 +1110,17 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) if (player->ip.isEmpty()) player->ip = table.get(STRING_LITERAL_AS_REFERENCE("IP")); if (player->steamid == 0) - setPlayerSteamID(player, table.get(STRING_LITERAL_AS_REFERENCE("STEAM")).asUnsignedLongLong()); + { + uint64_t steamid = table.get(STRING_LITERAL_AS_REFERENCE("STEAM")).asUnsignedLongLong(); + if (steamid != 0) + { + player->steamid = steamid; + if (calc_uuid == default_uuid_func) + setUUID(player, this->formatSteamID(steamid)); + else + this->setUUIDIfDifferent(player, calc_uuid(this, player)); + } + } pair = table.getPair(STRING_LITERAL_AS_REFERENCE("TeamNum")); if (pair != nullptr) @@ -1498,7 +1513,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnSuicide(this, player, damageType); } - resetPlayerCharacter(player); + player->character = Jupiter::ReferenceString::empty; } onAction(); } @@ -1697,7 +1712,7 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) // Player | "joined" | Team // Player | "joined" | Team | "left" | Old Team RenX::PlayerInfo *player = parseGetPlayerOrAdd(buff.getToken(2, RenX::DelimC)); - resetPlayerCharacter(player); + player->character = Jupiter::ReferenceString::empty; if (buff.tokenCount(RenX::DelimC) > 4) { RenX::TeamType oldTeam = RenX::getTeam(buff.getToken(6, RenX::DelimC)); @@ -2215,6 +2230,7 @@ const Jupiter::ReadableString &RenX::Server::getRCONUsername() const RenX::Server::Server(const Jupiter::ReadableString &configurationSection) { RenX::Server::configSection = configurationSection; + RenX::Server::calc_uuid = default_uuid_func; init(); } @@ -2233,7 +2249,6 @@ void RenX::Server::init() RenX::Server::rules = Jupiter::IRC::Client::Config->get(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("Rules"), STRING_LITERAL_AS_REFERENCE("Anarchy!")); RenX::Server::delay = Jupiter::IRC::Client::Config->getInt(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("ReconnectDelay"), 10); - RenX::Server::uuidMode = Jupiter::IRC::Client::Config->getInt(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("UUIDMode"), 0); RenX::Server::rconBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("RCONBan"), false); RenX::Server::localSteamBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("LocalSteamBan"), true); RenX::Server::localIPBan = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("LocalIPBan"), true); diff --git a/RenX.Core/RenX_Server.h b/RenX.Core/RenX_Server.h index e239ac1..1085839 100644 --- a/RenX.Core/RenX_Server.h +++ b/RenX.Core/RenX_Server.h @@ -616,6 +616,47 @@ namespace RenX */ bool removeCommand(const Jupiter::ReadableString &trigger); + /** + * @brief Prototype of UUID calculation function. + * Note: Every player's UUID should be either unique, or empty. + * + * @param player Player to calculate UUID of + * @return UUID calculated from player. + */ + typedef Jupiter::StringS(*uuid_func)(RenX::Server *server, RenX::PlayerInfo *player); + + /** + * @brief Sets the player UUID calculation function. + * Note: This also recalculates the UUIDs of all current players. + * + * @param function Function to calculate UUIDs with. + */ + void setUUIDFunction(uuid_func); + + /** + * @brief Fetches the current UUID calculation function. + * + * @return Function used to calculate UUIDs. + */ + uuid_func getUUIDFunction() const; + + /** + * @brief Changes a player's UUID. + * + * @param player Player with UUID to change + * @param uuid Player's new UUID + */ + void setUUID(RenX::PlayerInfo *player, const Jupiter::ReadableString &uuid); + + /** + * @brief Changes a player's UUID only if it is different than their current UUID + * + * @param player Player with UUID to change + * @param uuid Player's new UUID + * @return True if the UUIDs did not match, false otherwise. + */ + bool setUUIDIfDifferent(RenX::PlayerInfo *player, const Jupiter::ReadableString &uuid); + /** * @brief Formats and sends a message to a server's corresponding public channels. * @@ -734,13 +775,13 @@ namespace RenX time_t delay; std::chrono::milliseconds clientUpdateRate; int steamFormat; /** 16 = hex, 10 = base 10, 8 = octal, -2 = SteamID 2, -3 = SteamID 3 */ - unsigned int uuidMode; /** 0 = steam, 1 = nickname */ bool rconBan; bool localBan; bool localSteamBan; bool localIPBan; bool localNameBan; bool neverSay; + uuid_func calc_uuid; Jupiter::TCPSocket sock; Jupiter::CStringS clientHostname; Jupiter::CStringS hostname;