From c84270af5cd55c3269c420391c490586be463d93 Mon Sep 17 00:00:00 2001 From: Ryan Barlow <7389646+ryanbarlow97@users.noreply.github.com> Date: Thu, 15 Oct 2026 17:47:38 +0000 Subject: [PATCH] fix: filter trade completion by prefix and sender --- .../manager/commands/TabCompletion.java | 16 ++++++++++------ .../marketblock/manager/MarketCommandsTest.java | 17 ++++++++++++++--- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/tfminecraft/marketblock/manager/commands/TabCompletion.java b/src/main/java/net/tfminecraft/marketblock/manager/commands/TabCompletion.java index 6c5b373..51bd07f 100644 --- a/src/main/java/net/tfminecraft/marketblock/manager/commands/TabCompletion.java +++ b/src/main/java/net/tfminecraft/marketblock/manager/commands/TabCompletion.java @@ -5,9 +5,11 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; +import java.util.Locale; public class TabCompletion implements TabCompleter { @@ -19,8 +21,9 @@ public List onTabComplete(CommandSender sender, Command command, String if (!sender.hasPermission(CommandManager.ADMIN_PERMISSION)) return completions; if (args.length == 1) { - String prefix = args[0].toLowerCase(); + String prefix = args[0].toLowerCase(Locale.ROOT); for (String sub : new String[] { "add", "delete", "reload", "reset", "resetall" }) { + if (!(sender instanceof Player) && !sub.equals("reload")) continue; if (sub.startsWith(prefix)) { completions.add(sub); } @@ -28,11 +31,12 @@ public List onTabComplete(CommandSender sender, Command command, String return completions; } - if (args.length == 2 && args[0].equalsIgnoreCase("delete")) { - completions.addAll(TradeLoader.getTrades().keySet()); - } - if (args.length == 2 && args[0].equalsIgnoreCase("reset")) { - completions.addAll(TradeLoader.getTrades().keySet()); + if (sender instanceof Player && args.length == 2 + && (args[0].equalsIgnoreCase("delete") || args[0].equalsIgnoreCase("reset"))) { + String prefix = args[1].toLowerCase(Locale.ROOT); + for (String id : TradeLoader.getTrades().keySet()) { + if (id.toLowerCase(Locale.ROOT).startsWith(prefix)) completions.add(id); + } } return completions; diff --git a/src/test/java/net/tfminecraft/marketblock/manager/MarketCommandsTest.java b/src/test/java/net/tfminecraft/marketblock/manager/MarketCommandsTest.java index 52e931a..1915ed1 100644 --- a/src/test/java/net/tfminecraft/marketblock/manager/MarketCommandsTest.java +++ b/src/test/java/net/tfminecraft/marketblock/manager/MarketCommandsTest.java @@ -97,10 +97,21 @@ void completionRespectsCommandPermissionPrefixAndTradeArguments() { when(command.getName()).thenReturn("marketblock"); assertTrue(completion.onTabComplete(sender, command, "", new String[] {""}).isEmpty()); when(sender.hasPermission(CommandManager.ADMIN_PERMISSION)).thenReturn(true); - assertEquals(List.of("reload", "reset", "resetall"), completion.onTabComplete(sender, command, "", new String[] {"RE"})); + assertEquals(List.of("reload"), completion.onTabComplete(sender, command, "", new String[] {"RE"})); + assertEquals(List.of("reload"), completion.onTabComplete(sender, command, "", new String[] {""})); + var player = server.addPlayer(); + player.setOp(true); + assertEquals(List.of("reload", "reset", "resetall"), completion.onTabComplete(player, command, "", new String[] {"RE"})); TradeLoader.getTrades().put("oak", new Trade("oak", new Category(), 2, 20, 1, "v.oak_log", 2, 64, 0)); - assertEquals(List.of("oak"), completion.onTabComplete(sender, command, "", new String[] {"delete", ""})); - assertEquals(List.of("oak"), completion.onTabComplete(sender, command, "", new String[] {"reset", ""})); + assertEquals(List.of("oak"), completion.onTabComplete(player, command, "", new String[] {"delete", ""})); + assertEquals(List.of("oak"), completion.onTabComplete(player, command, "", new String[] {"reset", ""})); + TradeLoader.getTrades().put("Iron", new Trade("Iron", new Category(), 2, 20, 1, "v.iron_ingot", 2, 64, 0)); + for (String action : List.of("delete", "reset")) { + assertEquals(List.of("oak"), completion.onTabComplete(player, command, "", new String[] {action, "O"})); + assertEquals(List.of("Iron"), completion.onTabComplete(player, command, "", new String[] {action, "ir"})); + assertTrue(completion.onTabComplete(player, command, "", new String[] {action, "zzz"}).isEmpty()); + assertTrue(completion.onTabComplete(sender, command, "", new String[] {action, ""}).isEmpty()); + } assertTrue(completion.onTabComplete(sender, command, "", new String[] {"add", ""}).isEmpty()); assertTrue(completion.onTabComplete(sender, command, "", new String[0]).isEmpty()); assertTrue(completion.onTabComplete(sender, command, "", new String[] {"reset", "oak", "extra"}).isEmpty());