From c20e9fed7fff1c50ecbfa7e8b2e453609bf57e0d Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Wed, 22 Oct 2014 06:09:16 -0400 Subject: [PATCH] Server now rehashes settings; added commandsFile to core; added access levels to PlayerInfo and GameCommand; aliases and access overrides are now read from the commandsFile; Jupiter version updated. --- Jupiter | 2 +- Jupiter Bot.sln | 10 ++++ Release/Bot.lib | Bin 19858 -> 19858 bytes Release/Plugins/RenX.Core.lib | Bin 59394 -> 61562 bytes RenX.Core/RenX_Core.cpp | 8 ++- RenX.Core/RenX_Core.h | 8 +++ RenX.Core/RenX_GameCommand.cpp | 10 ++++ RenX.Core/RenX_GameCommand.h | 17 +++++++ RenX.Core/RenX_PlayerInfo.h | 1 + RenX.Core/RenX_Server.cpp | 87 +++++++++++++++++++++++++++++++-- RenX.Core/RenX_Server.h | 24 ++++++++- 11 files changed, 159 insertions(+), 8 deletions(-) diff --git a/Jupiter b/Jupiter index 2359036..b5d253d 160000 --- a/Jupiter +++ b/Jupiter @@ -1 +1 @@ -Subproject commit 23590369846084db28456549162ecfa530fc0a81 +Subproject commit b5d253da72553929b18a805c01fc2999568d99e3 diff --git a/Jupiter Bot.sln b/Jupiter Bot.sln index ca2ba27..df7ca2c 100644 --- a/Jupiter Bot.sln +++ b/Jupiter Bot.sln @@ -121,6 +121,12 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RenX.IRCJoin", "RenX.IRCJoi {9103DF3D-8B4A-48E5-A6B3-CBE2554630E2} = {9103DF3D-8B4A-48E5-A6B3-CBE2554630E2} EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RenX.ModSystem", "RenX.ModSystem\RenX.ModSystem.vcxproj", "{160CD71B-1E13-4816-9977-8BBD73871F31}" + ProjectSection(ProjectDependencies) = postProject + {C188871B-5F32-4946-B301-24CA2EBB275D} = {C188871B-5F32-4946-B301-24CA2EBB275D} + {9103DF3D-8B4A-48E5-A6B3-CBE2554630E2} = {9103DF3D-8B4A-48E5-A6B3-CBE2554630E2} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -211,6 +217,10 @@ Global {672B3FC9-0B31-45B4-AAB6-669073F2D291}.Debug|Win32.Build.0 = Debug|Win32 {672B3FC9-0B31-45B4-AAB6-669073F2D291}.Release|Win32.ActiveCfg = Release|Win32 {672B3FC9-0B31-45B4-AAB6-669073F2D291}.Release|Win32.Build.0 = Release|Win32 + {160CD71B-1E13-4816-9977-8BBD73871F31}.Debug|Win32.ActiveCfg = Debug|Win32 + {160CD71B-1E13-4816-9977-8BBD73871F31}.Debug|Win32.Build.0 = Debug|Win32 + {160CD71B-1E13-4816-9977-8BBD73871F31}.Release|Win32.ActiveCfg = Release|Win32 + {160CD71B-1E13-4816-9977-8BBD73871F31}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Release/Bot.lib b/Release/Bot.lib index 818d01d38d00709469c130a707065078baa622e1..2e4891d50e084d3a008c6aa2fb06d9c778f574df 100644 GIT binary patch delta 1584 zcmZuwOH30{6r}+y-vBanM1;1MkJtb+{Y|G|3oWIkM2Q+Vnu1CUVL?b-n79yjvLM0U zjfO}yE?k*F2pbn}jc$sGiE%+NCdP#eAz?#|pZngMH+>{_H>c;Gd+xdS71k_;HOuOm z6T0T{XuiUbZ8P|+t^Boh*!EiZg!k^|O3zYyYuEk5VzOlTHqca!@ReL}A~Fr`TKgx*&{epT>6c0f_-G>dG|?2||#{8ZusnpGJ(ttJHYjmp%zP^*%t zStU47?E+&%V+;rBMi_PN*slf_HOXMXR6>TQo>porjI?S>lc3~@3PR_+%s|{bBB1MD zsez2+#5yZBfV|TNAH5EN!sqGpiSwXyI^`2zSm5p(vs?YTfMOGBjx?#Ss4BFdhEHA| z88|cRcHXV=^4+Ort3@BWgSfG5BRj z9HS=8H0gd1ZFcEzr7crnHVUd8T|AsN&-W2WQguq1VA_;rB^wwy7V$L@2Ov?`7<_V(DE0h9ZTWY{y0 z;4BI`m-YU$P?AopeRW3BgN9t4~HtZLEPelrXtzum=l+Sg1O> PYKQ0V4$j=0si^x0&2p&S delta 1584 zcmZuwOH30{6r}+y-vBanM1;1MkJtb+^fS{xg_hD%qC|}wO+h7wuplHZOk4;%S&(4w zMnj|;7p_bogpCWA8r>8V6XSwlOpFT`Lc)d^Kli;iZ~92=ZcfiV_uO;u%dc7TYnIhB zCv?s4*Yx~=ZBu{RQu^9DYF%C*D6!%K&^73 zW|iPTwF`_5jWHag8)4M6V!tX_)FguiQ*jxd3^r3+A*5AOngqqch#+*%!wkecBLcea zk?P1ePOP(H1IRgT@X_NCD14qCuQ(4nr&B)mh6L`uF}u|l5KwGF&5)9}f| zBLjyfL($hvZMcz9M{Im4cflWj6|AV@3Nd`zblRU3#4*?z;4mH@JP0t2LVzp7VpN8s0Mlp)&WIWhgA9HV z6vwCvF%5etCwS)RZ-#jK)JA=n1=f#&wUWRVYFZ%J*#x%+`GcT543CBN|y^RCdH-G8Ga2h;ikAb!&IDESczZZqB{v0{>GW;EQ)rb=t0{JxIb)O z8nJ_YX&}YnSzbvFkoTAyF?-;c)#PbpP^A5l+ognAvy))HekbNRlQdmU zvZjTknb^iCV+KYSIFm!WC5S9$F2#zMQkOWB%z9wJ*0FmWCanr%jJ-WJXTan>!)f-+ z!#ImV&Sky#EEJ`au$n%0F8t{C()_wX$uOhWGye_jC}R#!azp|8)cdfJ7dJ3j*$pnA zxdB4iH7E*Fd`Pj>^}?abZ4kHkps7eFGW=wX_I7xb<&0xD@jc7ilfvu-E9}BT9Sc=Q QNA>Xho&K4-Gi5dZ0OHBAQvd(} diff --git a/Release/Plugins/RenX.Core.lib b/Release/Plugins/RenX.Core.lib index c1ed572571aab63e44c6a4ab8527ff6a3a43053c..1978e7ffcd82ba8920ec9f97fea4dfa56850d27a 100644 GIT binary patch delta 8292 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 Az5oCK delta 7359 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 b$y=SSnewkk;VxUp$HwMI+agJRT>XCmw}{E9 diff --git a/RenX.Core/RenX_Core.cpp b/RenX.Core/RenX_Core.cpp index b9c6b99..76be9f7 100644 --- a/RenX.Core/RenX_Core.cpp +++ b/RenX.Core/RenX_Core.cpp @@ -38,8 +38,9 @@ RenX::Core::Core() { const Jupiter::ReadableString &serverList = Jupiter::IRC::Client::Config->get(STRING_LITERAL_AS_REFERENCE("RenX"), STRING_LITERAL_AS_REFERENCE("Servers")); RenX::Core::translationsFile.readFile(Jupiter::IRC::Client::Config->get(STRING_LITERAL_AS_REFERENCE("RenX"), STRING_LITERAL_AS_REFERENCE("TranslationsFile"), STRING_LITERAL_AS_REFERENCE("Translations.ini"))); - RenX::initTranslations(RenX::Core::translationsFile); + RenX::Core::commandsFile.readFile(Jupiter::IRC::Client::Config->get(STRING_LITERAL_AS_REFERENCE("RenX"), STRING_LITERAL_AS_REFERENCE("CommandsFile"), STRING_LITERAL_AS_REFERENCE("RenXGameCommands.ini"))); + unsigned int wc = serverList.wordCount(WHITESPACE); RenX::Server *server; @@ -136,6 +137,11 @@ Jupiter::INIFile &RenX::Core::getTranslationsFile() return RenX::Core::translationsFile; } +Jupiter::INIFile &RenX::Core::getCommandsFile() +{ + return RenX::Core::commandsFile; +} + int RenX::Core::addCommand(RenX::GameCommand *command) { for (size_t i = 0; i != RenX::Core::servers.size(); i++) diff --git a/RenX.Core/RenX_Core.h b/RenX.Core/RenX_Core.h index cdbd674..c61c558 100644 --- a/RenX.Core/RenX_Core.h +++ b/RenX.Core/RenX_Core.h @@ -150,6 +150,13 @@ namespace RenX */ Jupiter::INIFile &getTranslationsFile(); + /** + * @brief Fetches the commands settings file. + * + * @return Commands settings configuration file. + */ + Jupiter::INIFile &getCommandsFile(); + /** * @brief Copys a command, and passes it to each server. * @@ -174,6 +181,7 @@ namespace RenX Jupiter::ArrayList servers; Jupiter::ArrayList plugins; Jupiter::INIFile translationsFile; + Jupiter::INIFile commandsFile; }; RENX_API Core *getCore(); diff --git a/RenX.Core/RenX_GameCommand.cpp b/RenX.Core/RenX_GameCommand.cpp index 6f65b56..7ff2c63 100644 --- a/RenX.Core/RenX_GameCommand.cpp +++ b/RenX.Core/RenX_GameCommand.cpp @@ -48,4 +48,14 @@ RenX::GameCommand::~GameCommand() break; } } +} + +int RenX::GameCommand::getAccessLevel() +{ + return RenX::GameCommand::access; +} + +void RenX::GameCommand::setAccessLevel(int accessLevel) +{ + RenX::GameCommand::access = accessLevel; } \ No newline at end of file diff --git a/RenX.Core/RenX_GameCommand.h b/RenX.Core/RenX_GameCommand.h index 6c04632..a4f7e41 100644 --- a/RenX.Core/RenX_GameCommand.h +++ b/RenX.Core/RenX_GameCommand.h @@ -45,6 +45,20 @@ namespace RenX { public: + /** + * @brief Fetches a command's minimum access level. + * + * @return Minimum access level. + */ + int getAccessLevel(); + + /** + * @brief Sets a command's minimum access level. + * + * @param accessLevel Access level. + */ + void setAccessLevel(int accessLevel); + /** * @brief Called when a player with the proper access privledges executes this command. * @@ -82,6 +96,9 @@ namespace RenX * Note: This is not automatically generated by any macro, and is available for use. */ virtual ~GameCommand(); + + private: + int access; /** Minimum access level */ }; } diff --git a/RenX.Core/RenX_PlayerInfo.h b/RenX.Core/RenX_PlayerInfo.h index 8f3a59c..bc52efe 100644 --- a/RenX.Core/RenX_PlayerInfo.h +++ b/RenX.Core/RenX_PlayerInfo.h @@ -60,6 +60,7 @@ namespace RenX unsigned int wins = 0; unsigned int loses = 0; unsigned int beaconPlacements = 0; + int access = 0; mutable Jupiter::INIFile varData; // This will be replaced later with a more dedicated type. }; diff --git a/RenX.Core/RenX_Server.cpp b/RenX.Core/RenX_Server.cpp index 5ef44ce..3bd7ea4 100644 --- a/RenX.Core/RenX_Server.cpp +++ b/RenX.Core/RenX_Server.cpp @@ -67,6 +67,50 @@ int RenX::Server::think() return 0; } +int RenX::Server::OnRehash() +{ + Jupiter::StringS oldHostname = RenX::Server::hostname; + 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 + RenX::Server::reconnect(); + return 0; +} + +bool RenX::Server::OnBadRehash(bool removed) +{ + return removed; +} + bool RenX::Server::isConnected() const { return RenX::Server::connected; @@ -861,6 +905,10 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) if (action.equals("logged in as")) { player->adminType = buff.getWord(3, RenX::DelimS); + if (player->adminType.equalsi("moderator") && player->access < 1) + player->access = 1; + else if (player->adminType.equalsi("administrator") && player->access < 2) + player->access = 2; for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnAdminLogin(this, player); } @@ -870,10 +918,15 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnAdminLogout(this, player); player->adminType = ""; + player->access = 0; } else if (action.equals("granted")) { player->adminType = buff.getWord(3, RenX::DelimS); + if (player->adminType.equalsi("moderator") && player->access < 1) + player->access = 1; + else if (player->adminType.equalsi("administrator") && player->access < 2) + player->access = 2; for (size_t i = 0; i < xPlugins.size(); i++) xPlugins.get(i)->RenX_OnAdminGrant(this, player); } @@ -1017,7 +1070,7 @@ bool RenX::Server::connect() bool RenX::Server::reconnect() { - RenX::Server::sock.closeSocket(); + RenX::Server::disconnect(); return RenX::Server::connect(); } @@ -1026,7 +1079,6 @@ void RenX::Server::wipeData() RenX::Server::rconUser.truncate(RenX::Server::rconUser.size()); while (RenX::Server::players.size() != 0) delete RenX::Server::players.remove(0U); - RenX::Server::commands.emptyAndDelete(); } unsigned int RenX::Server::getVersion() const @@ -1047,11 +1099,14 @@ const Jupiter::ReadableString &RenX::Server::getRCONUsername() const RenX::Server::Server(const Jupiter::ReadableString &configurationSection) { RenX::Server::configSection = configurationSection; + init(); +} +void RenX::Server::init() +{ RenX::Server::hostname = Jupiter::IRC::Client::Config->get(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("Hostname"), STRING_LITERAL_AS_REFERENCE("localhost")); RenX::Server::port = (unsigned short)Jupiter::IRC::Client::Config->getInt(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("Port"), 7777); RenX::Server::clientHostname = Jupiter::IRC::Client::Config->get(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("ClientAddress")); - RenX::Server::pass = Jupiter::IRC::Client::Config->get(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("Password"), STRING_LITERAL_AS_REFERENCE("renx")); RenX::Server::logChanType = Jupiter::IRC::Client::Config->getShort(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("ChanType")); @@ -1066,12 +1121,34 @@ RenX::Server::Server(const Jupiter::ReadableString &configurationSection) RenX::Server::steamFormat = Jupiter::IRC::Client::Config->getInt(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("SteamFormat"), 16); RenX::Server::neverSay = Jupiter::IRC::Client::Config->getBool(RenX::Server::configSection, STRING_LITERAL_AS_REFERENCE("NeverSay"), false); - for (size_t i = 0; i < RenX::GameMasterCommandList->size(); i++) - RenX::Server::addCommand(RenX::GameMasterCommandList->get(i)->copy()); + Jupiter::INIFile &commandsFile = RenX::getCore()->getCommandsFile(); + RenX::Server::commandAccessLevels = commandsFile.getSection(RenX::Server::configSection); + RenX::Server::commandAliases = commandsFile.getSection(Jupiter::StringS::Format("%.*s.Aliases", RenX::Server::configSection.size(), RenX::Server::configSection.ptr())); + + RenX::GameCommand *cmd; + for (size_t i = 0, j; i < RenX::GameMasterCommandList->size(); i++) + { + cmd = RenX::GameMasterCommandList->get(i)->copy(); + RenX::Server::addCommand(cmd); + if (commandAccessLevels != nullptr) + { + const Jupiter::ReadableString &accessLevel = RenX::Server::commandAccessLevels->getValue(cmd->getTrigger()); + if (accessLevel.isEmpty() == false) + cmd->setAccessLevel(accessLevel.asInt()); + } + if (commandAliases != nullptr) + { + const Jupiter::ReadableString &aliasList = RenX::Server::commandAliases->getValue(cmd->getTrigger()); + j = aliasList.wordCount(WHITESPACE); + while (j != 0) + cmd->addTrigger(Jupiter::ReferenceString::getWord(aliasList, --j, WHITESPACE)); + } + } } RenX::Server::~Server() { sock.closeSocket(); RenX::Server::wipeData(); + RenX::Server::commands.emptyAndDelete(); } diff --git a/RenX.Core/RenX_Server.h b/RenX.Core/RenX_Server.h index b28848c..9705adb 100644 --- a/RenX.Core/RenX_Server.h +++ b/RenX.Core/RenX_Server.h @@ -30,6 +30,7 @@ #include "Jupiter/CString.h" #include "Jupiter/INIFile.h" #include "Jupiter/Thinker.h" +#include "Jupiter/Rehash.h" #include "RenX.h" #include "RenX_ServerProfile.h" @@ -50,7 +51,7 @@ namespace RenX * @brief Represents a connection to an individiaul Renegade-X server. * There are often more than one of these, such as when communities run multiple servers. */ - class RENX_API Server : public Jupiter::Thinker + class RENX_API Server : public Jupiter::Thinker, public Jupiter::Rehashable { public: // Jupiter::Thinker @@ -61,6 +62,23 @@ namespace RenX */ int think(); + public: // Jupiter::Rehashable + + /** + * @brief Rehashes an object's status. + * + * @return 0. + */ + virtual int OnRehash(); + + /** + * @brief Fires when a non-zero value is returned by an object during a call to rehash(). + * + * @param removed True if the object was removed from the rehashable objects list, false otherwise. + * @return True if the object should be deleted, false otherwise. + */ + virtual bool OnBadRehash(bool removed); + public: // RenX::Server Jupiter::DLList players; /** A list of players in the server */ Jupiter::INIFile varData; /** This may be replaced later with a more dedicated type. */ @@ -481,6 +499,8 @@ namespace RenX /** Private members */ private: + void init(); + /** Tracking variables */ bool connected = false; bool needsCList = false; @@ -513,6 +533,8 @@ namespace RenX Jupiter::StringS IRCPrefix; Jupiter::StringS CommandPrefix; Jupiter::StringS rconUser; + Jupiter::INIFile::Section *commandAccessLevels; + Jupiter::INIFile::Section *commandAliases; }; }