From 7137b4c65fedaf539db07a554cafcbf4480e750b Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Fri, 8 May 2015 02:54:31 -0400 Subject: [PATCH] Updated Jupiter Added PlayerTable IRC Command --- Jupiter | 2 +- Jupiter Bot.sln | 4 ++ Release/Bot.lib | Bin 19858 -> 19858 bytes Release/Plugins/RenX.Core.lib | Bin 114264 -> 114264 bytes RenX.Commands/RenX_Commands.cpp | 122 ++++++++++++++++++++++++++++++++ RenX.Commands/RenX_Commands.h | 1 + 6 files changed, 128 insertions(+), 1 deletion(-) diff --git a/Jupiter b/Jupiter index 0530dbe..884357b 160000 --- a/Jupiter +++ b/Jupiter @@ -1 +1 @@ -Subproject commit 0530dbee7b4b3e5b0b93eef57884c4af839af384 +Subproject commit 884357b443381ac8034c7ec6ce30bc46a20c08e7 diff --git a/Jupiter Bot.sln b/Jupiter Bot.sln index ba2ecdd..0eea142 100644 --- a/Jupiter Bot.sln +++ b/Jupiter Bot.sln @@ -146,6 +146,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RenX.NicknameUUID", "RenX.N EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RenX.HybridUUID", "RenX.HybridUUID\RenX.HybridUUID.vcxproj", "{FF61361F-CB09-4C72-80E2-9CA2DA63910E}" + 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 diff --git a/Release/Bot.lib b/Release/Bot.lib index 320783a2f78e7d0e21e772fb3e0e5f963df9b608..8509c81c6460f5721f74161d91eb93c9b84b5ca7 100644 GIT binary patch delta 1832 zcmZ`(Nla5w6r}>8Oc7{l8Kkt7xl(>xI+sFAfwoi}qB|lD0i%&ZcUe4)2%e=Jxaju zcKMWCzv)?Ey>eBX}V_zpx&G4=7WGO*jfTO<^8k~6v?PQwX z{sviNf~;b!B$}=w@+*OlW-Dwc&63gtH3LSfh65#{0n#oewxjd}5tp6%OZ0+LOOb{PXk~-YL@h?EGo%0 zHo<3)NEWPqGwgT`)RO}_Rm4-i*bc`&J=}E}G{xjSRpaEVdh0)VQyFgai!Z7cz*fD? z{G>mjo|3RIc?P`ohctjSz=1$OOhqkEPZ*fwQ6Q;G3J4vh4~H?}exTOg0cV3^WYY0Y zkQd$zijJ@pHN*EHFI*Fv(H33}apZ9*t|FwEKFo_*!&4eSUE}kxSR*xA9bt(((PSe@ ze4(NqLhZFM>lP1@GUeSgF{T|pM8r675aF>}1~Y1VdQq1Lx#P{jNi9+xekiNeOb@eXGJ!MN@UpBo+d%2C!?{uI#iC>Wt{OU}3}#HHklVh?}7l@@l#%jlf9GBDoOZrDzN}5-qA1U%?2XL12 zrJZ2+O0y8s*9kVTf+R1JbX7fY8OtH|?GDsv9lGl~=iGblx$phVx-PS>Tdmi-eTql% zDc($<`H7OPk^gTW)x6Xkz}p@}(bu(~liPbe`#OngfiJx$iwW`!dit86){&FYcBbj> ztCclom~ooQiKe4~{EFbc#RePB21#iKgV#jWaNvw+fRu}g?I=A##3iTx62IacD{=}c z#{`G2Mopcq0IOpo76_-T4(sS)IZ&K_)0^fqXupu<7ExZ=u$iq-vMMyDym>08!r!;`N#;0MiMryJ$!V-6&$vTqw zVp$D@TB~5rEgm9e%Dbs&Ogp@bh;iT`!eh1er`7iKqOSCF$D92VTBI_{k=E#>K$fGt z(&Olyd};yL0OuzMq*O>=Z}LcPU`DH%9%RpC9A|9C%aUzq24|Zc&JAlX79H~kC!a=g z3njNfG$v&+6XV|Q#4dYim^UdP}+*p!-iS78J7YgHqi{bFT3$eLQXC}c4o-J z(1<`Vic<1SQ&_YE7KiL$Nc^!w+zh3VSJO!;j}qb;!)}5bK29vibuF+m%sXxlOEGVa zaDHgyn&7Lad-5sy3SAv#WBaguFOD6vI^e~qG&afRaFn;wCznJ~639l9BhQnURfOE; z$Qb)TMX;`uT)1pk3+$MxVRcMe2T4wSgSj#34LVbNj*F@PCH*}mCCw|*j}&>cUYzB8 zaXZ+3(kz7Zd7KUGM3N6lx{5A1atTkwJbrj+p;qMh$z5n_gu7|M$=@}$@%^;$LDcCp XOx=cR1=TK_wKRVHhGTwdzM$+kUFtgI diff --git a/Release/Plugins/RenX.Core.lib b/Release/Plugins/RenX.Core.lib index cc305ccaf52faae88123751705b253dd4e79c0c8..04f4cb05b2f433850a7cb1d7b464f40e7b0ca98d 100644 GIT binary patch delta 7323 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"players")); this->addTrigger(STRING_LITERAL_AS_REFERENCE("pl")); + this->addTrigger(STRING_LITERAL_AS_REFERENCE("playerlist")); } const size_t STRING_LENGTH = 240; @@ -451,6 +452,127 @@ const Jupiter::ReadableString &PlayersIRCCommand::getHelp(const Jupiter::Readabl IRC_COMMAND_INIT(PlayersIRCCommand) +// PlayerTable IRC Command +#include "Jupiter/SLList.h" +void PlayerTableIRCCommand::create() +{ + this->addTrigger(STRING_LITERAL_AS_REFERENCE("pt")); + this->addTrigger(STRING_LITERAL_AS_REFERENCE("playertable")); +} + +void PlayerTableIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &channel, const Jupiter::ReadableString &nick, const Jupiter::ReadableString &) +{ + int type = source->getChannel(channel)->getType(); + + // Team colors + const Jupiter::ReadableString &gTeamColor = RenX::getTeamColor(RenX::TeamType::GDI); + const Jupiter::ReadableString &nTeamColor = RenX::getTeamColor(RenX::TeamType::Nod); + const Jupiter::ReadableString &oTeamColor = RenX::getTeamColor(RenX::TeamType::Other); + + // Team names + const Jupiter::ReadableString &gTeam = RenX::getTeamName(RenX::TeamType::GDI); + const Jupiter::ReadableString &nTeam = RenX::getTeamName(RenX::TeamType::Nod); + const Jupiter::ReadableString &oTeam = RenX::getTeamName(RenX::TeamType::Other); + + bool noServers = true; + for (unsigned int i = 0; i != RenX::getCore()->getServerCount(); i++) + { + RenX::Server *server = RenX::getCore()->getServer(i); + if (server->isLogChanType(type)) + { + noServers = false; + if (server->players.size() != 0) + { + Jupiter::SLList gPlayers; + Jupiter::SLList nPlayers; + Jupiter::SLList oPlayers; + + STRING_LITERAL_AS_NAMED_REFERENCE(NICK_COL_HEADER, "Nickname"); + size_t maxNickLen = 8; + int highID = 999; + float highScore = 99999.0; + float highCredits = 9999999.0; + + RenX::PlayerInfo *player; + for (Jupiter::DLList::Node *node = server->players.getNode(0); node != nullptr; node = node->next) + { + player = node->data; + if (player != nullptr && player->isBot == false) + { + if (player->name.size() > maxNickLen) + maxNickLen = player->name.size(); + + if (player->id > highID) + highID = player->id; + + if (player->score > highScore) + highScore = player->score; + + if (player->credits > highCredits) + highCredits = player->credits; + + switch (player->team) + { + case RenX::TeamType::GDI: + gPlayers.add(player); + break; + case RenX::TeamType::Nod: + nPlayers.add(player); + break; + default: + oPlayers.add(player); + break; + } + } + } + + size_t idColLen = 1, scoreColLen = 1, creditColLen = 1; + + while ((highID /= 10) > 0) + ++idColLen; + + while ((highScore /= 10) >= 1.0) + ++scoreColLen; + + while ((highCredits /= 10) >= 1.0) + ++creditColLen; + + source->sendMessage(channel, Jupiter::StringS::Format(IRCUNDERLINE IRCCOLOR "03%*.*s | %*s | %*s | %*s", maxNickLen, NICK_COL_HEADER.size(), NICK_COL_HEADER.ptr(), idColLen, "ID", scoreColLen, "Score", creditColLen, "Credits")); + + auto output_player = [source, &channel, maxNickLen, idColLen, scoreColLen, creditColLen](RenX::PlayerInfo *player, const Jupiter::ReadableString &color) + { + source->sendMessage(channel, Jupiter::StringS::Format(IRCCOLOR "%.*s%*.*s" IRCCOLOR " " IRCCOLOR "03|" IRCCOLOR " %*d " IRCCOLOR "03|" IRCCOLOR " %*.0f " IRCCOLOR "03|" IRCCOLOR " %*.0f", color.size(), color.ptr(), maxNickLen, player->name.size(), player->name.ptr(), idColLen, player->id, scoreColLen, player->score, creditColLen, player->credits)); + }; + + // Team colors + const Jupiter::ReadableString &gTeamColor = RenX::getTeamColor(RenX::TeamType::GDI); + const Jupiter::ReadableString &nTeamColor = RenX::getTeamColor(RenX::TeamType::Nod); + const Jupiter::ReadableString &oTeamColor = RenX::getTeamColor(RenX::TeamType::Other); + + for (Jupiter::SLList::Node *node = gPlayers.getNode(0); node != nullptr; node = node->next) + output_player(node->data, gTeamColor); + + for (Jupiter::SLList::Node *node = nPlayers.getNode(0); node != nullptr; node = node->next) + output_player(node->data, nTeamColor); + + for (Jupiter::SLList::Node *node = oPlayers.getNode(0); node != nullptr; node = node->next) + output_player(node->data, oTeamColor); + } + else source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("No players are in-game.")); + } + } + if (noServers) + source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Channel not attached to any connected Renegade X servers.")); +} + +const Jupiter::ReadableString &PlayerTableIRCCommand::getHelp(const Jupiter::ReadableString &) +{ + static STRING_LITERAL_AS_NAMED_REFERENCE(defaultHelp, "Generates a table of all the players in-game. Syntax: PT"); + return defaultHelp; +} + +IRC_COMMAND_INIT(PlayerTableIRCCommand) + // PlayerInfo IRC Command void PlayerInfoIRCCommand::create() diff --git a/RenX.Commands/RenX_Commands.h b/RenX.Commands/RenX_Commands.h index bdaa060..604a06b 100644 --- a/RenX.Commands/RenX_Commands.h +++ b/RenX.Commands/RenX_Commands.h @@ -57,6 +57,7 @@ GENERIC_IRC_COMMAND(MsgIRCCommand) GENERIC_IRC_COMMAND(PMsgIRCCommand) GENERIC_IRC_COMMAND(HostMsgIRCCommand) GENERIC_IRC_COMMAND(PlayersIRCCommand) +GENERIC_IRC_COMMAND(PlayerTableIRCCommand) GENERIC_IRC_COMMAND(PlayerInfoIRCCommand) GENERIC_IRC_COMMAND(SteamIRCCommand) GENERIC_IRC_COMMAND(KillDeathRatioIRCCommand)