From c3ebfb46a8c3cb1816b24b29111f332a13dbf8a4 Mon Sep 17 00:00:00 2001 From: lare96 Date: Wed, 2 Sep 2015 09:22:33 -0400 Subject: [PATCH] Ban and mute support, commands included. --- data/plugins/cmd/punishment/plugin.xml | 14 +++++ data/plugins/cmd/punishment/punish.rb | 53 +++++++++++++++++++ .../io/player/BinaryPlayerSerializer.java | 4 ++ .../message/handler/ChatMessageHandler.java | 4 ++ .../org/apollo/game/model/entity/Player.java | 26 ++++++++- 5 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 data/plugins/cmd/punishment/plugin.xml create mode 100644 data/plugins/cmd/punishment/punish.rb diff --git a/data/plugins/cmd/punishment/plugin.xml b/data/plugins/cmd/punishment/plugin.xml new file mode 100644 index 00000000..a5c7a7e0 --- /dev/null +++ b/data/plugins/cmd/punishment/plugin.xml @@ -0,0 +1,14 @@ + + + punishment + 1 + Punishment commands + Adds various punishment commands, such as banning or muting a player. + + lare96 + + + + + + \ No newline at end of file diff --git a/data/plugins/cmd/punishment/punish.rb b/data/plugins/cmd/punishment/punish.rb new file mode 100644 index 00000000..997222b4 --- /dev/null +++ b/data/plugins/cmd/punishment/punish.rb @@ -0,0 +1,53 @@ +require 'java' + +java_import 'org.apollo.game.model.World' +java_import 'org.apollo.game.model.entity.Player' + +# Adds a command to mute a player. Admins cannot be muted. +on :command, :mute, RIGHTS_MOD do |player, command| + name = command.arguments.to_a.join(' ') + on_player = $world.get_player(name) + + if validate(player, on_player) + on_player.muted = true + on_player.send_message('You have just been muted.') + player.send_message("You have just muted #{on_player.get_username}.") + end +end + +# Adds a command to unmute a player. +on :command, :unmute, RIGHTS_MOD do |player, command| + name = command.arguments.to_a.join(' ') + on_player = $world.get_player(name) + + if validate(player, on_player) + on_player.muted = false + on_player.send_message('You are no longer muted.') + player.send_message("You have just unmuted #{on_player.get_username}.") + end +end + +# Adds a command to ban a player. Admins cannot be banned. +on :command, :ban, RIGHTS_ADMIN do |player, command| + name = command.arguments.to_a.join(' ') + on_player = $world.get_player(name) + + if validate(player, on_player) + on_player.banned = true + on_player.logout # TODO force logout + player.send_message("You have just banned #{on_player.get_username}.") + end +end + +# Ensures the player isn't nil, and that they aren't an Administrator. +def validate(player, on_player) + if on_player.nil? + player.send_message('That player does not exist.') + return false + elsif on_player.get_privilege_level == RIGHTS_ADMIN + player.send_message('You cannot perform this action on Administrators.') + return false + end + + true +end diff --git a/game/src/main/org/apollo/game/io/player/BinaryPlayerSerializer.java b/game/src/main/org/apollo/game/io/player/BinaryPlayerSerializer.java index 9d89bc84..ceadee44 100644 --- a/game/src/main/org/apollo/game/io/player/BinaryPlayerSerializer.java +++ b/game/src/main/org/apollo/game/io/player/BinaryPlayerSerializer.java @@ -162,6 +162,10 @@ public final class BinaryPlayerSerializer extends PlayerSerializer { Map> attributes = readAttributes(in); attributes.forEach(player::setAttribute); + + if (player.isBanned()) { + return new PlayerLoaderResponse(LoginConstants.STATUS_ACCOUNT_DISABLED); + } return new PlayerLoaderResponse(LoginConstants.STATUS_OK, player); } diff --git a/game/src/main/org/apollo/game/message/handler/ChatMessageHandler.java b/game/src/main/org/apollo/game/message/handler/ChatMessageHandler.java index 5b34165c..a4098d2e 100644 --- a/game/src/main/org/apollo/game/message/handler/ChatMessageHandler.java +++ b/game/src/main/org/apollo/game/message/handler/ChatMessageHandler.java @@ -23,6 +23,10 @@ public final class ChatMessageHandler extends MessageHandler { @Override public void handle(Player player, ChatMessage message) { + if (player.isMuted()) { + message.terminate(); + return; + } player.getBlockSet().add(SynchronizationBlock.createChatBlock(player, message)); } diff --git a/game/src/main/org/apollo/game/model/entity/Player.java b/game/src/main/org/apollo/game/model/entity/Player.java index ddde02f0..86e8a549 100644 --- a/game/src/main/org/apollo/game/model/entity/Player.java +++ b/game/src/main/org/apollo/game/model/entity/Player.java @@ -19,7 +19,6 @@ import org.apollo.game.message.impl.UpdateRunEnergyMessage; import org.apollo.game.model.Appearance; import org.apollo.game.model.Position; import org.apollo.game.model.World; -import org.apollo.game.model.World.RegistrationStatus; import org.apollo.game.model.entity.attr.Attribute; import org.apollo.game.model.entity.attr.AttributeDefinition; import org.apollo.game.model.entity.attr.AttributeMap; @@ -65,9 +64,14 @@ import com.google.common.base.Preconditions; public final class Player extends Mob { static { + // TODO this should be a time rather than a flag + AttributeMap.define("muted", AttributeDefinition.forBoolean(false, AttributePersistence.PERSISTENT)); + + AttributeMap.define("banned", AttributeDefinition.forBoolean(false, AttributePersistence.PERSISTENT)); AttributeMap.define("run_energy", AttributeDefinition.forInt(100, AttributePersistence.PERSISTENT)); } + /** * This player's bank. */ @@ -457,6 +461,22 @@ public final class Player extends Mob { return energy.getValue(); } + /** + * Returns if this player is banned or not. + */ + public boolean isBanned() { + Attribute banned = attributes.get("banned"); + return banned.getValue(); + } + + /** + * Returns if this player is muted or not. + */ + public boolean isMuted() { + Attribute muted = attributes.get("muted"); + return muted.getValue(); + } + /** * Gets this player's {@link ScreenBrightness}. * @@ -719,6 +739,10 @@ public final class Player extends Mob { send(new IdAssignmentMessage(index, members)); sendMessage("Welcome to RuneScape."); + if (isMuted()) { + sendMessage("You are currently muted. Other players will not see your chat messages."); + } + int[] tabs = InterfaceConstants.DEFAULT_INVENTORY_TABS; for (int tab = 0; tab < tabs.length; tab++) { send(new SwitchTabInterfaceMessage(tab, tabs[tab]));