From ffb48f69c7dcb7692ef3805e9a498821d0856171 Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Thu, 6 Nov 2014 00:39:44 -0500 Subject: [PATCH] Added name lock for moderators; added RenX_ModSystemPlugin::set(); modsFile is now public; Added IRC Commands: DeAuth, Add, Del, ModList. --- Jupiter | 2 +- Release/Bot.lib | Bin 19858 -> 19858 bytes Release/Plugins/RenX.Core.lib | Bin 67388 -> 67706 bytes RenX.ModSystem/RenX_ModSystem.cpp | 264 +++++++++++++++++++++++++++++- RenX.ModSystem/RenX_ModSystem.h | 10 +- 5 files changed, 273 insertions(+), 3 deletions(-) diff --git a/Jupiter b/Jupiter index 7ca20a9..2ec8cc4 160000 --- a/Jupiter +++ b/Jupiter @@ -1 +1 @@ -Subproject commit 7ca20a9d47af050ea46ac72f21e9c1e29c3ab12f +Subproject commit 2ec8cc41a1e9391c1be6396cd558904365686a67 diff --git a/Release/Bot.lib b/Release/Bot.lib index 197e53aed65cf0950b88c793bfb0e0b464127f13..08963a86cb0fd1be1a050cc7b8dafc30e6a9de1d 100644 GIT binary patch delta 1646 zcmZuxOH30{6r}-Dz5(pe3J7g2AF%;u`u~@f0;Lp#hPW^)pMX(`9}*YFjj)pi3HEL@ zL>lA5l?jBfVB^Zf=%$#M7#9Rx7!x-_!iE?>_r2G7^Cq#oIX(B>bI-jqxiv#>&9K^H z^t#+0pD&o}Gj9g+jl$#BQR9yI4DX%wrMKQ(+S+seFlamreCw$zM|@%%oPAa}+51)d zvy&Ed_caRzW|)$tYEsZuLVjiN!D55Fd`c@bL%l~LrSMaZiEu_?@U+q|!mkx3*oJbY zM9?U~q0%N&HvEiYBOM8)stJ2mz@p!z(qJlKfoCog^%h26Ips-Ea79!O#sp{F%tYLs z6ybHZR70k+W2F&$z@*&_AKg}wqmI?((T#=v>9kKhA(4Gh48iCPh%h#y7D=P(lCoS= zGkkLM^uXq~K*4LGUYtm&Azr?eI^d750#+1Bl)_EW#?!u(2w%=J__L44jIw7bb<95` zQZZKwzxC@fvIQ9I4{+<$*yN~*(q9BJs)`P`2RTlneiURf`5;$^#h3+-gG{C_G^>+& z9Afy(kZzueFq5%{uc~ySu5M#9%(p?!)J9l(y_jATNpGR55kl<^Fze#)3ngOAbeiXp zw5kgS5tdVH^c=^?VJ$})Hy<6>;k7Y_J7O0(z8GT~uVU8(%mPZBafjpD*d&g3MSMR# zqvKEZvtu5`LF{n(PWI~*`RsJjF@%ddW>-H^~`nMyDpD~SoNyPLAW-vraWfx7Le zd)P7q50lyn5>MEhW>ZLB=e6WC)jsnBS|6OZlDs+@)a!zU0SDBlqPi+I>7|rbwVPt@ zey478F6q2H$U5f-we&WI7&ka{mvdEYPr%5g=7(AR((nb&B~u?3abx-c$4S3@n(?>O zH&vWmS7d~J4zasUW*dO7y4|0b2y^{HVddC?p2a+mk&~HKy zHuK;{&X;$B!>etCaQ2EE8983$7;3uVNa0?HXMFLgOgmD1WUourz?Bimk0OdFNj5-2J(ds(+ec*Kq&< delta 1646 zcmZuxOH30{6r}-Dz5#6M2ncO0AF%;u==A@irIb>NK|@@rd;&%#QAu1FH^NR9B-p#r z5NV7HS0)g`!i`&_n_^;OTo80&Oxy?w8)E$2_g?4Co5b$s^xSjLJ@?M!H%$2r(|Vg( z4aln3E9VDn+krx}@VIl_{91g5_wL5>v^ur3@BU%Zc@li`^ZLCw@hSbF`KUJFTYsiql1olP)5$ln)A#F*(c&m$R4 z7Y-vVr}pRtj*-J!jWTW_I%&Y`V+?o2E^~Z2#x!2Vt_zq1N}O>=+nPc+8t^PLR7?Fgaql1Uk#FA*S7w&}W%RFdu7)DXzPhlHhNG>E1-$PSibW zn}df*{RD|8>`k*NCU5Xsa++G7#bLb<&Rb1hoh<70z|yb_8dFh2m6r5MO0U{WF?YXH zw>g(|UL9eb3nO}ZTWQ7(rtfmDhV2U&+0^1Ft6v$t#JObZqY`e;Jm5I#SI98_ZswMT zlk19%vF||yhmy$^ZT6mpqV*K4j~TB>dnXRY`0az7Wqz+_|DWDTR?mT?iW>Br(1*=b z+{nesZg6?^jS$X$i6bM&iyTv3FB~h}3-OFEK9%W2ijOST-VRT4oMJeX?>TOPl;$Q_ XX&06TuvBq$R44D;>tDFPP*(E~l&Glp diff --git a/Release/Plugins/RenX.Core.lib b/Release/Plugins/RenX.Core.lib index 0e3c3af6b18d653b57cb10b7312d8361288d1796..96b3cd38ff628ee680adb34ead14b5192cab43e4 100644 GIT binary patch delta 8285 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 = RenX_ModSystemPlugin::modsFile.getBool(Jupiter::ReferenceString::empty, groupName, RenX_ModSystemPlugin::lockIP); groupName.truncate(dotLockIP.size()); + groupName += dotLockName; + group->lockName = RenX_ModSystemPlugin::modsFile.getBool(Jupiter::ReferenceString::empty, groupName, RenX_ModSystemPlugin::lockName); + groupName.truncate(dotLockName.size()); + groupName += dotKickLockMismatch; group->kickLockMismatch = RenX_ModSystemPlugin::modsFile.getBool(Jupiter::ReferenceString::empty, groupName, RenX_ModSystemPlugin::kickLockMismatch); groupName.truncate(dotKickLockMismatch.size()); @@ -173,14 +179,16 @@ int RenX_ModSystemPlugin::auth(RenX::Server *server, const RenX::PlayerInfo *pla bool lockSteam_l = section->getBool(STRING_LITERAL_AS_REFERENCE("LockSteam"), group->lockSteam); bool lockIP_l = section->getBool(STRING_LITERAL_AS_REFERENCE("LockIP"), group->lockIP); + bool lockName_l = section->getBool(STRING_LITERAL_AS_REFERENCE("LockName"), group->lockName); bool kickLockMismatch_l = section->getBool(STRING_LITERAL_AS_REFERENCE("KickLockMismatch"), group->kickLockMismatch); bool autoAuthSteam_l = section->getBool(STRING_LITERAL_AS_REFERENCE("AutoAuthSteam"), group->autoAuthSteam); bool autoAuthIP_l = section->getBool(STRING_LITERAL_AS_REFERENCE("AutoAuthIP"), group->autoAuthIP); uint64_t steamid = section->get(STRING_LITERAL_AS_REFERENCE("SteamID")).asUnsignedLongLong(); const Jupiter::ReadableString &ip = section->get(STRING_LITERAL_AS_REFERENCE("LastIP")); + const Jupiter::ReadableString &name = section->get(STRING_LITERAL_AS_REFERENCE("Name")); - if ((lockSteam_l == false || player->steamid == steamid) && (lockIP_l == false || player->ip.equalsi(ip))) + if ((lockSteam_l == false || player->steamid == steamid) && (lockIP_l == false || player->ip.equalsi(ip)) && (lockName_l == false || player->name.equalsi(name))) { if (checkAuto == false || (autoAuthSteam_l && player->steamid == steamid) || (autoAuthIP_l && player->ip.equalsi(ip))) return sectionAuth(); @@ -211,6 +219,15 @@ void RenX_ModSystemPlugin::tempAuth(RenX::Server *server, const RenX::PlayerInfo server->sendMessage(player, Jupiter::StringS::Format("You have been authorized into group \"%.*s\", with access level %u.", group->name.size(), group->name.ptr(), player->access)); } +bool RenX_ModSystemPlugin::set(RenX::PlayerInfo *player, RenX_ModSystemPlugin::ModGroup *group) +{ + bool r = RenX_ModSystemPlugin::modsFile.set(player->uuid, STRING_LITERAL_AS_REFERENCE("Group"), group->name); + RenX_ModSystemPlugin::modsFile.set(player->uuid, STRING_LITERAL_AS_REFERENCE("SteamID"), Jupiter::StringS::Format("%llu", player->steamid)); + RenX_ModSystemPlugin::modsFile.set(player->uuid, STRING_LITERAL_AS_REFERENCE("LastIP"), player->ip); + RenX_ModSystemPlugin::modsFile.set(player->uuid, STRING_LITERAL_AS_REFERENCE("Name"), player->name); + return r; +} + RenX_ModSystemPlugin::ModGroup *RenX_ModSystemPlugin::getGroupByName(const Jupiter::ReadableString &name, ModGroup *defaultGroup) const { if (RenX_ModSystemPlugin::groups.size() != 0) @@ -326,6 +343,7 @@ void RenX_ModSystemPlugin::RenX_OnPlayerDelete(RenX::Server *server, const RenX: { section->set(STRING_LITERAL_AS_REFERENCE("SteamID"), Jupiter::StringS::Format("%llu", player->steamid)); section->set(STRING_LITERAL_AS_REFERENCE("LastIP"), player->ip); + section->set(STRING_LITERAL_AS_REFERENCE("Name"), player->name); } } } @@ -454,6 +472,66 @@ const Jupiter::ReadableString &AuthIRCCommand::getHelp(const Jupiter::ReadableSt IRC_COMMAND_INIT(AuthIRCCommand) +// DeAuth IRC Command + +void DeAuthIRCCommand::create() +{ + this->addTrigger(STRING_LITERAL_AS_REFERENCE("unauth")); + this->addTrigger(STRING_LITERAL_AS_REFERENCE("deauth")); + this->addTrigger(STRING_LITERAL_AS_REFERENCE("demod")); + this->addTrigger(STRING_LITERAL_AS_REFERENCE("dtm")); + this->setAccessLevel(3); +} + +void DeAuthIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &channel, const Jupiter::ReadableString &nick, const Jupiter::ReadableString ¶meters) +{ + if (parameters.isEmpty() == false) + { + Jupiter::IRC::Client::Channel *chan = source->getChannel(channel); + if (chan != nullptr) + { + RenX::Server *server; + RenX::PlayerInfo *player; + int type = chan->getType(); + bool serverMatch = false; + for (unsigned int i = 0; i != RenX::getCore()->getServerCount(); i++) + { + server = RenX::getCore()->getServer(i); + if (server->isLogChanType(type)) + { + serverMatch = true; + player = server->getPlayerByPartName(parameters); + if (player == nullptr) + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Player not found.")); + else + { + int uAccess = source->getAccessLevel(channel, nick); + int cAccess = pluginInstance.getConfigAccess(player->uuid); + if (cAccess > uAccess && uAccess < static_cast(source->getPrefixes().size())) + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Can't unauthenticate higher level moderators.")); + else if (pluginInstance.resetAccess(player)) + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Player unauthenticated successfully.")); + else + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Player not authenticated.")); + } + } + } + if (serverMatch == false) + source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Channel not attached to any connected Renegade X servers.")); + } + } + else + this->trigger(source, channel, nick, nick); +} + +const Jupiter::ReadableString &DeAuthIRCCommand::getHelp(const Jupiter::ReadableString &) +{ + static STRING_LITERAL_AS_NAMED_REFERENCE(defaultHelp, "Unauthenticates a player in-game. Syntax: deauth [player=you]"); + return defaultHelp; +} + +IRC_COMMAND_INIT(DeAuthIRCCommand) + // ATM IRC Command void ATMIRCCommand::create() @@ -538,6 +616,142 @@ const Jupiter::ReadableString &ATMIRCCommand::getHelp(const Jupiter::ReadableStr IRC_COMMAND_INIT(ATMIRCCommand) +// Add IRC Command + +void AddIRCCommand::create() +{ + this->addTrigger(STRING_LITERAL_AS_REFERENCE("add")); + this->addTrigger(STRING_LITERAL_AS_REFERENCE("set")); + this->setAccessLevel(5); +} + +void AddIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &channel, const Jupiter::ReadableString &nick, const Jupiter::ReadableString ¶meters) +{ + if (parameters.wordCount(WHITESPACE) < 2) + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Too few parameters. Syntax: add ")); + else + { + Jupiter::IRC::Client::Channel *chan = source->getChannel(channel); + if (chan != nullptr) + { + RenX::Server *server; + RenX::PlayerInfo *player; + RenX_ModSystemPlugin::ModGroup *group = nullptr; + int type = chan->getType(); + bool serverMatch = false; + Jupiter::ReferenceString playerName = parameters; + if (isdigit(parameters.get(0))) + { + int index = parameters.asInt(); + + if (index < 0 || index >= static_cast(pluginInstance.groups.size())) + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Invalid group index.")); + else + { + group = pluginInstance.groups.get(index); + playerName = playerName.gotoWord(1, WHITESPACE); + } + } + if (group == nullptr) + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Invalid group.")); + else + { + for (unsigned int i = 0; i != RenX::getCore()->getServerCount(); i++) + { + server = RenX::getCore()->getServer(i); + if (server->isLogChanType(type)) + { + serverMatch = true; + player = server->getPlayerByPartName(playerName); + if (player == nullptr) + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Player not found.")); + else if (player->isBot) + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: A bot can not be a moderator.")); + else + { + if (pluginInstance.set(player, group)) + source->sendNotice(nick, Jupiter::StringS::Format("%.*s has been added to group \"%.*s\"", player->name.size(), player->name.ptr(), group->name.size(), group->name.ptr())); + else + source->sendNotice(nick, Jupiter::StringS::Format("%.*s has been moved to group \"%.*s\"", player->name.size(), player->name.ptr(), group->name.size(), group->name.ptr())); + } + } + } + if (serverMatch == false) + source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Channel not attached to any connected Renegade X servers.")); + } + } + } +} + +const Jupiter::ReadableString &AddIRCCommand::getHelp(const Jupiter::ReadableString &) +{ + static STRING_LITERAL_AS_NAMED_REFERENCE(defaultHelp, "Adds a player to the in-game moderator list. Syntax: add "); + return defaultHelp; +} + +IRC_COMMAND_INIT(AddIRCCommand) + +// Add IRC Command + +void DelIRCCommand::create() +{ + this->addTrigger(STRING_LITERAL_AS_REFERENCE("del")); + this->addTrigger(STRING_LITERAL_AS_REFERENCE("rem")); + this->setAccessLevel(5); +} + +void DelIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &channel, const Jupiter::ReadableString &nick, const Jupiter::ReadableString ¶meters) +{ + if (parameters.isEmpty()) + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Too few parameters. Syntax: del ")); + else + { + Jupiter::IRC::Client::Channel *chan = source->getChannel(channel); + if (chan != nullptr) + { + RenX::Server *server; + RenX::PlayerInfo *player; + int type = chan->getType(); + bool serverMatch = false; + for (unsigned int i = 0; i != RenX::getCore()->getServerCount(); i++) + { + server = RenX::getCore()->getServer(i); + if (server->isLogChanType(type)) + { + serverMatch = true; + player = server->getPlayerByPartName(parameters); + if (player == nullptr) + { + if (pluginInstance.modsFile.remove(parameters)) + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Player has been removed from the moderator list.")); + else + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Player not found.")); + } + else if (player->isBot) + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: A bot can not be a moderator.")); + else + { + if (pluginInstance.modsFile.remove(player->uuid)) + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Player has been removed from the moderator list.")); + else + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Player is not in the moderator list.")); + } + } + } + if (serverMatch == false) + source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Channel not attached to any connected Renegade X servers.")); + } + } +} + +const Jupiter::ReadableString &DelIRCCommand::getHelp(const Jupiter::ReadableString &) +{ + static STRING_LITERAL_AS_NAMED_REFERENCE(defaultHelp, "Removes a player from the in-game moderator list. Syntax: del "); + return defaultHelp; +} + +IRC_COMMAND_INIT(DelIRCCommand) + // ForceAuth IRC Command void ForceAuthIRCCommand::create() @@ -605,6 +819,54 @@ const Jupiter::ReadableString &ForceAuthIRCCommand::getHelp(const Jupiter::Reada IRC_COMMAND_INIT(ForceAuthIRCCommand) +// ModList IRC Command + +void ModListIRCCommand::create() +{ + this->addTrigger(STRING_LITERAL_AS_REFERENCE("modlist")); + this->addTrigger(STRING_LITERAL_AS_REFERENCE("mlist")); +} + +void ModListIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &channel, const Jupiter::ReadableString &nick, const Jupiter::ReadableString ¶meters) +{ + RenX_ModSystemPlugin::ModGroup *group; + Jupiter::INIFile::Section *section; + size_t i; + Jupiter::String msg; + size_t msgBaseSize; + for (Jupiter::DLList::Node *n = pluginInstance.groups.getNode(0); n != nullptr; n = n->next) + { + group = n->data; + msg = group->prefix; + msg += group->name; + msg.aformat(" (Access: %d): ", group->access); + msgBaseSize = msg.size(); + i = pluginInstance.modsFile.getSections(); + while (i != 0) + { + section = pluginInstance.modsFile.getSection(--i); + if (section->get(STRING_LITERAL_AS_REFERENCE("Group")).equalsi(group->name)) + { + msg += section->getName(); + msg += STRING_LITERAL_AS_REFERENCE(", "); + } + } + if (msg.size() != msgBaseSize) + { + msg.truncate(2); + source->sendMessage(channel, msg); + } + } +} + +const Jupiter::ReadableString &ModListIRCCommand::getHelp(const Jupiter::ReadableString &) +{ + static STRING_LITERAL_AS_NAMED_REFERENCE(defaultHelp, "Displays the moderator list. Syntax: modlist"); + return defaultHelp; +} + +IRC_COMMAND_INIT(ModListIRCCommand) + /** Game Commands */ // Auth Game Command diff --git a/RenX.ModSystem/RenX_ModSystem.h b/RenX.ModSystem/RenX_ModSystem.h index 0d4093e..bd6cf8e 100644 --- a/RenX.ModSystem/RenX_ModSystem.h +++ b/RenX.ModSystem/RenX_ModSystem.h @@ -34,6 +34,7 @@ public: { bool lockSteam; bool lockIP; + bool lockName; bool kickLockMismatch; bool autoAuthSteam; bool autoAuthIP; @@ -74,6 +75,8 @@ public: void tempAuth(RenX::Server *server, const RenX::PlayerInfo *player, const ModGroup *group, bool notify = true) const; + bool set(RenX::PlayerInfo *player, ModGroup *group); + int getConfigAccess(const Jupiter::ReadableString &uuid) const; size_t getGroupCount() const; ModGroup *getGroupByName(const Jupiter::ReadableString &name, ModGroup *defaultGroup = nullptr) const; @@ -99,24 +102,29 @@ public: // Jupiter::Plugin int OnRehash(); const Jupiter::ReadableString &getName() override { return name; } + Jupiter::INIFile modsFile; private: void init(); STRING_LITERAL_AS_NAMED_REFERENCE(name, "RenX.ModSystem"); bool lockSteam; bool lockIP; + bool lockName; bool kickLockMismatch; bool autoAuthSteam; bool autoAuthIP; Jupiter::StringS atmDefault; Jupiter::StringS moderatorGroup; Jupiter::StringS administratorGroup; - Jupiter::INIFile modsFile; }; GENERIC_IRC_COMMAND(AuthIRCCommand) +GENERIC_IRC_COMMAND(DeAuthIRCCommand) GENERIC_IRC_COMMAND(ATMIRCCommand) +GENERIC_IRC_COMMAND(AddIRCCommand) +GENERIC_IRC_COMMAND(DelIRCCommand) GENERIC_IRC_COMMAND(ForceAuthIRCCommand) +GENERIC_IRC_COMMAND(ModListIRCCommand) GENERIC_GAME_COMMAND(AuthGameCommand) GENERIC_GAME_COMMAND(ATMGameCommand) GENERIC_GAME_COMMAND(ForceAuthGameCommand)