From 54e8061cdebfff2d49bab0a30974c94a4c155c0a Mon Sep 17 00:00:00 2001 From: JAJames Date: Sun, 21 Feb 2016 19:15:04 -0500 Subject: [PATCH] Replaced RenX_OnVoteCall event with multiple vote-specific events. --- Jupiter | 2 +- Release/Plugins/RenX.Core.lib | Bin 192518 -> 197042 bytes RenX.Commands/RenX_Commands.cpp | 2 +- RenX.Core/RenX_Plugin.cpp | 44 +++++++- RenX.Core/RenX_Plugin.h | 12 +- RenX.Core/RenX_Server.cpp | 125 ++++++++++++++++++--- RenX.Logging/RenX_Logging.cpp | 192 +++++++++++++++++++++++++++++++- RenX.Logging/RenX_Logging.h | 20 +++- 8 files changed, 371 insertions(+), 26 deletions(-) diff --git a/Jupiter b/Jupiter index 6b88571..5620679 160000 --- a/Jupiter +++ b/Jupiter @@ -1 +1 @@ -Subproject commit 6b8857178ab821141510bd1cf942182840127ac5 +Subproject commit 5620679e80b2489358d0bdcb90e03ca5f530dbde diff --git a/Release/Plugins/RenX.Core.lib b/Release/Plugins/RenX.Core.lib index 02676ea0ee5f9970462fe890295663fe7770ad52..97d5f45c14bbd482e78516efe522284ae10bfcc4 100644 GIT binary patch delta 24271 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 - if (parameters.equalsi("if empty"_jrs)) + else if (parameters.equalsi("if empty"_jrs)) { if (server->players.size() == server->getBotCount()) server->gameover(); diff --git a/RenX.Core/RenX_Plugin.cpp b/RenX.Core/RenX_Plugin.cpp index 70931ec..c8be75e 100644 --- a/RenX.Core/RenX_Plugin.cpp +++ b/RenX.Core/RenX_Plugin.cpp @@ -1,5 +1,5 @@ /** - * Copyright (C) 2014-2015 Jessica James. + * Copyright (C) 2014-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -451,7 +451,47 @@ void RenX::Plugin::RenX_OnAdmin(Server *, const Jupiter::ReadableString &) return; } -void RenX::Plugin::RenX_OnVoteCall(Server *, const TeamType &, const Jupiter::ReadableString &, const PlayerInfo *, const Jupiter::ReadableString &) +void RenX::Plugin::RenX_OnVoteAddBots(Server *, const TeamType &, const PlayerInfo *, const TeamType &, int, int) +{ + return; +} + +void RenX::Plugin::RenX_OnVoteChangeMap(Server *, const TeamType &, const PlayerInfo *) +{ + return; +} + +void RenX::Plugin::RenX_OnVoteKick(Server *, const TeamType &, const PlayerInfo *, const PlayerInfo *) +{ + return; +} + +void RenX::Plugin::RenX_OnVoteMineBan(Server *, const TeamType &, const PlayerInfo *, const PlayerInfo *) +{ + return; +} + +void RenX::Plugin::RenX_OnVoteRemoveBots(Server *, const TeamType &, const PlayerInfo *, const TeamType &, int) +{ + return; +} + +void RenX::Plugin::RenX_OnVoteRestartMap(Server *, const TeamType &, const PlayerInfo *) +{ + return; +} + +void RenX::Plugin::RenX_OnVoteSurrender(Server *, const TeamType &, const PlayerInfo *) +{ + return; +} + +void RenX::Plugin::RenX_OnVoteSurvey(Server *, const TeamType &, const PlayerInfo *, const Jupiter::ReadableString &text) +{ + return; +} + +void RenX::Plugin::RenX_OnVoteOther(Server *, const TeamType &, const Jupiter::ReadableString &, const PlayerInfo *) { return; } diff --git a/RenX.Core/RenX_Plugin.h b/RenX.Core/RenX_Plugin.h index 18d96c1..c4276d8 100644 --- a/RenX.Core/RenX_Plugin.h +++ b/RenX.Core/RenX_Plugin.h @@ -1,5 +1,5 @@ /** - * Copyright (C) 2014-2015 Jessica James. + * Copyright (C) 2014-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -138,7 +138,15 @@ namespace RenX virtual void RenX_OnAdmin(Server *server, const Jupiter::ReadableString &raw); /** Vote Type Logs */ - virtual void RenX_OnVoteCall(Server *server, const TeamType &team, const Jupiter::ReadableString &type, const PlayerInfo *player, const Jupiter::ReadableString ¶meters); + virtual void RenX_OnVoteAddBots(Server *server, const TeamType &team, const PlayerInfo *player, const TeamType &victim, int amount, int skill); + virtual void RenX_OnVoteChangeMap(Server *server, const TeamType &team, const PlayerInfo *player); + virtual void RenX_OnVoteKick(Server *server, const TeamType &team, const PlayerInfo *player, const PlayerInfo *victim); + virtual void RenX_OnVoteMineBan(Server *server, const TeamType &team, const PlayerInfo *player, const PlayerInfo *victim); + virtual void RenX_OnVoteRemoveBots(Server *server, const TeamType &team, const PlayerInfo *player, const TeamType &victim, int amount); + virtual void RenX_OnVoteRestartMap(Server *server, const TeamType &team, const PlayerInfo *player); + virtual void RenX_OnVoteSurrender(Server *server, const TeamType &team, const PlayerInfo *player); + virtual void RenX_OnVoteSurvey(Server *server, const TeamType &team, const PlayerInfo *player, const Jupiter::ReadableString &text); + virtual void RenX_OnVoteOther(Server *server, const TeamType &team, const Jupiter::ReadableString &type, const PlayerInfo *player); virtual void RenX_OnVoteOver(Server *server, const TeamType &team, const Jupiter::ReadableString &type, bool success, int yesVotes, int noVotes); virtual void RenX_OnVoteCancel(Server *server, const TeamType &team, const Jupiter::ReadableString &type); virtual void RenX_OnVote(Server *server, const Jupiter::ReadableString &raw); diff --git a/RenX.Core/RenX_Server.cpp b/RenX.Core/RenX_Server.cpp index 95b3f2b..bb8b199 100644 --- a/RenX.Core/RenX_Server.cpp +++ b/RenX.Core/RenX_Server.cpp @@ -2624,8 +2624,20 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) { if (subHeader.equals("Called;")) { - // TeamType="Global" / "GDI" / "Nod" / "" | VoteType="Rx_VoteMenuChoice_"... | "parameters" | Parameters(Empty) | "by" | Player // TeamType="Global" / "GDI" / "Nod" / "" | VoteType="Rx_VoteMenuChoice_"... | "by" | Player + // Pre-5.15: + // TeamType="Global" / "GDI" / "Nod" / "" | VoteType="Rx_VoteMenuChoice_"... | "parameters" | Parameters(Empty) | "by" | Player + // 5.15+: + // TeamType="Global" / "GDI" / "Nod" / "" | VoteType="Rx_VoteMenuChoice_"... | "by" | Player | Parameters (Key | Value [ ... | Key | Value ] ) + // TeamType="Global" / "GDI" / "Nod" / "" | "Rx_VoteMenuChoice_AddBots" | "by" | Player | "team" | TargetTeam="GDI" / "Nod" / "Both" | "amount" | amount | "skill" | skill + // TeamType="Global" / "GDI" / "Nod" / "" | "Rx_VoteMenuChoice_ChangeMap" | "by" | Player + // TeamType="Global" / "GDI" / "Nod" / "" | "Rx_VoteMenuChoice_Kick" | "by" | Player | "player" | Target Player + // TeamType="Global" / "GDI" / "Nod" / "" | "Rx_VoteMenuChoice_MineBan" | "by" | Player | "player" | Target Player + // TeamType="Global" / "GDI" / "Nod" / "" | "Rx_VoteMenuChoice_RemoveBots" | "by" | Player | "team" | TargetTeam="GDI" / "Nod" / "Both" | "amount" | amount + // TeamType="Global" / "GDI" / "Nod" / "" | "Rx_VoteMenuChoice_RestartMap" | "by" | Player + // 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); RenX::TeamType team; @@ -2638,23 +2650,110 @@ void RenX::Server::processLine(const Jupiter::ReadableString &line) else team = TeamType::Other; - Jupiter::ReferenceString playerToken; - Jupiter::ReferenceString parameters; - if (tokens.getToken(4).equals("parameters")) + if (tokens.getToken(4).equals("parameters")) // Pre-5.15 style parameters; throw away parameters { - playerToken = tokens.getToken(tokens.token_count - 1); - parameters = tokens.getToken(5); + RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(tokens.token_count - 1)); + + if ((player->ban_flags & RenX::BanDatabase::Entry::FLAG_TYPE_VOTE) != 0) + RenX::Server::sendData(Jupiter::StringS::Format("ccancelvote %.*s\n", teamToken.size(), teamToken.ptr())); + + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnVoteOther(this, team, voteType, player); } - else - playerToken = tokens.getToken(5); + else // 5.15+ (or empty) + { + RenX::PlayerInfo *player = parseGetPlayerOrAdd(tokens.getToken(5)); - RenX::PlayerInfo *player = parseGetPlayerOrAdd(playerToken); + if ((player->ban_flags & RenX::BanDatabase::Entry::FLAG_TYPE_VOTE) != 0) + RenX::Server::sendData(Jupiter::StringS::Format("ccancelvote %.*s\n", teamToken.size(), teamToken.ptr())); - if ((player->ban_flags & RenX::BanDatabase::Entry::FLAG_TYPE_VOTE) != 0) - RenX::Server::sendData(Jupiter::StringS::Format("ccancelvote %.*s\n", teamToken.size(), teamToken.ptr())); + // PARSE PARAMETERS HERE - for (size_t i = 0; i < xPlugins.size(); i++) - xPlugins.get(i)->RenX_OnVoteCall(this, team, voteType, player, parameters); + if (voteType.find("Rx_VoteMenuChoice_"_jrs) == 0) + { + voteType.shiftRight(18); + + if (voteType.equals("AddBots"_jrs)) + { + Jupiter::ReferenceString victimToken = tokens.getToken(7); + RenX::TeamType victim; + if (teamToken.equals("Global")) + victim = TeamType::None; + else if (teamToken.equals("GDI")) + victim = TeamType::GDI; + else if (teamToken.equals("Nod")) + victim = TeamType::Nod; + else + victim = TeamType::Other; + + int amount = tokens.getToken(9).asInt(10); + int skill = tokens.getToken(11).asInt(10); + + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnVoteAddBots(this, team, player, victim, amount, skill); + } + else if (voteType.equals("ChangeMap"_jrs)) + { + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnVoteChangeMap(this, team, player); + } + else if (voteType.equals("Kick"_jrs)) + { + RenX::PlayerInfo *victim = parseGetPlayerOrAdd(tokens.getToken(7)); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnVoteKick(this, team, player, victim); + } + else if (voteType.equals("MineBan"_jrs)) + { + RenX::PlayerInfo *victim = parseGetPlayerOrAdd(tokens.getToken(7)); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnVoteMineBan(this, team, player, victim); + } + else if (voteType.equals("RemoveBots"_jrs)) + { + Jupiter::ReferenceString victimToken = tokens.getToken(7); + RenX::TeamType victim; + if (teamToken.equals("Global")) + victim = TeamType::None; + else if (teamToken.equals("GDI")) + victim = TeamType::GDI; + else if (teamToken.equals("Nod")) + victim = TeamType::Nod; + else + victim = TeamType::Other; + + int amount = tokens.getToken(9).asInt(10); + + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnVoteRemoveBots(this, team, player, victim, amount); + } + else if (voteType.equals("RestartMap"_jrs)) + { + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnVoteRestartMap(this, team, player); + } + else if (voteType.equals("Surrender"_jrs)) + { + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnVoteSurrender(this, team, player); + } + else if (voteType.equals("Survey"_jrs)) + { + const Jupiter::ReadableString &text = tokens.getToken(7); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnVoteSurvey(this, team, player, text); + } + else + { + voteType.shiftLeft(18); + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnVoteOther(this, team, voteType, player); + } + } + else + for (size_t i = 0; i < xPlugins.size(); i++) + xPlugins.get(i)->RenX_OnVoteOther(this, team, voteType, player); + } onAction(); } else if (subHeader.equals("Results;")) diff --git a/RenX.Logging/RenX_Logging.cpp b/RenX.Logging/RenX_Logging.cpp index 6a63cdd..c9b972d 100644 --- a/RenX.Logging/RenX_Logging.cpp +++ b/RenX.Logging/RenX_Logging.cpp @@ -326,8 +326,32 @@ void RenX_LoggingPlugin::init() RenX_LoggingPlugin::adminFmt = Jupiter::IRC::Client::Config->get(this->getName(), "AdminFormat"_jrs, Jupiter::StringS::Format(IRCCOLOR "07[Admin]" IRCCOLOR " %.*s", RenX::tags->messageTag.size(), RenX::tags->messageTag.ptr())); - RenX_LoggingPlugin::voteCallFmt = Jupiter::IRC::Client::Config->get(this->getName(), "VoteCallFormat"_jrs, - Jupiter::StringS::Format(IRCCOLOR "%.*s[Vote] " IRCBOLD "%.*s" IRCBOLD " has called a \"%.*s\" vote.", RenX::tags->victimTeamColorTag.size(), RenX::tags->victimTeamColorTag.ptr(), RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr(), RenX::tags->victimTeamColorTag.size(), RenX::tags->victimTeamColorTag.ptr())); + RenX_LoggingPlugin::voteAddBotsFmt = Jupiter::IRC::Client::Config->get(this->getName(), "VoteAddBotsFormat"_jrs, + Jupiter::StringS::Format(IRCCOLOR "[Vote] " IRCBOLD "%.*s" IRCNORMAL " has called for adding " IRCCOLOR "12%.*s" IRCCOLOR " bots to %.*s, with skill level " IRCCOLOR "07%.*s" IRCCOLOR ".", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr(), RenX::tags->victimTeamShortTag.size(), RenX::tags->victimTeamShortTag.ptr(), RenX::tags->weaponTag.size(), RenX::tags->weaponTag.ptr())); + + RenX_LoggingPlugin::voteChangeMapFmt = Jupiter::IRC::Client::Config->get(this->getName(), "VoteChangeMapFormat"_jrs, + Jupiter::StringS::Format(IRCCOLOR "[Vote] " IRCBOLD "%.*s" IRCNORMAL " has called for a Map Change.", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr())); + + RenX_LoggingPlugin::voteKickFmt = Jupiter::IRC::Client::Config->get(this->getName(), "VoteKickFormat"_jrs, + Jupiter::StringS::Format(IRCCOLOR "[Vote] " IRCBOLD "%.*s" IRCNORMAL " has called for a kick against %.*s" IRCNORMAL ".", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr())); + + RenX_LoggingPlugin::voteMineBanFmt = Jupiter::IRC::Client::Config->get(this->getName(), "VoteMineBanFormat"_jrs, + Jupiter::StringS::Format(IRCCOLOR "%.*s[Vote] " IRCBOLD "%.*s" IRCBOLD " has called for a Mine Ban against %.*s" IRCNORMAL ".", RenX::tags->victimTeamColorTag.size(), RenX::tags->victimTeamColorTag.ptr(), RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr())); + + RenX_LoggingPlugin::voteRemoveBotsFmt = Jupiter::IRC::Client::Config->get(this->getName(), "VoteRemoveBotsFormat"_jrs, + Jupiter::StringS::Format(IRCCOLOR "[Vote] " IRCBOLD "%.*s" IRCNORMAL " has called a vote to remove " IRCCOLOR "12%.*s" IRCCOLOR " bots from " IRCCOLOR "%.*s%.*s" IRCNORMAL ".", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr(), RenX::tags->victimTeamColorTag.size(), RenX::tags->victimTeamColorTag.ptr(), RenX::tags->victimTeamShortTag.size(), RenX::tags->victimTeamShortTag.ptr())); + + RenX_LoggingPlugin::voteRestartMapFmt = Jupiter::IRC::Client::Config->get(this->getName(), "VoteRestartMapFormat"_jrs, + Jupiter::StringS::Format(IRCCOLOR "[Vote] " IRCBOLD "%.*s" IRCNORMAL " has called for a Map Restart.", RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr())); + + RenX_LoggingPlugin::voteSurrenderFmt = Jupiter::IRC::Client::Config->get(this->getName(), "VoteSurrenderFormat"_jrs, + Jupiter::StringS::Format(IRCCOLOR "%.*s[Vote] " IRCBOLD "%.*s" IRCBOLD " has called for a Surrender.", RenX::tags->victimTeamColorTag.size(), RenX::tags->victimTeamColorTag.ptr(), RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr())); + + RenX_LoggingPlugin::voteSurveyFmt = Jupiter::IRC::Client::Config->get(this->getName(), "VoteSurveyFormat"_jrs, + Jupiter::StringS::Format(IRCCOLOR "%.*s[Vote] " IRCBOLD "%.*s" IRCBOLD IRCCOLOR "%.*s has started a Survey: " IRCCOLOR "12%.*s", RenX::tags->victimTeamColorTag.size(), RenX::tags->victimTeamColorTag.ptr(), RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->victimTeamColorTag.size(), RenX::tags->victimTeamColorTag.ptr(), RenX::tags->messageTag.size(), RenX::tags->messageTag.ptr())); + + RenX_LoggingPlugin::voteOtherFmt = Jupiter::IRC::Client::Config->get(this->getName(), "VoteOtherFormat"_jrs, + Jupiter::StringS::Format(IRCCOLOR "%.*s[Vote] " IRCBOLD "%.*s" IRCBOLD IRCCOLOR "%.*s has called a \"%.*s\" vote.", RenX::tags->victimTeamColorTag.size(), RenX::tags->victimTeamColorTag.ptr(), RenX::tags->nameTag.size(), RenX::tags->nameTag.ptr(), RenX::tags->victimTeamColorTag.size(), RenX::tags->victimTeamColorTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr())); RenX_LoggingPlugin::voteOverSuccessFmt = Jupiter::IRC::Client::Config->get(this->getName(), "VoteOverSuccessFormat"_jrs, Jupiter::StringS::Format(IRCCOLOR "%.*s[Vote] A vote for \"%.*s\" " IRCBOLD IRCCOLOR "09passed" IRCBOLD IRCCOLOR "%.*s (Votes Yes: %.*s | Votes No: %.*s).", RenX::tags->victimTeamColorTag.size(), RenX::tags->victimTeamColorTag.ptr(), RenX::tags->objectTag.size(), RenX::tags->objectTag.ptr(), RenX::tags->victimTeamColorTag.size(), RenX::tags->victimTeamColorTag.ptr(), RenX::tags->winScoreTag.size(), RenX::tags->winScoreTag.ptr(), RenX::tags->loseScoreTag.size(), RenX::tags->loseScoreTag.ptr())); @@ -458,7 +482,15 @@ void RenX_LoggingPlugin::init() RenX::sanitizeTags(adminGrantFmt); RenX::sanitizeTags(adminLogoutFmt); RenX::sanitizeTags(adminFmt); - RenX::sanitizeTags(voteCallFmt); + RenX::sanitizeTags(voteAddBotsFmt); + RenX::sanitizeTags(voteChangeMapFmt); + RenX::sanitizeTags(voteKickFmt); + RenX::sanitizeTags(voteMineBanFmt); + RenX::sanitizeTags(voteRemoveBotsFmt); + RenX::sanitizeTags(voteRestartMapFmt); + RenX::sanitizeTags(voteSurrenderFmt); + RenX::sanitizeTags(voteSurveyFmt); + RenX::sanitizeTags(voteOtherFmt); RenX::sanitizeTags(voteOverSuccessFmt); RenX::sanitizeTags(voteOverFailFmt); RenX::sanitizeTags(voteCancelFmt); @@ -1684,7 +1716,157 @@ void RenX_LoggingPlugin::RenX_OnAdmin(RenX::Server *server, const Jupiter::Reada } } -void RenX_LoggingPlugin::RenX_OnVoteCall(RenX::Server *server, const RenX::TeamType &team, const Jupiter::ReadableString &type, const RenX::PlayerInfo *player, const Jupiter::ReadableString ¶meters) +void RenX_LoggingPlugin::RenX_OnVoteAddBots(RenX::Server *server, const RenX::TeamType &, const RenX::PlayerInfo *player, const RenX::TeamType &victim, int amount, int skill) +{ + logFuncType func; + if (RenX_LoggingPlugin::voteCallPublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->voteAddBotsFmt; + if (msg.isNotEmpty()) + { + RenX::processTags(msg, server, player); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_COLOR_TAG, RenX::getTeamColor(victim)); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_SHORT_TAG, RenX::getTeamName(victim)); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_LONG_TAG, RenX::getFullTeamName(victim)); + msg.replace(RenX::tags->INTERNAL_OBJECT_TAG, Jupiter::StringS::Format("%d", amount)); + msg.replace(RenX::tags->INTERNAL_WEAPON_TAG, Jupiter::StringS::Format("%d", skill)); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnVoteChangeMap(RenX::Server *server, const RenX::TeamType &team, const RenX::PlayerInfo *player) +{ + logFuncType func; + if (RenX_LoggingPlugin::voteCallPublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->voteChangeMapFmt; + if (msg.isNotEmpty()) + { + RenX::processTags(msg, server, player); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_COLOR_TAG, RenX::getTeamColor(team)); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_SHORT_TAG, RenX::getTeamName(team)); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_LONG_TAG, RenX::getFullTeamName(team)); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnVoteKick(RenX::Server *server, const RenX::TeamType &, const RenX::PlayerInfo *player, const RenX::PlayerInfo *victim) +{ + logFuncType func; + if (RenX_LoggingPlugin::voteCallPublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->voteKickFmt; + if (msg.isNotEmpty()) + { + RenX::processTags(msg, server, player, victim); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnVoteMineBan(RenX::Server *server, const RenX::TeamType &, const RenX::PlayerInfo *player, const RenX::PlayerInfo *victim) +{ + logFuncType func; + if (RenX_LoggingPlugin::voteCallPublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->voteMineBanFmt; + if (msg.isNotEmpty()) + { + RenX::processTags(msg, server, player, victim); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnVoteRemoveBots(RenX::Server *server, const RenX::TeamType &, const RenX::PlayerInfo *player, const RenX::TeamType &victim, int amount) +{ + logFuncType func; + if (RenX_LoggingPlugin::voteCallPublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->voteRemoveBotsFmt; + if (msg.isNotEmpty()) + { + RenX::processTags(msg, server, player); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_COLOR_TAG, RenX::getTeamColor(victim)); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_SHORT_TAG, RenX::getTeamName(victim)); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_LONG_TAG, RenX::getFullTeamName(victim)); + msg.replace(RenX::tags->INTERNAL_OBJECT_TAG, Jupiter::StringS::Format("%d", amount)); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnVoteRestartMap(RenX::Server *server, const RenX::TeamType &team, const RenX::PlayerInfo *player) +{ + logFuncType func; + if (RenX_LoggingPlugin::voteCallPublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->voteRestartMapFmt; + if (msg.isNotEmpty()) + { + RenX::processTags(msg, server, player); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_COLOR_TAG, RenX::getTeamColor(team)); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_SHORT_TAG, RenX::getTeamName(team)); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_LONG_TAG, RenX::getFullTeamName(team)); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnVoteSurrender(RenX::Server *server, const RenX::TeamType &team, const RenX::PlayerInfo *player) +{ + logFuncType func; + if (RenX_LoggingPlugin::voteCallPublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->voteSurrenderFmt; + if (msg.isNotEmpty()) + { + RenX::processTags(msg, server, player); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_COLOR_TAG, RenX::getTeamColor(team)); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_SHORT_TAG, RenX::getTeamName(team)); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_LONG_TAG, RenX::getFullTeamName(team)); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnVoteSurvey(RenX::Server *server, const RenX::TeamType &team, const RenX::PlayerInfo *player, const Jupiter::ReadableString &text) +{ + logFuncType func; + if (RenX_LoggingPlugin::voteCallPublic) + func = &RenX::Server::sendLogChan; + else + func = &RenX::Server::sendAdmChan; + + Jupiter::String msg = this->voteSurveyFmt; + if (msg.isNotEmpty()) + { + RenX::processTags(msg, server, player); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_COLOR_TAG, RenX::getTeamColor(team)); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_SHORT_TAG, RenX::getTeamName(team)); + msg.replace(RenX::tags->INTERNAL_VICTIM_TEAM_LONG_TAG, RenX::getFullTeamName(team)); + msg.replace(RenX::tags->INTERNAL_MESSAGE_TAG, text); + (server->*func)(msg); + } +} + +void RenX_LoggingPlugin::RenX_OnVoteOther(RenX::Server *server, const RenX::TeamType &team, const Jupiter::ReadableString &type, const RenX::PlayerInfo *player) { logFuncType func; if (RenX_LoggingPlugin::voteCallPublic) @@ -1692,7 +1874,7 @@ void RenX_LoggingPlugin::RenX_OnVoteCall(RenX::Server *server, const RenX::TeamT else func = &RenX::Server::sendAdmChan; - Jupiter::String msg = this->voteCallFmt; + Jupiter::String msg = this->voteOtherFmt; if (msg.isNotEmpty()) { RenX::processTags(msg, server, player); diff --git a/RenX.Logging/RenX_Logging.h b/RenX.Logging/RenX_Logging.h index 4788290..a90c49f 100644 --- a/RenX.Logging/RenX_Logging.h +++ b/RenX.Logging/RenX_Logging.h @@ -91,7 +91,15 @@ public: // RenX::Plugin void RenX_OnAdminLogout(RenX::Server *server, const RenX::PlayerInfo *player) override; void RenX_OnAdmin(RenX::Server *server, const Jupiter::ReadableString &raw) override; - void RenX_OnVoteCall(RenX::Server *server, const RenX::TeamType &team, const Jupiter::ReadableString &type, const RenX::PlayerInfo *player, const Jupiter::ReadableString ¶meters) override; + void RenX_OnVoteAddBots(RenX::Server *server, const RenX::TeamType &team, const RenX::PlayerInfo *player, const RenX::TeamType &victim, int amount, int skill) override; + void RenX_OnVoteChangeMap(RenX::Server *server, const RenX::TeamType &team, const RenX::PlayerInfo *player) override; + void RenX_OnVoteKick(RenX::Server *server, const RenX::TeamType &team, const RenX::PlayerInfo *player, const RenX::PlayerInfo *victim) override; + void RenX_OnVoteMineBan(RenX::Server *server, const RenX::TeamType &team, const RenX::PlayerInfo *player, const RenX::PlayerInfo *victim) override; + void RenX_OnVoteRemoveBots(RenX::Server *server, const RenX::TeamType &team, const RenX::PlayerInfo *player, const RenX::TeamType &victim, int amount) override; + void RenX_OnVoteRestartMap(RenX::Server *server, const RenX::TeamType &team, const RenX::PlayerInfo *player) override; + void RenX_OnVoteSurrender(RenX::Server *server, const RenX::TeamType &team, const RenX::PlayerInfo *player) override; + void RenX_OnVoteSurvey(RenX::Server *server, const RenX::TeamType &team, const RenX::PlayerInfo *player, const Jupiter::ReadableString &text) override; + void RenX_OnVoteOther(RenX::Server *server, const RenX::TeamType &team, const Jupiter::ReadableString &type, const RenX::PlayerInfo *player) override; void RenX_OnVoteOver(RenX::Server *server, const RenX::TeamType &team, const Jupiter::ReadableString &type, bool success, int yesVotes, int noVotes) override; void RenX_OnVoteCancel(RenX::Server *server, const RenX::TeamType &team, const Jupiter::ReadableString &type) override; void RenX_OnVote(RenX::Server *server, const Jupiter::ReadableString &raw) override; @@ -270,7 +278,15 @@ private: Jupiter::StringS adminGrantFmt; Jupiter::StringS adminLogoutFmt; Jupiter::StringS adminFmt; - Jupiter::StringS voteCallFmt; + Jupiter::StringS voteAddBotsFmt; + Jupiter::StringS voteChangeMapFmt; + Jupiter::StringS voteKickFmt; + Jupiter::StringS voteMineBanFmt; + Jupiter::StringS voteRemoveBotsFmt; + Jupiter::StringS voteRestartMapFmt; + Jupiter::StringS voteSurrenderFmt; + Jupiter::StringS voteSurveyFmt; + Jupiter::StringS voteOtherFmt; Jupiter::StringS voteOverSuccessFmt; Jupiter::StringS voteOverFailFmt; Jupiter::StringS voteCancelFmt;