This commit is contained in:
kento2 2026-06-29 18:49:42 +02:00
parent 254af80fde
commit 72f7625b19
53 changed files with 679 additions and 756 deletions

View file

@ -1,22 +0,0 @@
package de.kentoj.kencommandapi;
import de.kentoj.kencommandapi.api.processing.ParsedArgument;
import de.kentoj.kencommandapi.impl.processing.CommandContextImpl;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Map;
public class BukkitCommandContext extends CommandContextImpl<CommandSender, BukkitCommandContext> {
BukkitCommandContext(
CommandSender sender,
Map<String, ParsedArgument<CommandSender, BukkitCommandContext, ?>> parsedArguments
) {
super(sender, parsedArguments);
}
public Player getPlayerSender() {
return ((Player) getSender());
}
}

View file

@ -1,7 +1,9 @@
package de.kentoj.kencommandapi;
import de.kentoj.kencommandapi.api.KenCommandApi;
import de.kentoj.kencommandapi.api.nodes.CommandNode;
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 org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
@ -10,23 +12,37 @@ import java.util.Arrays;
public class BukkitKenCommand extends Command {
private final CommandNode<CommandSender, BukkitCommandContext> rootNode;
private final KenCommandApi<CommandSender, BukkitCommandContext> commandManager;
private final CommandNode<CommandSender> rootNode;
private final CommandParser<CommandSender> commandParser;
protected BukkitKenCommand(
KenCommandApi<CommandSender, BukkitCommandContext> commandManager,
CommandNode<CommandSender, BukkitCommandContext> rootNode
CommandParser<CommandSender> commandParser,
CommandNode<CommandSender> rootNode
) {
super(rootNode.getNames()[0]);
this.commandParser = commandParser;
this.rootNode = rootNode;
this.commandManager = commandManager;
this.setAliases(Arrays.asList(rootNode.getNames()));
this.setPermission(rootNode.getPermission());
}
@Override
public boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, @NotNull String[] args) {
commandManager.invoke(rootNode, sender, args);
return false;
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());
}
return true;
}
}

View file

@ -1,45 +0,0 @@
package de.kentoj.kencommandapi;
import de.kentoj.kencommandapi.api.processing.CommandException;
import de.kentoj.kencommandapi.api.processing.ParsedArgument;
import de.kentoj.kencommandapi.api.nodes.CommandNode;
import de.kentoj.kencommandapi.impl.AbstractKenCommandApi;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.command.SimpleCommandMap;
import java.lang.reflect.Field;
import java.util.Map;
public class BukkitKenCommandApi extends AbstractKenCommandApi<CommandSender, BukkitCommandContext> {
@Override
public BukkitCommandContext createContext(
CommandSender sender,
Map<String, ParsedArgument<CommandSender, BukkitCommandContext, ?>> parsedArguments
) {
return new BukkitCommandContext(sender, parsedArguments);
}
@Override
public void sendErrorMessage(CommandSender sender, CommandException ex) {
var cause = (ex.getCause() != null) ? ": " + ex.getCause().getMessage() : "";
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");
field.setAccessible(true);
SimpleCommandMap commandMap = (SimpleCommandMap) field.get(Bukkit.getPluginManager());
commandMap.register(rootNode.getNames()[0], new BukkitKenCommand(this, rootNode));
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
}

View file

@ -0,0 +1,27 @@
package de.kentoj.kencommandapi;
import de.kentoj.kencommandapi.api.CommandNode;
import de.kentoj.kencommandapi.internal.parser.CommandParser;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.command.SimpleCommandMap;
import org.bukkit.permissions.Permissible;
import java.lang.reflect.Field;
public class CommandAPI {
private final CommandParser<CommandSender> commandParser = new CommandParser<>(Permissible::hasPermission);
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);
}
commandMap.register(rootNode.getNames()[0], new BukkitKenCommand(commandParser, rootNode));
}
}

View file

@ -1,7 +1,7 @@
package de.kentoj.kencommandapi.suggestionprovider;
import de.kentoj.kencommandapi.BukkitCommandContext;
import de.kentoj.kencommandapi.api.argument.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;
@ -10,9 +10,9 @@ import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
public class PlayerSuggestionProvider implements SuggestionProvider<CommandSender, BukkitCommandContext> {
public class PlayerSuggestionProvider implements SuggestionProvider<CommandSender> {
@Override
public CompletableFuture<Set<String>> suggest(BukkitCommandContext context) {
public CompletableFuture<Set<String>> suggest(CommandContext<CommandSender> context) {
var list = Bukkit.getOnlinePlayers().stream()
.map(Player::getName)
.collect(Collectors.toSet());

View file

@ -1,10 +1,7 @@
package de.kentoj.kencommandapi.type;
import de.kentoj.kencommandapi.BukkitCommandContext;
import de.kentoj.kencommandapi.api.processing.CommandException;
import de.kentoj.kencommandapi.api.argument.ArgumentType;
import de.kentoj.kencommandapi.api.argument.SuggestionProvider;
import de.kentoj.kencommandapi.api.argument.suggestion.NoSuggestionProvider;
import de.kentoj.kencommandapi.api.suggestion.SuggestionProvider;
import de.kentoj.kencommandapi.suggestionprovider.PlayerSuggestionProvider;
import lombok.AccessLevel;
import lombok.Getter;
@ -16,7 +13,7 @@ import org.bukkit.command.CommandSender;
import java.util.UUID;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class OfflinePlayerArgumentType implements ArgumentType<CommandSender, BukkitCommandContext, OfflinePlayer> {
public class OfflinePlayerArgumentType implements ArgumentType<CommandSender, OfflinePlayer> {
@Getter(lazy = true)
private static final OfflinePlayerArgumentType instance = new OfflinePlayerArgumentType();
@ -29,15 +26,15 @@ public class OfflinePlayerArgumentType implements ArgumentType<CommandSender, Bu
try {
player = Bukkit.getOfflinePlayer(UUID.fromString(string));
} catch (IllegalArgumentException ex) {
throw new CommandException("Not a UUID or online player -- " + string);
throw new IllegalArgumentException("Not a UUID or online player -- " + string);
}
}
if (!player.hasPlayedBefore() && !player.isOnline()) throw new CommandException("Unknown player -- " + string);
if (!player.hasPlayedBefore() && !player.isOnline()) throw new IllegalArgumentException("Unknown player -- " + string);
return player;
}
@Override
public SuggestionProvider<CommandSender, BukkitCommandContext> defaultSuggestionProvider() {
public SuggestionProvider<CommandSender> defaultSuggestionProvider() {
return new PlayerSuggestionProvider();
}
}

View file

@ -1,9 +1,7 @@
package de.kentoj.kencommandapi.type;
import de.kentoj.kencommandapi.BukkitCommandContext;
import de.kentoj.kencommandapi.api.argument.ArgumentType;
import de.kentoj.kencommandapi.api.argument.SuggestionProvider;
import de.kentoj.kencommandapi.api.processing.CommandException;
import de.kentoj.kencommandapi.api.suggestion.SuggestionProvider;
import de.kentoj.kencommandapi.suggestionprovider.PlayerSuggestionProvider;
import lombok.AccessLevel;
import lombok.Getter;
@ -13,7 +11,7 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class PlayerArgumentType implements ArgumentType<CommandSender, BukkitCommandContext, Player> {
public class PlayerArgumentType implements ArgumentType<CommandSender, Player> {
@Getter(lazy = true)
private static final PlayerArgumentType instance = new PlayerArgumentType();
@ -21,12 +19,12 @@ public class PlayerArgumentType implements ArgumentType<CommandSender, BukkitCom
@Override
public Player parseInput(String string) {
var player = Bukkit.getPlayer(string);
if (player == null) throw new CommandException("Player not online -- " + string);
if (player == null) throw new IllegalArgumentException("Player not online -- " + string);
return player;
}
@Override
public SuggestionProvider<CommandSender, BukkitCommandContext> defaultSuggestionProvider() {
public SuggestionProvider<CommandSender> defaultSuggestionProvider() {
return new PlayerSuggestionProvider();
}
}