diff --git a/CommandWhitelistBukkit/src/main/java/eu/endermite/commandwhitelist/bukkit/listeners/PlayerCommandPreProcessListener.java b/CommandWhitelistBukkit/src/main/java/eu/endermite/commandwhitelist/bukkit/listeners/PlayerCommandPreProcessListener.java index 4db8a70..bd8b253 100644 --- a/CommandWhitelistBukkit/src/main/java/eu/endermite/commandwhitelist/bukkit/listeners/PlayerCommandPreProcessListener.java +++ b/CommandWhitelistBukkit/src/main/java/eu/endermite/commandwhitelist/bukkit/listeners/PlayerCommandPreProcessListener.java @@ -6,6 +6,7 @@ import eu.endermite.commandwhitelist.common.CommandUtil; import eu.endermite.commandwhitelist.common.ConfigCache; import eu.endermite.commandwhitelist.common.commands.CWCommand; import net.kyori.adventure.platform.bukkit.BukkitAudiences; +import net.kyori.adventure.text.Component; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -20,6 +21,7 @@ public class PlayerCommandPreProcessListener implements Listener { if (player.hasPermission(CWPermission.BYPASS.permission())) return; String caseSensitiveLabel = CommandUtil.getCommandLabel(event.getMessage()); String label = caseSensitiveLabel.toLowerCase(); + String messageWithoutSlash = event.getMessage().startsWith("/") ? event.getMessage().substring(1) : event.getMessage(); BukkitAudiences audiences = CommandWhitelistBukkit.getAudiences(); ConfigCache config = CommandWhitelistBukkit.getConfigCache(); @@ -27,12 +29,16 @@ public class PlayerCommandPreProcessListener implements Listener { HashSet commands = CommandWhitelistBukkit.getCommands(player); if (!commands.contains(label)) { event.setCancelled(true); - audiences.player(player).sendMessage(CWCommand.miniMessage.deserialize(config.prefix + CommandWhitelistBukkit.getCommandDeniedMessage(label))); + Component message = CWCommand.getParsedErrorMessage( + messageWithoutSlash, + config.prefix + CommandWhitelistBukkit.getCommandDeniedMessage(label) + ); + audiences.player(player).sendMessage(message); return; } HashSet bannedSubCommands = CommandWhitelistBukkit.getSuggestions(player); - String messageWithoutSlash = event.getMessage().startsWith("/") ? event.getMessage().substring(1) : event.getMessage(); + for (String bannedSubCommand : bannedSubCommands) { if (messageWithoutSlash.startsWith(bannedSubCommand)) { event.setCancelled(true); diff --git a/CommandWhitelistCommon/src/main/java/eu/endermite/commandwhitelist/common/commands/CWCommand.java b/CommandWhitelistCommon/src/main/java/eu/endermite/commandwhitelist/common/commands/CWCommand.java index 94416bc..63bbcc5 100644 --- a/CommandWhitelistCommon/src/main/java/eu/endermite/commandwhitelist/common/commands/CWCommand.java +++ b/CommandWhitelistCommon/src/main/java/eu/endermite/commandwhitelist/common/commands/CWCommand.java @@ -6,6 +6,10 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.kyori.adventure.text.minimessage.tag.standard.StandardTags; + import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -133,4 +137,23 @@ public class CWCommand { } } + /** + * Get a message component for a command denied message + * @param inputCommandString command that was denied as string + * @param message raw message to display + * @return parsed message component + */ + public static Component getParsedErrorMessage(String inputCommandString, String message) { + MiniMessage miniMessage = MiniMessage.builder() + .tags(TagResolver.builder() + .resolvers(StandardTags.defaults(), commandContentResolver(inputCommandString)) + .build()) + .build(); + return miniMessage.deserialize(message); + } + + private static TagResolver commandContentResolver(String rawCommand) { + return TagResolver.resolver("command", (context, builder) -> Tag.selfClosingInserting(Component.text(rawCommand))); + } + } diff --git a/CommandWhitelistWaterfall/src/main/java/eu/endermite/commandwhitelist/waterfall/listeners/BungeeChatEventListener.java b/CommandWhitelistWaterfall/src/main/java/eu/endermite/commandwhitelist/waterfall/listeners/BungeeChatEventListener.java index 9dfcd9c..0d34bbe 100644 --- a/CommandWhitelistWaterfall/src/main/java/eu/endermite/commandwhitelist/waterfall/listeners/BungeeChatEventListener.java +++ b/CommandWhitelistWaterfall/src/main/java/eu/endermite/commandwhitelist/waterfall/listeners/BungeeChatEventListener.java @@ -6,7 +6,9 @@ import eu.endermite.commandwhitelist.common.ConfigCache; import eu.endermite.commandwhitelist.common.commands.CWCommand; import eu.endermite.commandwhitelist.waterfall.CommandWhitelistWaterfall; import net.kyori.adventure.platform.bungeecord.BungeeAudiences; +import net.kyori.adventure.text.Component; import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.event.ChatEvent; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.event.EventHandler; @@ -15,7 +17,7 @@ import java.util.HashSet; public class BungeeChatEventListener implements Listener { @EventHandler - public void onChatEvent(net.md_5.bungee.api.event.ChatEvent event) { + public void onChatEvent(ChatEvent event) { if (event.isCancelled()) return; if (!(event.getSender() instanceof ProxiedPlayer)) return; if (!event.isProxyCommand()) return; @@ -32,7 +34,11 @@ public class BungeeChatEventListener implements Listener { HashSet commands = CommandWhitelistWaterfall.getCommands(player); if (!commands.contains(label)) { event.setCancelled(true); - CommandWhitelistWaterfall.getAudiences().player(player).sendMessage(CWCommand.miniMessage.deserialize(configCache.prefix + CommandWhitelistWaterfall.getCommandDeniedMessage(label))); + Component message = CWCommand.getParsedErrorMessage( + command, + configCache.prefix + CommandWhitelistWaterfall.getCommandDeniedMessage(label) + ); + audiences.player(player).sendMessage(message); return; }