diff --git a/CHANGELOG.md b/CHANGELOG.md index cdd4e483..366a5d0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fix arguments with no required children not being executors (cloud-brigadier) - Detect and throw an exception for ambiguous nodes in more cases + - CloudBrigadierManager no longer forgets the command sender ## [1.0.2] - 2020-10-18 diff --git a/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java b/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java index f4000a64..6997eb92 100644 --- a/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java +++ b/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java @@ -87,6 +87,7 @@ public final class CloudBrigadierManager { private final Map<@NonNull Class, @NonNull Supplier<@Nullable ArgumentType>> defaultArgumentTypeSuppliers; private final Supplier> dummyContextProvider; private final CommandManager commandManager; + private Function brigadierCommandSenderMapper; /** * Create a new cloud brigadier manager @@ -192,6 +193,28 @@ public final class CloudBrigadierManager { }, false, argument -> StringArgumentType.greedyString()); } + /** + * Set the mapper between the Brigadier command sender type and the Cloud command sender type + * + * @param mapper Mapper + * @since 1.2.0 + */ + public void brigadierSenderMapper( + final @NonNull Function<@NonNull S, @Nullable C> mapper + ) { + this.brigadierCommandSenderMapper = mapper; + } + + /** + * Get the mapper between Brigadier and Cloud command senders, if one exists + * + * @return Mapper + * @since 1.2.0 + */ + public @Nullable Function<@NonNull S, @Nullable C> brigadierSenderMapper() { + return this.brigadierCommandSenderMapper; + } + /** * Set whether to use Brigadier's native suggestions for number argument types. *

@@ -346,7 +369,11 @@ public final class CloudBrigadierManager { ) { final CommandTree.Node> node = this.commandManager .getCommandTree().getNamedNode(cloudCommand.getArguments().get(0).getName()); - final SuggestionProvider provider = (context, builder) -> this.buildSuggestions(node.getValue(), builder); + final SuggestionProvider provider = (context, builder) -> this.buildSuggestions( + context, + node.getValue(), + builder + ); final LiteralArgumentBuilder literalArgumentBuilder = LiteralArgumentBuilder .literal(label) .requires(sender -> permissionChecker.test(sender, (CommandPermission) node.getNodeMeta() @@ -477,7 +504,9 @@ public final class CloudBrigadierManager { ); final SuggestionProvider provider = pair.getSecond() ? null - : (context, builder) -> this.buildSuggestions(root.getValue(), + : (context, builder) -> this.buildSuggestions( + context, + root.getValue(), builder ); argumentBuilder = RequiredArgumentBuilder @@ -505,10 +534,21 @@ public final class CloudBrigadierManager { } private @NonNull CompletableFuture buildSuggestions( + final com.mojang.brigadier.context.@Nullable CommandContext senderContext, final @NonNull CommandArgument argument, final @NonNull SuggestionsBuilder builder ) { - final CommandContext commandContext = this.dummyContextProvider.get(); + final CommandContext commandContext; + if (this.brigadierCommandSenderMapper == null || senderContext == null) { + commandContext = this.dummyContextProvider.get(); + } else { + final C cloudSender = this.brigadierCommandSenderMapper.apply(senderContext.getSource()); + commandContext = new CommandContext<>( + true, + cloudSender, + this.commandManager.getCaptionRegistry() + ); + } String command = builder.getInput(); if (command.startsWith("/") /* Minecraft specific */) { diff --git a/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/CloudCommodoreManager.java b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/CloudCommodoreManager.java index 0aa203c6..559404e6 100644 --- a/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/CloudCommodoreManager.java +++ b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/CloudCommodoreManager.java @@ -58,6 +58,11 @@ class CloudCommodoreManager extends BukkitPluginRegistrationHandler { commandManager.getCommandSenderMapper().apply(Bukkit.getConsoleSender()), commandManager.getCaptionRegistry() )); + this.brigadierManager.brigadierSenderMapper( + sender -> this.commandManager.getCommandSenderMapper().apply( + commodore.getBukkitSender(sender) + ) + ); new BukkitBrigadierMapper<>(this.commandManager, this.brigadierManager); } diff --git a/cloud-minecraft/cloud-paper/src/main/java/cloud/commandframework/paper/PaperBrigadierListener.java b/cloud-minecraft/cloud-paper/src/main/java/cloud/commandframework/paper/PaperBrigadierListener.java index 734e86d6..212afdde 100644 --- a/cloud-minecraft/cloud-paper/src/main/java/cloud/commandframework/paper/PaperBrigadierListener.java +++ b/cloud-minecraft/cloud-paper/src/main/java/cloud/commandframework/paper/PaperBrigadierListener.java @@ -54,6 +54,9 @@ class PaperBrigadierListener implements Listener { this.paperCommandManager.getCaptionRegistry() ) ); + this.brigadierManager.brigadierSenderMapper( + sender -> this.paperCommandManager.getCommandSenderMapper().apply(sender.getBukkitSender()) + ); new BukkitBrigadierMapper<>(this.paperCommandManager, this.brigadierManager); } diff --git a/cloud-minecraft/cloud-velocity/src/main/java/cloud/commandframework/velocity/VelocityPluginRegistrationHandler.java b/cloud-minecraft/cloud-velocity/src/main/java/cloud/commandframework/velocity/VelocityPluginRegistrationHandler.java index 93457322..d0c10278 100644 --- a/cloud-minecraft/cloud-velocity/src/main/java/cloud/commandframework/velocity/VelocityPluginRegistrationHandler.java +++ b/cloud-minecraft/cloud-velocity/src/main/java/cloud/commandframework/velocity/VelocityPluginRegistrationHandler.java @@ -52,6 +52,9 @@ final class VelocityPluginRegistrationHandler implements CommandRegistrationH velocityCommandManager.getCaptionRegistry() ) ); + this.brigadierManager.brigadierSenderMapper( + sender -> this.manager.getCommandSenderMapper().apply(sender) + ); } @Override