currently refactoring a lot.

This commit is contained in:
kento2 2026-07-04 01:04:01 +02:00
parent fe0b04c7d1
commit 9aa138058c
32 changed files with 484 additions and 254 deletions

View file

@ -7,14 +7,14 @@ plugins {
}
repositories {
maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") {
name = "spigotmc-repo"
maven("https://repo.papermc.io/repository/maven-public/") {
name = "papermc"
}
}
dependencies {
api(project(":kencommandapi-core"))
compileOnly("org.spigotmc:spigot-api:1.21.11-R0.1-SNAPSHOT")
compileOnly("io.papermc.paper:paper-api:1.21.11-rc3-R0.1-SNAPSHOT")
}
publishing {

View file

@ -0,0 +1,25 @@
package de.kentoj.kencommandapi;
import com.destroystokyo.paper.event.server.AsyncTabCompleteEvent;
import de.kentoj.kencommandapi.api.CommandHandler;
import lombok.RequiredArgsConstructor;
import org.bukkit.command.CommandSender;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@RequiredArgsConstructor
public class AsyncTabCompleter implements Listener {
private final CommandAPI commandAPI;
private final CommandHandler<CommandSender> commandHandler;
@EventHandler(ignoreCancelled = true)
public void onAsyncTabComplete(AsyncTabCompleteEvent ev) {
var args = ev.getBuffer().split(" ");
var label = args[0];
var rootNode = commandAPI.getRegistered(label);
if (rootNode == null) return;
commandHandler.getSuggestions(rootNode, ev.getSender(), args)
.thenAccept(ev::setCompletions);
}
}

View file

@ -1,9 +1,7 @@
package de.kentoj.kencommandapi;
import de.kentoj.kencommandapi.api.CommandNode;
import de.kentoj.kencommandapi.api.invocation.CommandContext;
import de.kentoj.kencommandapi.internal.parser.CommandParser;
import de.kentoj.kencommandapi.internal.parser.ParseResult;
import de.kentoj.kencommandapi.api.CommandHandler;
import de.kentoj.kencommandapi.api.node.RootCommandNode;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
@ -12,15 +10,15 @@ import java.util.Arrays;
public class BukkitKenCommand extends Command {
private final CommandNode<CommandSender> rootNode;
private final CommandParser<CommandSender> commandParser;
private final RootCommandNode<CommandSender> rootNode;
private final CommandHandler<CommandSender> commandHandler;
protected BukkitKenCommand(
CommandParser<CommandSender> commandParser,
CommandNode<CommandSender> rootNode
CommandHandler<CommandSender> commandHandler,
RootCommandNode<CommandSender> rootNode
) {
super(rootNode.getNames()[0]);
this.commandParser = commandParser;
this.commandHandler = commandHandler;
this.rootNode = rootNode;
this.setAliases(Arrays.asList(rootNode.getNames()));
this.setPermission(rootNode.getPermission());
@ -28,21 +26,7 @@ public class BukkitKenCommand extends Command {
@Override
public boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, @NotNull String[] args) {
var parseResult = commandParser.parseLiteral(rootNode, sender, args);
if (parseResult instanceof ParseResult.Success<CommandSender>) {
var ctx = new CommandContext<>(sender, ((ParseResult.Success<CommandSender>) parseResult).getParsedArguments());
assert parseResult.getLiteral().getExecutor() != null;
try {
var result = parseResult.getLiteral().getExecutor().execute(ctx);
if (result.isError()) {
sender.sendMessage("§c" + result.getError());
}
} catch (Exception e) {
sender.sendMessage("§4§lERROR " + e.getMessage());
}
} else {
sender.sendMessage("§c" + parseResult.getMessage());
}
commandHandler.invoke(rootNode, sender, args);
return true;
}
}

View file

@ -1,27 +1,50 @@
package de.kentoj.kencommandapi;
import de.kentoj.kencommandapi.api.CommandNode;
import de.kentoj.kencommandapi.internal.parser.CommandParser;
import de.kentoj.kencommandapi.api.CommandHandler;
import de.kentoj.kencommandapi.api.node.RootCommandNode;
import de.kentoj.kencommandapi.api.parser.CommandParser;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.command.SimpleCommandMap;
import org.bukkit.permissions.Permissible;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class CommandAPI {
private final CommandParser<CommandSender> commandParser = new CommandParser<>(Permissible::hasPermission);
private final CommandHandler<CommandSender> commandHandler;
private final List<RootCommandNode<CommandSender>> registeredNodes = new ArrayList<>();
private final SimpleCommandMap commandMap;
public CommandAPI(Plugin plugin) {
this.commandHandler = new CommandHandler<>(new CommandParser<>(Permissible::hasPermission),
CommandSender::sendMessage, Permissible::hasPermission);
Bukkit.getPluginManager().registerEvents(new AsyncTabCompleter(this, commandHandler), plugin);
public void register(CommandNode<CommandSender> rootNode) {
SimpleCommandMap commandMap;
try {
Field field = Bukkit.getPluginManager().getClass().getDeclaredField("commandMap");
field.setAccessible(true);
commandMap = (SimpleCommandMap) field.get(Bukkit.getPluginManager());
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new IllegalStateException("failed registering command ", e);
throw new IllegalStateException("failed getting command map", e);
}
commandMap.register(rootNode.getNames()[0], new BukkitKenCommand(commandParser, rootNode));
}
@Nullable RootCommandNode<CommandSender> getRegistered(String name) {
for (var node : registeredNodes) {
for (String nodeName : node.getNames()) {
if (nodeName.equals(name)) return node;
}
}
return null;
}
public void register(RootCommandNode<CommandSender> rootNode) {
registeredNodes.add(rootNode);
commandMap.register(rootNode.getNames()[0], new BukkitKenCommand(commandHandler, rootNode));
}
}

View file

@ -1,21 +1,19 @@
package de.kentoj.kencommandapi.suggestionprovider;
import de.kentoj.kencommandapi.api.invocation.CommandContext;
import de.kentoj.kencommandapi.api.suggestion.SuggestionProvider;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Set;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
public class PlayerSuggestionProvider implements SuggestionProvider<CommandSender> {
@Override
public CompletableFuture<Set<String>> suggest(CommandContext<CommandSender> context) {
public CompletableFuture<List<String>> suggest(CommandSender __) {
var list = Bukkit.getOnlinePlayers().stream()
.map(Player::getName)
.collect(Collectors.toSet());
.toList();
return CompletableFuture.completedFuture(list);
}
}

View file

@ -26,10 +26,10 @@ public class OfflinePlayerArgumentType implements ArgumentType<CommandSender, Of
try {
player = Bukkit.getOfflinePlayer(UUID.fromString(string));
} catch (IllegalArgumentException ex) {
throw new IllegalArgumentException("Not a UUID or online player -- " + string);
throw new IllegalArgumentException("not an UUID or online player");
}
}
if (!player.hasPlayedBefore() && !player.isOnline()) throw new IllegalArgumentException("Unknown player -- " + string);
if (!player.hasPlayedBefore() && !player.isOnline()) throw new IllegalArgumentException("Player not found");
return player;
}

View file

@ -19,7 +19,7 @@ public class PlayerArgumentType implements ArgumentType<CommandSender, Player> {
@Override
public Player parseInput(String string) {
var player = Bukkit.getPlayer(string);
if (player == null) throw new IllegalArgumentException("Player not online -- " + string);
if (player == null) throw new IllegalArgumentException("player not online");
return player;
}