1
mirror of https://github.com/Shiewk/SModeration.git synced 2026-04-28 05:54:16 +02:00

(1.7.0) Add a config option that prevents players from running certain commands when they are muted

This commit is contained in:
Shy
2025-08-22 11:19:04 +02:00
parent 7e3139126c
commit c4953d2acb
6 changed files with 121 additions and 73 deletions
+7
View File
@@ -0,0 +1,7 @@
# SModeration config
| Key | What it does |
|--------------------------|--------------------------------------------------------------------|
| socialspy-commands | The commands that `/socialspy` will listen to. |
| force-reason | Whether a reason is required for every punishment. |
| muted-forbidden-commands | Commands that players are not allowed to run while they are muted. |
+1 -1
View File
@@ -1 +1 @@
pluginVersion = 1.6.0 pluginVersion = 1.7.0
@@ -12,9 +12,13 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.world.WorldSaveEvent; import org.bukkit.event.world.WorldSaveEvent;
import java.util.List;
import static de.shiewk.smoderation.paper.SModerationPaper.CHAT_PREFIX; import static de.shiewk.smoderation.paper.SModerationPaper.CHAT_PREFIX;
import static net.kyori.adventure.text.Component.translatable;
public class PunishmentListener implements Listener { public class PunishmentListener implements Listener {
@@ -45,6 +49,29 @@ public class PunishmentListener implements Listener {
} }
} }
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event){
Player player = event.getPlayer();
final Punishment mute = SModerationPaper.container.find(p ->
p.type == PunishmentType.MUTE
&& p.to.equals(player.getUniqueId())
&& p.isActive());
if (mute != null) { // Player is muted
List<String> forbiddenCommands = SModerationPaper.config().getStringList("muted-forbidden-commands");
final String message = event.getMessage();
if (forbiddenCommands.stream().anyMatch(str ->
message.toLowerCase().startsWith("/"+str.toLowerCase()+" ")
|| message.toLowerCase().startsWith(str.toLowerCase()+" ")
)){
Bukkit.getConsoleSender().sendMessage(player.getName() + " tried to run forbidden command while muted");
player.sendMessage(CHAT_PREFIX.append(translatable("smod.punishment.playerMessage.mute.chat")));
event.setCancelled(true);
}
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPunishmentIssue(PunishmentIssueEvent event){ public void onPunishmentIssue(PunishmentIssueEvent event){
final Punishment punishment = event.getPunishment(); final Punishment punishment = event.getPunishment();
@@ -61,8 +61,8 @@ public class SocialSpyListener implements Listener {
List<String> socialSpyCommands = SModerationPaper.config().getStringList("socialspy-commands"); List<String> socialSpyCommands = SModerationPaper.config().getStringList("socialspy-commands");
final String message = event.getMessage(); final String message = event.getMessage();
if (socialSpyCommands.stream().anyMatch(str -> if (socialSpyCommands.stream().anyMatch(str ->
message.startsWith("/"+str+" ") message.toLowerCase().startsWith("/"+str.toLowerCase()+" ")
|| message.startsWith(str+" ") || message.toLowerCase().startsWith(str.toLowerCase()+" ")
)){ )){
SocialSpyListener.command(event.getPlayer(), message); SocialSpyListener.command(event.getPlayer(), message);
} }
+14 -1
View File
@@ -9,4 +9,17 @@ socialspy-commands:
- minecraft:msg - minecraft:msg
- minecraft:teammsg - minecraft:teammsg
- minecraft:tm - minecraft:tm
force-reason: false force-reason: false
muted-forbidden-commands:
- w
- tell
- msg
- teammsg
- tm
- me
- minecraft:w
- minecraft:tell
- minecraft:msg
- minecraft:teammsg
- minecraft:tm
- minecraft:me
@@ -1,59 +1,96 @@
{ {
"smod.command.ban.fail.tooShort": "You can't ban an offline player for less than 1ms.",
"smod.command.ban.fail.self": "You can't ban yourself.",
"smod.command.ban.fail.protect": "This player can't be banned.",
"smod.command.ban.fail.forceReason": "Please provide a reason.",
"smod.argument.duration.fail.invalid": "Invalid duration '<arg:0>'", "smod.argument.duration.fail.invalid": "Invalid duration '<arg:0>'",
"smod.argument.duration.fail.pattern": "Please provide a valid duration, e.g. '1d6h30min'", "smod.argument.duration.fail.pattern": "Please provide a valid duration, e.g. '1d6h30min'",
"smod.argument.offlinePlayer.fail.notCached": "That player is not cached.", "smod.argument.offlinePlayer.fail.notCached": "That player is not cached.",
"smod.argument.uuid.fail.notCached": "That player is not cached. Try providing an UUID instead.", "smod.argument.uuid.fail.notCached": "That player is not cached. Try providing an UUID instead.",
"smod.chatInput.remainingTime": "<gray><arg:0> seconds",
"smod.command.ban.fail.forceReason": "Please provide a reason.",
"smod.command.ban.fail.protect": "This player can't be banned.",
"smod.command.ban.fail.self": "You can't ban yourself.",
"smod.command.ban.fail.tooShort": "You can't ban an offline player for less than 1ms.",
"smod.command.ecsee.opening": "<prefix>Opening ender chest of <secondary><arg:0></secondary>.", "smod.command.ecsee.opening": "<prefix>Opening ender chest of <secondary><arg:0></secondary>.",
"smod.command.fail.invalidPlayer": "Please provide a valid player.",
"smod.command.fail.players": "Only players can execute this command.",
"smod.command.fail.playersConsole": "Only players and the console can execute this command.",
"smod.command.invsee.fail.self": "You can't open your own inventory.", "smod.command.invsee.fail.self": "You can't open your own inventory.",
"smod.command.invsee.opening": "<prefix>Opening inventory of <secondary><arg:0></secondary>.", "smod.command.invsee.opening": "<prefix>Opening inventory of <secondary><arg:0></secondary>.",
"smod.command.kick.fail.forceReason": "Please provide a reason.", "smod.command.kick.fail.forceReason": "Please provide a reason.",
"smod.command.kick.fail.self": "You can't kick yourself.",
"smod.command.kick.fail.protect": "This player can't be kicked.", "smod.command.kick.fail.protect": "This player can't be kicked.",
"smod.command.modlogs.heading": "<prefix>Player <secondary><arg:0> <gray>(<arg:1>)", "smod.command.kick.fail.self": "You can't kick yourself.",
"smod.command.modlogs.none": "<primary>- is not currently muted or banned.",
"smod.command.modlogs.mute": "<primary>- is muted until <secondary><arg:0></secondary> <gray>(in <arg:1>)</gray>. Reason: <secondary><arg:2>",
"smod.command.modlogs.ban": "<primary>- is banned until <secondary><arg:0></secondary> <gray>(in <arg:1>)</gray>. Reason: <secondary><arg:2>", "smod.command.modlogs.ban": "<primary>- is banned until <secondary><arg:0></secondary> <gray>(in <arg:1>)</gray>. Reason: <secondary><arg:2>",
"smod.command.modlogs.heading": "<prefix>Player <secondary><arg:0> <gray>(<arg:1>)",
"smod.command.modlogs.mute": "<primary>- is muted until <secondary><arg:0></secondary> <gray>(in <arg:1>)</gray>. Reason: <secondary><arg:2>",
"smod.command.modlogs.none": "<primary>- is not currently muted or banned.",
"smod.command.mute.fail.forceReason": "Please provide a reason.", "smod.command.mute.fail.forceReason": "Please provide a reason.",
"smod.command.mute.fail.self": "You can't mute yourself.",
"smod.command.mute.fail.protect": "This player can't be muted.", "smod.command.mute.fail.protect": "This player can't be muted.",
"smod.command.mute.fail.self": "You can't mute yourself.",
"smod.command.offlinetp.fail.unknown": "This player's location is unknown.", "smod.command.offlinetp.fail.unknown": "This player's location is unknown.",
"smod.command.offlinetp.teleporting": "<prefix>Teleporting you to <secondary><arg:0></secondary>.", "smod.command.offlinetp.teleporting": "<prefix>Teleporting you to <secondary><arg:0></secondary>.",
"smod.command.socialspy.enabled": "<prefix>SocialSpy <green>enabled</green>.",
"smod.command.socialspy.disabled": "<prefix>SocialSpy <red>disabled</red>.", "smod.command.socialspy.disabled": "<prefix>SocialSpy <red>disabled</red>.",
"smod.command.socialspy.enabled": "<prefix>SocialSpy <green>enabled</green>.",
"smod.command.unban.fail.notBanned": "That player is not banned.", "smod.command.unban.fail.notBanned": "That player is not banned.",
"smod.command.unmute.fail.notMuted": "That player is not muted.", "smod.command.unmute.fail.notMuted": "That player is not muted.",
"smod.command.vanish.fail.noPlayersFound": "No player was found.",
"smod.command.vanish.broadcast.on": "<prefix><secondary><arg:0></secondary> vanished.",
"smod.command.vanish.broadcast.off": "<prefix><secondary><arg:0></secondary> re-appeared.", "smod.command.vanish.broadcast.off": "<prefix><secondary><arg:0></secondary> re-appeared.",
"smod.command.vanish.toggle.on": "<prefix>You are now vanished.", "smod.command.vanish.broadcast.on": "<prefix><secondary><arg:0></secondary> vanished.",
"smod.command.vanish.toggle.off": "<prefix>You are no longer vanished.", "smod.command.vanish.fail.noPlayersFound": "No player was found.",
"smod.command.vanish.list.none": "<prefix>No players are currently vanished.",
"smod.command.vanish.list": "<prefix>The following players are currently vanished: <arg:0>", "smod.command.vanish.list": "<prefix>The following players are currently vanished: <arg:0>",
"smod.chatInput.remainingTime": "<gray><arg:0> seconds", "smod.command.vanish.list.none": "<prefix>No players are currently vanished.",
"smod.confirm.yes": "<green>Yes", "smod.command.vanish.toggle.off": "<prefix>You are no longer vanished.",
"smod.command.vanish.toggle.on": "<prefix>You are now vanished.",
"smod.confirm.no": "<red>No", "smod.confirm.no": "<red>No",
"smod.socialspy.command": "<primary>[<secondary>SocialSpy</secondary>] <arg:0>: <secondary><arg:1>", "smod.confirm.yes": "<green>Yes",
"smod.vanish.stillEnabled": "<bold><prefix>You are still vanished!", "smod.menu": "SMod Menu",
"smod.punishment.undo.mute": "<primary><secondary><arg:0></secondary> was unmuted by <secondary><arg:1></secondary>.", "smod.menu.filter": "Filter: <arg:0>",
"smod.punishment.undo.ban": "<primary><secondary><arg:0></secondary> was unbanned by <secondary><arg:1></secondary>.", "smod.menu.filter.active": "Active punishments",
"smod.punishment.broadcast.mute": "<primary><secondary><arg:0></secondary> was muted by <secondary><arg:1></secondary> for <secondary><arg:2></secondary>.<newline>Reason: <secondary><arg:3>", "smod.menu.filter.all": "All punishments",
"smod.menu.filter.expired": "Expired punishments",
"smod.menu.filter.switch": "\u00BB Click to switch filter",
"smod.menu.info.click": "\u00BB Click to undo punishment",
"smod.menu.info.duration": "<secondary>Duration: <primary><arg:0>",
"smod.menu.info.expiry.future": "<secondary>Expires: <primary>In <arg:0>",
"smod.menu.info.expiry.past": "<secondary>Expired: <primary><arg:0> ago",
"smod.menu.info.player": "<secondary>Player: <primary><arg:0>",
"smod.menu.info.punishedBy": "<secondary>Punished by: <primary><arg:0>",
"smod.menu.info.reason": "<secondary>Reason: <primary><arg:0>",
"smod.menu.info.timestamp": "<secondary>Timestamp: <primary><arg:0>",
"smod.menu.info.undone": "<red>Undone by: <gold><arg:0>",
"smod.menu.search": "Search",
"smod.menu.search.current": "Current search query: <arg:0>",
"smod.menu.search.new": "\u00BB Click to enter new search query",
"smod.menu.search.none": "None",
"smod.menu.search.query": "Enter your search query in the chat",
"smod.menu.search.remove": "\u00BB Right click to remove search query",
"smod.menu.sort": "Sort by: <arg:0>",
"smod.menu.sort.expiry": "Expiry time",
"smod.menu.sort.moderatorName": "Moderator name",
"smod.menu.sort.playerName": "Player name",
"smod.menu.sort.switch": "\u00BB Click to switch sorting option",
"smod.menu.sort.time": "Time issued",
"smod.menu.type": "Type: <arg:0>",
"smod.menu.type.all": "All",
"smod.menu.type.switch": "» Click to switch type",
"smod.menu.undoConfirmation": "Are you sure that you want to undo this punishment?",
"smod.punishment.broadcast.ban": "<primary><secondary><arg:0></secondary> was banned by <secondary><arg:1></secondary> for <secondary><arg:2></secondary>.<newline>Reason: <secondary><arg:3>", "smod.punishment.broadcast.ban": "<primary><secondary><arg:0></secondary> was banned by <secondary><arg:1></secondary> for <secondary><arg:2></secondary>.<newline>Reason: <secondary><arg:3>",
"smod.punishment.broadcast.kick": "<primary><secondary><arg:0></secondary> was kicked by <secondary><arg:1></secondary>.<newline>Reason: <secondary><arg:3>", "smod.punishment.broadcast.kick": "<primary><secondary><arg:0></secondary> was kicked by <secondary><arg:1></secondary>.<newline>Reason: <secondary><arg:3>",
"smod.punishment.playerMessage.mute": "<primary>You have been muted by <secondary><arg:0></secondary>.<newline>Reason: <secondary><arg:1></secondary><newline>Your mute expires in <secondary><arg:2></secondary>.", "smod.punishment.broadcast.mute": "<primary><secondary><arg:0></secondary> was muted by <secondary><arg:1></secondary> for <secondary><arg:2></secondary>.<newline>Reason: <secondary><arg:3>",
"smod.punishment.name.ban": "Ban",
"smod.punishment.name.kick": "Kick",
"smod.punishment.name.mute": "Mute",
"smod.punishment.playerMessage.ban": "<primary>You have been banned from this server by <secondary><arg:0></secondary>.<newline>Reason: <secondary><arg:1></secondary><newline>Your ban expires in <secondary><arg:2></secondary>.", "smod.punishment.playerMessage.ban": "<primary>You have been banned from this server by <secondary><arg:0></secondary>.<newline>Reason: <secondary><arg:1></secondary><newline>Your ban expires in <secondary><arg:2></secondary>.",
"smod.punishment.playerMessage.kick": "<primary>You have been kicked by <secondary><arg:0></secondary>.<newline>Reason: <secondary><arg:1>", "smod.punishment.playerMessage.kick": "<primary>You have been kicked by <secondary><arg:0></secondary>.<newline>Reason: <secondary><arg:1>",
"smod.punishment.name.mute": "Mute", "smod.punishment.playerMessage.mute": "<primary>You have been muted by <secondary><arg:0></secondary>.<newline>Reason: <secondary><arg:1></secondary><newline>Your mute expires in <secondary><arg:2></secondary>.",
"smod.punishment.name.kick": "Kick", "smod.punishment.playerMessage.mute.chat": "<primary>You can't run this command while you are muted.",
"smod.punishment.name.ban": "Ban", "smod.punishment.undo.ban": "<primary><secondary><arg:0></secondary> was unbanned by <secondary><arg:1></secondary>.",
"smod.command.fail.players": "Only players can execute this command.", "smod.punishment.undo.mute": "<primary><secondary><arg:0></secondary> was unmuted by <secondary><arg:1></secondary>.",
"smod.command.fail.playersConsole": "Only players and the console can execute this command.", "smod.socialspy.command": "<primary>[<secondary>SocialSpy</secondary>] <arg:0>: <secondary><arg:1>",
"smod.command.fail.invalidPlayer": "Please provide a valid player.", "smod.time.days": "<arg:0> days",
"smod.time.hours": "<arg:0> hours",
"smod.time.milliseconds": "<arg:0> milliseconds",
"smod.time.minutes": "<arg:0> minutes",
"smod.time.month.0": "January", "smod.time.month.0": "January",
"smod.time.month.1": "February", "smod.time.month.1": "February",
"smod.time.month.10": "November",
"smod.time.month.11": "December",
"smod.time.month.2": "March", "smod.time.month.2": "March",
"smod.time.month.3": "April", "smod.time.month.3": "April",
"smod.time.month.4": "May", "smod.time.month.4": "May",
@@ -62,46 +99,10 @@
"smod.time.month.7": "August", "smod.time.month.7": "August",
"smod.time.month.8": "September", "smod.time.month.8": "September",
"smod.time.month.9": "October", "smod.time.month.9": "October",
"smod.time.month.10": "November",
"smod.time.month.11": "December",
"smod.time.timestamp": "<arg:2> <arg:1> <arg:0> <arg:3>:<arg:4>:<arg:5> <arg:6>",
"smod.time.years": "<arg:0> years",
"smod.time.months": "<arg:0> months", "smod.time.months": "<arg:0> months",
"smod.time.weeks": "<arg:0> weeks",
"smod.time.days": "<arg:0> days",
"smod.time.hours": "<arg:0> hours",
"smod.time.minutes": "<arg:0> minutes",
"smod.time.seconds": "<arg:0> seconds", "smod.time.seconds": "<arg:0> seconds",
"smod.time.milliseconds": "<arg:0> milliseconds", "smod.time.timestamp": "<arg:2> <arg:1> <arg:0> <arg:3>:<arg:4>:<arg:5> <arg:6>",
"smod.menu.undoConfirmation": "Are you sure that you want to undo this punishment?", "smod.time.weeks": "<arg:0> weeks",
"smod.menu.filter.active": "Active punishments", "smod.time.years": "<arg:0> years",
"smod.menu.filter.expired": "Expired punishments", "smod.vanish.stillEnabled": "<bold><prefix>You are still vanished!"
"smod.menu.filter.all": "All punishments",
"smod.menu.sort.expiry": "Expiry time",
"smod.menu.sort.time": "Time issued",
"smod.menu.sort.playerName": "Player name",
"smod.menu.sort.moderatorName": "Moderator name",
"smod.menu": "SMod Menu",
"smod.menu.search.query": "Enter your search query in the chat",
"smod.menu.filter": "Filter: <arg:0>",
"smod.menu.filter.switch": "\u00BB Click to switch filter",
"smod.menu.type": "Type: <arg:0>",
"smod.menu.type.all": "All",
"smod.menu.type.switch": "» Click to switch type",
"smod.menu.sort": "Sort by: <arg:0>",
"smod.menu.sort.switch": "\u00BB Click to switch sorting option",
"smod.menu.search": "Search",
"smod.menu.search.current": "Current search query: <arg:0>",
"smod.menu.search.none": "None",
"smod.menu.search.new": "\u00BB Click to enter new search query",
"smod.menu.search.remove": "\u00BB Right click to remove search query",
"smod.menu.info.player": "<secondary>Player: <primary><arg:0>",
"smod.menu.info.punishedBy": "<secondary>Punished by: <primary><arg:0>",
"smod.menu.info.timestamp": "<secondary>Timestamp: <primary><arg:0>",
"smod.menu.info.duration": "<secondary>Duration: <primary><arg:0>",
"smod.menu.info.expiry.future": "<secondary>Expires: <primary>In <arg:0>",
"smod.menu.info.expiry.past": "<secondary>Expired: <primary><arg:0> ago",
"smod.menu.info.reason": "<secondary>Reason: <primary><arg:0>",
"smod.menu.info.undone": "<red>Undone by: <gold><arg:0>",
"smod.menu.info.click": "\u00BB Click to undo punishment"
} }