diff --git a/cloud-core/src/main/java/com/intellectualsites/commands/CommandManager.java b/cloud-core/src/main/java/com/intellectualsites/commands/CommandManager.java index 4376f851..0ea87411 100644 --- a/cloud-core/src/main/java/com/intellectualsites/commands/CommandManager.java +++ b/cloud-core/src/main/java/com/intellectualsites/commands/CommandManager.java @@ -222,6 +222,9 @@ public abstract class CommandManager { * @return {@code true} if the sender has the permission, else {@code false} */ public boolean hasPermission(@Nonnull final C sender, @Nonnull final CommandPermission permission) { + if (permission.toString().isEmpty()) { + return true; + } if (permission instanceof Permission) { return hasPermission(sender, permission.toString()); } @@ -233,7 +236,7 @@ public abstract class CommandManager { } } } - return !(permission instanceof OrPermission); + return false; } /** diff --git a/cloud-core/src/test/java/com/intellectualsites/commands/CommandPermissionTest.java b/cloud-core/src/test/java/com/intellectualsites/commands/CommandPermissionTest.java index c35a0e97..ba968d80 100644 --- a/cloud-core/src/test/java/com/intellectualsites/commands/CommandPermissionTest.java +++ b/cloud-core/src/test/java/com/intellectualsites/commands/CommandPermissionTest.java @@ -35,6 +35,7 @@ import javax.annotation.Nonnull; class CommandPermissionTest { private final static CommandManager manager = new PermissionOutputtingCommandManager(); + private static boolean acceptOne = false; @BeforeAll static void setup() { @@ -46,7 +47,9 @@ class CommandPermissionTest { @Test void testCompoundPermission() { - Assertions.assertTrue(manager.suggest(new TestCommandSender(), "").isEmpty()); + Assertions.assertTrue(manager.suggest(new TestCommandSender(), "t").isEmpty()); + acceptOne = true; + Assertions.assertFalse(manager.suggest(new TestCommandSender(), "t").isEmpty()); } private static final class PermissionOutputtingCommandManager extends CommandManager { @@ -58,7 +61,7 @@ class CommandPermissionTest { @Override public boolean hasPermission(@Nonnull final TestCommandSender sender, @Nonnull final String permission) { - return false; + return acceptOne && permission.equalsIgnoreCase("test.permission.four"); } @Nonnull diff --git a/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/bukkit/BukkitCommandManager.java b/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/bukkit/BukkitCommandManager.java index 37ef4e61..271887b5 100644 --- a/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/bukkit/BukkitCommandManager.java +++ b/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/bukkit/BukkitCommandManager.java @@ -221,6 +221,15 @@ public class BukkitCommandManager extends CommandManager { } } + /** + * Get the backwards command sender plugin + * + * @return The backwards command sender mapper + */ + @Nonnull + public final Function getBackwardsCommandSenderMapper() { + return this.backwardsCommandSenderMapper; + } /** * Reasons to explain why Brigadier failed to initialize diff --git a/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/bukkit/CloudCommodoreManager.java b/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/bukkit/CloudCommodoreManager.java index e13b8d96..dc632418 100644 --- a/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/bukkit/CloudCommodoreManager.java +++ b/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/bukkit/CloudCommodoreManager.java @@ -36,6 +36,7 @@ import javax.annotation.Nonnull; @SuppressWarnings("ALL") class CloudCommodoreManager extends BukkitPluginRegistrationHandler { + private final BukkitCommandManager commandManager; private final CloudBrigadierManager brigadierManager; private final Commodore commodore; @@ -45,6 +46,7 @@ class CloudCommodoreManager extends BukkitPluginRegistrationHandler { throw new BukkitCommandManager.BrigadierFailureException(BukkitCommandManager .BrigadierFailureReason.COMMODORE_NOT_PRESENT); } + this.commandManager = commandManager; this.commodore = CommodoreProvider.getCommodore(commandManager.getOwningPlugin()); this.brigadierManager = new CloudBrigadierManager<>(commandManager, () -> new CommandContext<>(commandManager.getCommandSenderMapper().apply(Bukkit.getConsoleSender()))); @@ -58,6 +60,7 @@ class CloudCommodoreManager extends BukkitPluginRegistrationHandler { final LiteralCommandNode literalCommandNode = this.brigadierManager .createLiteralCommandNode(label, command, (o, p) -> true, cmd); this.commodore.register(bukkitCommand, literalCommandNode, p -> - p.hasPermission(command.getCommandPermission().toString())); + this.commandManager.hasPermission(commandManager.getCommandSenderMapper().apply(p), + command.getCommandPermission())); } } diff --git a/cloud-minecraft/cloud-paper/src/main/java/com/intellectualsites/commands/paper/PaperBrigadierListener.java b/cloud-minecraft/cloud-paper/src/main/java/com/intellectualsites/commands/paper/PaperBrigadierListener.java index 555f8b26..6b3f39cc 100644 --- a/cloud-minecraft/cloud-paper/src/main/java/com/intellectualsites/commands/paper/PaperBrigadierListener.java +++ b/cloud-minecraft/cloud-paper/src/main/java/com/intellectualsites/commands/paper/PaperBrigadierListener.java @@ -29,6 +29,7 @@ import com.intellectualsites.commands.CommandTree; import com.intellectualsites.commands.arguments.CommandArgument; import com.intellectualsites.commands.brigadier.CloudBrigadierManager; import com.intellectualsites.commands.context.CommandContext; +import com.intellectualsites.commands.permission.CommandPermission; import com.mojang.brigadier.arguments.ArgumentType; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -41,6 +42,7 @@ import javax.annotation.Nonnull; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.UUID; +import java.util.function.BiPredicate; import java.util.logging.Level; class PaperBrigadierListener implements Listener { @@ -124,12 +126,15 @@ class PaperBrigadierListener implements Listener { if (node == null) { return; } + final BiPredicate permissionChecker = (s, p) -> { + final C sender = paperCommandManager.getCommandSenderMapper().apply(s.getBukkitSender()); + return paperCommandManager.hasPermission(sender, p); + }; event.setLiteral(this.brigadierManager.createLiteralCommandNode(node, event.getLiteral(), event.getBrigadierCommand(), event.getBrigadierCommand(), - (s, p) -> p.toString().isEmpty() - || s.getBukkitSender().hasPermission(p.toString()))); + permissionChecker)); } }