From b4c1e242c82e3954675dbf964785b17cdcf87c61 Mon Sep 17 00:00:00 2001 From: kento2 Date: Wed, 29 Apr 2026 17:46:44 +0200 Subject: [PATCH] . --- .idea/misc.xml | 5 ++++ .../kencommandapi/BukkitKenCommand.java | 7 +++++ .../kencommandapi/BukkitKenCommandApi.java | 5 ++++ .../BukkitTabCompletionListener.java | 17 +++++++++++ .../api/structure/node/LiteralNode.java | 2 ++ .../impl/AbstractKenCommandApi.java | 15 ++++++---- .../impl/processing/TabCompleter.java | 28 +++++++++++++++++++ .../{argument => }/CommandArgumentImpl.java | 2 +- .../structure/{node => }/CommandNodeImpl.java | 5 +++- 9 files changed, 79 insertions(+), 7 deletions(-) create mode 100644 kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitTabCompletionListener.java create mode 100644 kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/processing/TabCompleter.java rename kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/structure/{argument => }/CommandArgumentImpl.java (93%) rename kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/structure/{node => }/CommandNodeImpl.java (94%) diff --git a/.idea/misc.xml b/.idea/misc.xml index 4b8a436..907cd48 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,10 @@ + + + + + diff --git a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java index 54d0774..4758d0b 100644 --- a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java +++ b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java @@ -7,6 +7,7 @@ import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; import java.util.Arrays; +import java.util.List; public class BukkitKenCommand extends Command { @@ -21,6 +22,12 @@ public class BukkitKenCommand extends Command { this.rootNode = rootNode; this.commandManager = commandManager; this.setAliases(Arrays.asList(rootNode.getNames())); + this.setPermission(rootNode.getPermission()); + } + + @Override + public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException { + } @Override diff --git a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommandApi.java b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommandApi.java index f7415b5..0d19ba2 100644 --- a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommandApi.java +++ b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommandApi.java @@ -27,6 +27,11 @@ public class BukkitKenCommandApi extends AbstractKenCommandApi rootNode) { try { Field field = Bukkit.getPluginManager().getClass().getDeclaredField("commandMap"); diff --git a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitTabCompletionListener.java b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitTabCompletionListener.java new file mode 100644 index 0000000..fa91b0e --- /dev/null +++ b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitTabCompletionListener.java @@ -0,0 +1,17 @@ +package de.kentoj.kencommandapi; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class BukkitTabCompleter implements TabCompleter { + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + + } +} diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/structure/node/LiteralNode.java b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/structure/node/LiteralNode.java index bdb4fb1..55150a2 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/structure/node/LiteralNode.java +++ b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/structure/node/LiteralNode.java @@ -13,4 +13,6 @@ public interface LiteralNode> { @Nullable CommandNode getLiteral(@NotNull String name); @NotNull Set> getLiterals(); + + @Nullable String getPermission(); } diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/AbstractKenCommandApi.java b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/AbstractKenCommandApi.java index e8f08b4..eab5bba 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/AbstractKenCommandApi.java +++ b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/AbstractKenCommandApi.java @@ -8,8 +8,8 @@ import de.kentoj.kencommandapi.api.structure.argument.ArgumentType; import de.kentoj.kencommandapi.api.structure.argument.CommandArgument; import de.kentoj.kencommandapi.api.structure.node.CommandNode; import de.kentoj.kencommandapi.impl.processing.ParsedArgumentImpl; -import de.kentoj.kencommandapi.impl.structure.argument.CommandArgumentImpl; -import de.kentoj.kencommandapi.impl.structure.node.CommandNodeImpl; +import de.kentoj.kencommandapi.impl.structure.CommandArgumentImpl; +import de.kentoj.kencommandapi.impl.structure.CommandNodeImpl; import lombok.RequiredArgsConstructor; import java.util.Arrays; @@ -24,6 +24,8 @@ public abstract class AbstractKenCommandApi> i public abstract void sendErrorMessage(T t, CommandException exception); + public abstract boolean hasPermission(T t, String permission); + @Override public CommandNode createNode(String... name) { return new CommandNodeImpl<>(name); @@ -39,7 +41,7 @@ public abstract class AbstractKenCommandApi> i var iter = Arrays.stream(args).iterator(); try { - var executableLiteral = processLiterals(node, iter); + var executableLiteral = processLiterals(sender, node, iter); var parsedArguments = parseArguments(executableLiteral, iter); assert executableLiteral.getExecutor() != null; executableLiteral.getExecutor().execute(createContext(sender, parsedArguments)); @@ -48,7 +50,7 @@ public abstract class AbstractKenCommandApi> i } } - private CommandNode processLiterals(CommandNode commandNode, Iterator iter) { + private CommandNode processLiterals(T sender, CommandNode commandNode, Iterator iter) { if (!iter.hasNext()) { // literals/arguments are optional if the node itself is executable if (commandNode.getExecutor() == null) throw new CommandException("no literal given but required"); @@ -64,7 +66,10 @@ public abstract class AbstractKenCommandApi> i if (literal == null) { throw new CommandException("Invalid literal: " + arg); } - return processLiterals(literal, iter); + if (literal.getPermission() != null && !hasPermission(sender, literal.getPermission())) { + throw new CommandException("No permission"); + } + return processLiterals(sender, literal, iter); } private Map> parseArguments(CommandNode commandNode, Iterator iter) { diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/processing/TabCompleter.java b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/processing/TabCompleter.java new file mode 100644 index 0000000..2b01cfc --- /dev/null +++ b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/processing/TabCompleter.java @@ -0,0 +1,28 @@ +package de.kentoj.kencommandapi.impl.processing; + +import de.kentoj.kencommandapi.api.processing.CommandContext; +import de.kentoj.kencommandapi.api.structure.node.CommandNode; + +import java.util.Arrays; +import java.util.List; + +public class TabCompleter> { + + private List tabComplete(CommandNode node, String[] args) { + var lastNode = node; + for (int i = 0; i < args.length; i++) { + var tmp = node.getLiteral(args[i]); + if (tmp == null) { + break; + } + lastNode = tmp; + i++; + } + + return node.getLiterals().stream().map(CommandNode::getNames).flatMap(Arrays::stream).toList(); + } + + private List getLastNode(CommandNode node, String[] args) { + if (node.get) + } +} diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/structure/argument/CommandArgumentImpl.java b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/structure/CommandArgumentImpl.java similarity index 93% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/structure/argument/CommandArgumentImpl.java rename to kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/structure/CommandArgumentImpl.java index 49c4347..77b4943 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/structure/argument/CommandArgumentImpl.java +++ b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/structure/CommandArgumentImpl.java @@ -1,4 +1,4 @@ -package de.kentoj.kencommandapi.impl.structure.argument; +package de.kentoj.kencommandapi.impl.structure; import de.kentoj.kencommandapi.api.processing.CommandContext; import de.kentoj.kencommandapi.api.structure.argument.ArgumentType; diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/structure/node/CommandNodeImpl.java b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/structure/CommandNodeImpl.java similarity index 94% rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/structure/node/CommandNodeImpl.java rename to kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/structure/CommandNodeImpl.java index 7dbe2a0..02d3874 100644 --- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/structure/node/CommandNodeImpl.java +++ b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/impl/structure/CommandNodeImpl.java @@ -1,4 +1,4 @@ -package de.kentoj.kencommandapi.impl.structure.node; +package de.kentoj.kencommandapi.impl.structure; import de.kentoj.kencommandapi.api.processing.CommandContext; import de.kentoj.kencommandapi.api.processing.CommandExecutor; @@ -29,6 +29,9 @@ public class CommandNodeImpl> implements Comma @Setter private String description; + @Getter + private @Nullable String permission = null; + public CommandNodeImpl(String[] names) { if (names.length == 0) throw new IllegalArgumentException("at least one name is required"); this.names = names;