This commit is contained in:
kento2 2026-04-29 17:46:44 +02:00
parent 6a725005f0
commit b4c1e242c8
9 changed files with 79 additions and 7 deletions

5
.idea/misc.xml generated
View file

@ -1,5 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<writeAnnotations>
<writeAnnotation name="lombok.Getter" />
</writeAnnotations>
</component>
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" project-jdk-name="21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />

View file

@ -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<String> tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException {
}
@Override

View file

@ -27,6 +27,11 @@ public class BukkitKenCommandApi extends AbstractKenCommandApi<CommandSender, Bu
sender.sendMessage("§c" + ex.getMessage() + cause);
}
@Override
public boolean hasPermission(CommandSender sender, String permission) {
return sender.hasPermission(permission);
}
public void register(CommandNode<CommandSender, BukkitCommandContext> rootNode) {
try {
Field field = Bukkit.getPluginManager().getClass().getDeclaredField("commandMap");

View file

@ -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<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
}
}

View file

@ -13,4 +13,6 @@ public interface LiteralNode<T, S extends CommandContext<T, ?>> {
@Nullable CommandNode<T, S> getLiteral(@NotNull String name);
@NotNull Set<CommandNode<T, S>> getLiterals();
@Nullable String getPermission();
}

View file

@ -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<T, S extends CommandContext<T, ?>> i
public abstract void sendErrorMessage(T t, CommandException exception);
public abstract boolean hasPermission(T t, String permission);
@Override
public CommandNode<T, S> createNode(String... name) {
return new CommandNodeImpl<>(name);
@ -39,7 +41,7 @@ public abstract class AbstractKenCommandApi<T, S extends CommandContext<T, ?>> 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<T, S extends CommandContext<T, ?>> i
}
}
private CommandNode<T, S> processLiterals(CommandNode<T, S> commandNode, Iterator<String> iter) {
private CommandNode<T, S> processLiterals(T sender, CommandNode<T, S> commandNode, Iterator<String> 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<T, S extends CommandContext<T, ?>> 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<String, ParsedArgument<T, S, ?>> parseArguments(CommandNode<T, S> commandNode, Iterator<String> iter) {

View file

@ -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<T, S extends CommandContext<T, ?>> {
private List<String> tabComplete(CommandNode<T, S> 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<String> getLastNode(CommandNode<T, S> node, String[] args) {
if (node.get)
}
}

View file

@ -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;

View file

@ -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<T, S extends CommandContext<T, ?>> 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;