This commit is contained in:
kento2 2026-07-05 00:36:48 +02:00
parent 9aa138058c
commit b234cd9df7
17 changed files with 51 additions and 56 deletions

37
.idea/workspace.xml generated
View file

@ -4,42 +4,26 @@
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="6414223f-1761-4683-97f5-9dab59d6c44a" name="Changes" comment=".">
<change afterPath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/AsyncTabCompleter.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/node/RootCommandNode.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/platform/MessageStyle.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/platform/PlainMessageStyle.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/platform/SendMessageMethod.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/RootCommandNodeImpl.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/vcs.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
<list default="true" id="6414223f-1761-4683-97f5-9dab59d6c44a" name="Changes" comment="currently refactoring a lot.">
<change afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/invocation/SyncCommandExecutor.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-bukkit/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-bukkit/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/AsyncTabCompleter.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/TabCompleteListener.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/CommandAPI.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/CommandAPI.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/suggestionprovider/PlayerSuggestionProvider.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/suggestionprovider/PlayerSuggestionProvider.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/type/OfflinePlayerArgumentType.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/type/OfflinePlayerArgumentType.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/type/PlayerArgumentType.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/type/PlayerArgumentType.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/CommandNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/node/CommandNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/invocation/CommandExecutor.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/invocation/CommandExecutor.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/invocation/Result.java" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/ParseResult.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/ParseResult.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/suggestion/NoSuggestionProvider.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/suggestion/NoSuggestionProvider.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/suggestion/SuggestionProvider.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/suggestion/SuggestionProvider.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/CommandArgumentImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/CommandArgumentImpl.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/CommandNodeImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/CommandNodeImpl.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/parser/CommandParser.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/CommandParser.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/parser/ParseResult.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/ParseResult.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/parser/PermissionChecker.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/platform/HasPermissionMethod.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/CommandAPI.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/CommandAPI.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/VelocityCommand.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/VelocityCommand.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/suggestionprovider/PlayerSuggestionProvider.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/suggestionprovider/PlayerSuggestionProvider.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/type/PlayerArgumentType.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-velocity/src/main/java/de/kentoj/kencommandapi/type/PlayerArgumentType.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../build-logic/convention/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/../build-logic/convention/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/de/kentoj/scrow/BaseDependenciesConvention.kt" beforeDir="false" afterPath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/de/kentoj/scrow/BaseDependenciesConvention.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/de/kentoj/scrow/ScrowRepositoryConvention.kt" beforeDir="false" afterPath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/de/kentoj/scrow/ScrowRepositoryConvention.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../build-logic/settings.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/../build-logic/settings.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/de/kentoj/scrow/DatabaseConvention.kt" beforeDir="false" afterPath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/de/kentoj/scrow/DatabaseConvention.kt" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -182,11 +166,11 @@
<recent name="$PROJECT_DIR$/kencommandapi-core" />
</key>
<key name="CopyClassDialog.RECENTS_KEY">
<recent name="de.kentoj.kencommandapi.api.invocation" />
<recent name="de.kentoj.kencommandapi.internal" />
<recent name="de.kentoj.kencommandapi.api" />
<recent name="de.kentoj.kencommandapi.impl" />
<recent name="de.kentoj.kencommandapi.api.structure.argument.types" />
<recent name="de.kentoj.kencommandapi.type" />
</key>
</component>
<component name="RunAnythingCache">
@ -195,7 +179,7 @@
<command value="KenCommandAPI [publishAllPublicationsToScrowRepository]" />
</option>
</component>
<component name="RunManager" selected="Gradle.KenCommandAPI [publishAllPublicationsToScrowRepository]">
<component name="RunManager" selected="Gradle.KenCommandAPI [build]">
<configuration name="KenCommandAPI [build]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
<ExternalSystemSettings>
<option name="executionName" />
@ -308,8 +292,8 @@
</configuration>
<recent_temporary>
<list>
<item itemvalue="Gradle.KenCommandAPI [publishAllPublicationsToScrowRepository]" />
<item itemvalue="Gradle.KenCommandAPI [build]" />
<item itemvalue="Gradle.KenCommandAPI [publishAllPublicationsToScrowRepository]" />
<item itemvalue="Gradle.KenCommandAPI [clean]" />
<item itemvalue="Gradle.KenCommandAPI:kencommandapi-velocity [publish]" />
<item itemvalue="Gradle.KenCommandAPI [publish]" />
@ -572,6 +556,7 @@
<MESSAGE value="add TODO" />
<MESSAGE value="make SuggestionProvider use CompletableFuture" />
<MESSAGE value="." />
<option name="LAST_COMMIT_MESSAGE" value="." />
<MESSAGE value="currently refactoring a lot." />
<option name="LAST_COMMIT_MESSAGE" value="currently refactoring a lot." />
</component>
</project>

View file

@ -1,5 +1,5 @@
group = "de.kentoj.scrow"
version = "0.21"
version = "0.28"
subprojects {
group = rootProject.group

View file

@ -13,7 +13,7 @@ repositories {
}
dependencies {
api(project(":kencommandapi-core"))
compileOnly(project(":kencommandapi-core"))
compileOnly("io.papermc.paper:paper-api:1.21.11-rc3-R0.1-SNAPSHOT")
}

View file

@ -23,7 +23,7 @@ public class CommandAPI {
public CommandAPI(Plugin plugin) {
this.commandHandler = new CommandHandler<>(new CommandParser<>(Permissible::hasPermission),
CommandSender::sendMessage, Permissible::hasPermission);
Bukkit.getPluginManager().registerEvents(new AsyncTabCompleter(this, commandHandler), plugin);
Bukkit.getPluginManager().registerEvents(new TabCompleteListener(this, commandHandler), plugin);
try {
Field field = Bukkit.getPluginManager().getClass().getDeclaredField("commandMap");

View file

@ -8,18 +8,20 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@RequiredArgsConstructor
public class AsyncTabCompleter implements Listener {
public class TabCompleteListener implements Listener {
private final CommandAPI commandAPI;
private final CommandHandler<CommandSender> commandHandler;
@EventHandler(ignoreCancelled = true)
public void onAsyncTabComplete(AsyncTabCompleteEvent ev) {
if (!ev.isCommand()) return;
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);
ev.setHandled(true);
ev.setCompletions(commandHandler.getSuggestions(rootNode, ev.getSender(), args));
}
}

View file

@ -6,14 +6,12 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.List;
import java.util.concurrent.CompletableFuture;
public class PlayerSuggestionProvider implements SuggestionProvider<CommandSender> {
@Override
public CompletableFuture<List<String>> suggest(CommandSender __) {
var list = Bukkit.getOnlinePlayers().stream()
public List<String> suggest(CommandSender __) {
return Bukkit.getOnlinePlayers().stream()
.map(Player::getName)
.toList();
return CompletableFuture.completedFuture(list);
}
}

View file

@ -11,7 +11,7 @@ repositories {
}
dependencies {
api("net.kyori:adventure-api:5.2.0")
compileOnly("net.kyori:adventure-api:5.2.0")
}
publishing {

View file

@ -31,16 +31,14 @@ public class CommandHandler<T> {
var ctx = new CommandContext<>(sender, ((ParseResult.Success<T>) parseResult).getParsedArguments());
assert parseResult.getLiteral().getExecutor() != null;
parseResult.getLiteral().getExecutor().execute(ctx).whenComplete((result, ex) -> {
if (ex != null) {
if (ex != null)
sendMessageMethod.send(sender, rootNode.getMessageStyle().exception(ex));
}
result.ifFailure(failure ->
sendMessageMethod.send(sender, rootNode.getMessageStyle().err(failure))
);
sendMessageMethod.send(sender, rootNode.getMessageStyle().err(failure)));
});
}
public CompletableFuture<List<String>> getSuggestions(RootCommandNode<T> rootNode, T sender, String[] args) {
public List<String> getSuggestions(RootCommandNode<T> rootNode, T sender, String[] args) {
var parseResult = commandParser.parseLiteral(rootNode, sender, args, false);
if (parseResult instanceof ParseResult.ArgumentExpected<T>) {
@ -56,7 +54,7 @@ public class CommandHandler<T> {
return getSuggestions(sender, parseResult.getLiteral(), filter);
}
private CompletableFuture<List<String>> getSuggestions(T sender, CommandNode<T> literal, @Nullable String filter) {
private List<String> getSuggestions(T sender, CommandNode<T> literal, @Nullable String filter) {
var stream = literal.getLiterals().stream()
.filter(lit -> lit.getPermission() != null && hasPermissionMethod.hasPermission(sender, lit.getPermission()))
.map(CommandNode::getNames)
@ -64,6 +62,6 @@ public class CommandHandler<T> {
if (filter != null)
stream = stream.filter(f -> f.toLowerCase().contains(filter.toLowerCase()));
return CompletableFuture.completedFuture(stream.toList());
return stream.toList();
}
}

View file

@ -6,5 +6,5 @@ import java.util.concurrent.CompletableFuture;
public interface CommandExecutor<T> {
CompletableFuture<Result<Void, String>> execute(CommandContext<T> ctx);
CompletableFuture<Result<Object, String>> execute(CommandContext<T> ctx);
}

View file

@ -0,0 +1,14 @@
package de.kentoj.kencommandapi.api.invocation;
import com.leakyabstractions.result.api.Result;
import java.util.concurrent.CompletableFuture;
public interface SyncCommandExecutor<T> extends CommandExecutor<T> {
Result<Object, String> executeSync(CommandContext<T> ctx);
default CompletableFuture<Result<Object, String>> execute(CommandContext<T> ctx) {
return CompletableFuture.completedFuture(this.executeSync(ctx));
}
}

View file

@ -108,7 +108,7 @@ public abstract sealed class ParseResult<T> permits ParseResult.IllegalArgument,
@Override
public String getMessage() {
return "Illegal argument '" + argStr + "' for " + argument.getId() + ":" + message;
return "Illegal argument '" + argStr + "' for " + argument.getId() + ": " + message;
}
}
}

View file

@ -7,7 +7,7 @@ import java.util.concurrent.CompletableFuture;
public class NoSuggestionProvider<T> implements SuggestionProvider<T> {
@Override
public CompletableFuture<List<String>> suggest(T __) {
return CompletableFuture.completedFuture(Collections.emptyList());
public List<String> suggest(T __) {
return Collections.emptyList();
}
}

View file

@ -8,5 +8,5 @@ public interface SuggestionProvider<T> {
/**
* @return an unfiltered(no permission checks or filtering by input) list of strings that may be used for the argument
*/
CompletableFuture<List<String>> suggest(T sender);
List<String> suggest(T sender);
}

View file

@ -44,7 +44,7 @@ public class CommandNodeImpl<T> implements CommandNode<T> {
if (isGreedy()) throw new IllegalStateException("can't add literal to a node with a greedy argument");
for (String name : commandNode.getNames())
if (getLiteral(name) != null)
throw new IllegalArgumentException("literal with same name is already exists");
throw new IllegalArgumentException("literal with same name already exists");
literals.add(commandNode);
}

View file

@ -22,7 +22,7 @@ public class CommandAPI {
public void register(RootCommandNode<CommandSource> rootNode) {
var cm = server.getCommandManager();
var meta = cm.metaBuilder(rootNode.getNames()[0])
.aliases(Arrays.copyOfRange(rootNode.getNames(), 1, rootNode.getNames().length - 1))
.aliases(Arrays.copyOfRange(rootNode.getNames(), 1, rootNode.getNames().length))
.build();
cm.register(meta, new VelocityCommand(commandHandler, rootNode));
}

View file

@ -7,7 +7,6 @@ import de.kentoj.kencommandapi.api.node.RootCommandNode;
import lombok.RequiredArgsConstructor;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@RequiredArgsConstructor
public class VelocityCommand implements SimpleCommand {
@ -27,7 +26,7 @@ public class VelocityCommand implements SimpleCommand {
}
@Override
public CompletableFuture<List<String>> suggestAsync(Invocation invocation) {
public List<String> suggest(Invocation invocation) {
return commandHandler.getSuggestions(rootNode, invocation.source(), invocation.arguments());
}
}

View file

@ -15,10 +15,9 @@ public class PlayerSuggestionProvider implements SuggestionProvider<CommandSourc
private final ProxyServer proxyServer;
@Override
public CompletableFuture<List<String>> suggest(CommandSource __) {
var list = proxyServer.getAllPlayers().stream()
public List<String> suggest(CommandSource __) {
return proxyServer.getAllPlayers().stream()
.map(Player::getUsername)
.toList();
return CompletableFuture.completedFuture(list);
}
}