From 2d53adc948d8b6584389d59c978cfd8d60a2677e Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Fri, 1 Jan 2016 19:35:13 -0500 Subject: [PATCH] RenX.Core: * Corrected ban message timestamps. * Added Server::mineBan() RenX.Commands: * Added "MineBan" IRC and Game commands. * Added IP addresses to the PlayerTable command when used from an admin channel --- Release/Plugins/RenX.Core.lib | Bin 138432 -> 139062 bytes RenX.Commands/RenX_Commands.cpp | 121 +++++++++++++++++++++++++++----- RenX.Commands/RenX_Commands.h | 2 + RenX.Core/RenX_Server.cpp | 12 +++- RenX.Core/RenX_Server.h | 16 +++++ 5 files changed, 133 insertions(+), 18 deletions(-) diff --git a/Release/Plugins/RenX.Core.lib b/Release/Plugins/RenX.Core.lib index ea2b98a58fda68277653be03cf04033e03ac1456..46f8691434f5fcb83c438fdc4a00dc767dcdd776 100644 GIT binary patch delta 13354 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 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")); + if (server->isAdminLogChanType(type)) + source->sendMessage(channel, Jupiter::StringS::Format(IRCUNDERLINE IRCCOLOR "03%*.*s | %*s | %*s | %*s | IP Address", maxNickLen, NICK_COL_HEADER.size(), NICK_COL_HEADER.ptr(), idColLen, "ID", scoreColLen, "Score", creditColLen, "Credits")); + else + 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) + auto output_player = [server, type, 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)); + if (server->isAdminLogChanType(type)) + source->sendMessage(channel, Jupiter::StringS::Format(IRCCOLOR "%.*s%*.*s" IRCCOLOR " " IRCCOLOR "03|" IRCCOLOR " %*d " IRCCOLOR "03|" IRCCOLOR " %*.0f " IRCCOLOR "03|" IRCCOLOR " %*.0f " IRCCOLOR "03|" IRCNORMAL "%.*s", color.size(), color.ptr(), maxNickLen, player->name.size(), player->name.ptr(), idColLen, player->id, scoreColLen, player->score, creditColLen, player->credits, player->ip.size(), player->ip.ptr())); + else + 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)); }; for (Jupiter::SLList::Node *node = gPlayers.getNode(0); node != nullptr; node = node->next) @@ -1472,8 +1478,8 @@ void MuteIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &cha player = server->getPlayerByPartName(parameters); if (player != nullptr) { - if (server->mute(player) == false) - source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Server does not support muting players.")); + server->mute(player); + source->sendMessage(channel, RenX::getFormattedPlayerName(player) + STRING_LITERAL_AS_REFERENCE(IRCCOLOR " has been muted.")); } else source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Player not found.")); @@ -1521,8 +1527,8 @@ void UnMuteIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &c player = server->getPlayerByPartName(parameters); if (player != nullptr) { - if (server->unmute(player) == false) - source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Server does not support muting players.")); + server->unmute(player); + source->sendMessage(channel, RenX::getFormattedPlayerName(player) + STRING_LITERAL_AS_REFERENCE(IRCCOLOR " has been unmuted.")); } else source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Player not found.")); @@ -1569,10 +1575,7 @@ void KillIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &cha match = true; player = server->getPlayerByPartName(parameters); if (player != nullptr) - { - if (server->kill(player) == false) - source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Server does not support muting players.")); - } + server->kill(player); else source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Player not found.")); } @@ -1619,8 +1622,8 @@ void DisarmIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &c player = server->getPlayerByPartName(parameters); if (player != nullptr) { - if (server->disarm(player) == false) - source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Server does not support muting players.")); + server->disarm(player); + source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("All deployables (c4, beacons, etc) belonging to ") + RenX::getFormattedPlayerName(player) + STRING_LITERAL_AS_REFERENCE(IRCCOLOR " have been disarmed.")); } else source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Player not found.")); @@ -1668,8 +1671,8 @@ void DisarmC4IRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString player = server->getPlayerByPartName(parameters); if (player != nullptr) { - if (server->disarmC4(player) == false) - source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Server does not support muting players.")); + server->disarmC4(player); + source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("All C4 belonging to ") + RenX::getFormattedPlayerName(player) + STRING_LITERAL_AS_REFERENCE(IRCCOLOR " have been disarmed.")); } else source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Player not found.")); @@ -1719,8 +1722,8 @@ void DisarmBeaconIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableStr player = server->getPlayerByPartName(parameters); if (player != nullptr) { - if (server->disarmBeacon(player) == false) - source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Error: Server does not support muting players.")); + server->disarmBeacon(player); + source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("All beacons belonging to ") + RenX::getFormattedPlayerName(player) + STRING_LITERAL_AS_REFERENCE(IRCCOLOR " have been disarmed.")); } else source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Player not found.")); @@ -1741,6 +1744,55 @@ const Jupiter::ReadableString &DisarmBeaconIRCCommand::getHelp(const Jupiter::Re IRC_COMMAND_INIT(DisarmBeaconIRCCommand) +// MineBan IRC Command + +void MineBanIRCCommand::create() +{ + this->addTrigger(STRING_LITERAL_AS_REFERENCE("mineban")); + this->setAccessLevel(2); +} + +void MineBanIRCCommand::trigger(IRC_Bot *source, const Jupiter::ReadableString &channel, const Jupiter::ReadableString &nick, const Jupiter::ReadableString ¶meters) +{ + if (parameters.isNotEmpty()) + { + Jupiter::IRC::Client::Channel *chan = source->getChannel(channel); + if (chan != nullptr) + { + int type = chan->getType(); + RenX::PlayerInfo *player; + bool match = false; + for (unsigned int i = 0; i != RenX::getCore()->getServerCount(); i++) + { + RenX::Server *server = RenX::getCore()->getServer(i); + if (server->isLogChanType(type)) + { + match = true; + player = server->getPlayerByPartName(parameters); + if (player != nullptr) + { + server->mineBan(player); + source->sendMessage(channel, STRING_LITERAL_AS_REFERENCE("Player can no longer place mines.")); + } + else + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Player not found.")); + } + } + if (match == false) + source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Channel not attached to any connected Renegade X servers.")); + } + } + else source->sendNotice(nick, STRING_LITERAL_AS_REFERENCE("Error: Too Few Parameters. Syntax: disarmb ")); +} + +const Jupiter::ReadableString &MineBanIRCCommand::getHelp(const Jupiter::ReadableString &) +{ + static STRING_LITERAL_AS_NAMED_REFERENCE(defaultHelp, "Bans a player from mining for 1 game (or until they leave). Syntax: mineban "); + return defaultHelp; +} + +IRC_COMMAND_INIT(MineBanIRCCommand) + // Kick IRC Command void KickIRCCommand::create() @@ -2654,6 +2706,41 @@ const Jupiter::ReadableString &DisarmBeaconGameCommand::getHelp(const Jupiter::R GAME_COMMAND_INIT(DisarmBeaconGameCommand) +// MineBan Game Command + +void MineBanGameCommand::create() +{ + this->addTrigger(STRING_LITERAL_AS_REFERENCE("mineban")); + this->setAccessLevel(1); +} + +void MineBanGameCommand::trigger(RenX::Server *source, RenX::PlayerInfo *player, const Jupiter::ReadableString ¶meters) +{ + if (parameters.isNotEmpty()) + { + RenX::PlayerInfo *target = source->getPlayerByPartName(parameters); + if (target == nullptr) + source->sendMessage(player, STRING_LITERAL_AS_REFERENCE("Error: Player not found.")); + else if (target->access >= player->access) + source->sendMessage(player, STRING_LITERAL_AS_REFERENCE("Error: You can not mine-ban higher level moderators.")); + else + { + source->mineBan(target); + source->sendMessage(player, STRING_LITERAL_AS_REFERENCE("Player can no longer place mines.")); + } + } + else + source->sendMessage(player, STRING_LITERAL_AS_REFERENCE("Error: Too few parameters. Syntax: mineban ")); +} + +const Jupiter::ReadableString &MineBanGameCommand::getHelp(const Jupiter::ReadableString &) +{ + static STRING_LITERAL_AS_NAMED_REFERENCE(defaultHelp, "Bans a player from mining for 1 game (or until they leave). Syntax: mineban "); + return defaultHelp; +} + +GAME_COMMAND_INIT(MineBanGameCommand) + // Kick Game Command void KickGameCommand::create() diff --git a/RenX.Commands/RenX_Commands.h b/RenX.Commands/RenX_Commands.h index f256708..fed419a 100644 --- a/RenX.Commands/RenX_Commands.h +++ b/RenX.Commands/RenX_Commands.h @@ -83,6 +83,7 @@ GENERIC_IRC_COMMAND(KillIRCCommand) GENERIC_IRC_COMMAND(DisarmIRCCommand) GENERIC_IRC_COMMAND(DisarmC4IRCCommand) GENERIC_IRC_COMMAND(DisarmBeaconIRCCommand) +GENERIC_IRC_COMMAND(MineBanIRCCommand) GENERIC_IRC_COMMAND(KickIRCCommand) GENERIC_IRC_COMMAND(TempBanIRCCommand) GENERIC_IRC_COMMAND(KickBanIRCCommand) @@ -103,6 +104,7 @@ GENERIC_GAME_COMMAND(KillGameCommand) GENERIC_GAME_COMMAND(DisarmGameCommand) GENERIC_GAME_COMMAND(DisarmC4GameCommand) GENERIC_GAME_COMMAND(DisarmBeaconGameCommand) +GENERIC_GAME_COMMAND(MineBanGameCommand) GENERIC_GAME_COMMAND(KickGameCommand) GENERIC_GAME_COMMAND(TempBanGameCommand) GENERIC_GAME_COMMAND(KickBanGameCommand) diff --git a/RenX.Core/RenX_Server.cpp b/RenX.Core/RenX_Server.cpp index 3dbf77b..50bbede 100644 --- a/RenX.Core/RenX_Server.cpp +++ b/RenX.Core/RenX_Server.cpp @@ -403,7 +403,7 @@ void RenX::Server::banPlayer(const RenX::PlayerInfo *player, const Jupiter::Read RenX::Server::forceKickPlayer(player, Jupiter::StringS::Format("You are permanently banned from the server for: %.*s", reason.size(), reason.ptr())); } else - RenX::Server::forceKickPlayer(player, Jupiter::StringS::Format("You are banned from the server for the next %d days, %d:%d:%d for: %.*s", length/3600, length%3600, length/60, length%60, reason.size(), reason.ptr())); + RenX::Server::forceKickPlayer(player, Jupiter::StringS::Format("You are banned from the server for the next %d days, %d:%d:%d for: %.*s", length/86400, length%3600, (length%3600)/60, length%60, reason.size(), reason.ptr())); } bool RenX::Server::removePlayer(int id) @@ -564,6 +564,16 @@ bool RenX::Server::disarmBeacon(RenX::PlayerInfo *player) return RenX::Server::disarmBeacon(player->id); } +bool RenX::Server::mineBan(int id) +{ + return RenX::Server::send(Jupiter::StringS::Format("mineban pid%d", id)) > 0; +} + +bool RenX::Server::mineBan(RenX::PlayerInfo *player) +{ + return RenX::Server::mineBan(player->id); +} + bool RenX::Server::changeTeam(int id, bool resetCredits) { return RenX::Server::send(Jupiter::StringS::Format(resetCredits ? "team pid%d" : "team2 pid%d", id)) > 0; diff --git a/RenX.Core/RenX_Server.h b/RenX.Core/RenX_Server.h index 0991e5d..8a842c7 100644 --- a/RenX.Core/RenX_Server.h +++ b/RenX.Core/RenX_Server.h @@ -533,6 +533,22 @@ namespace RenX */ bool disarmBeacon(RenX::PlayerInfo *player); + /** + * @brief Bans a player from mining in-game for 1 game (or until they disconnect). + * + * @param player Id of the player to mine-ban + * @return True on success, false otherwise. + */ + bool mineBan(int id); + + /** + * @brief Bans a player from mining in-game for 1 game (or until they disconnect). + * + * @param player Player to mine-ban + * @return True on success, false otherwise. + */ + bool mineBan(RenX::PlayerInfo *player); + /** * @brief Forces a player to change teams. *