Try to preserve command sender when getting Brigadier suggestions

This commit is contained in:
Alexander Söderberg 2020-12-03 12:29:06 +01:00 committed by Alexander Söderberg
parent ded94567c6
commit 070a719165
5 changed files with 55 additions and 3 deletions

View file

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

View file

@ -87,6 +87,7 @@ public final class CloudBrigadierManager<C, S> {
private final Map<@NonNull Class<?>, @NonNull Supplier<@Nullable ArgumentType<?>>> defaultArgumentTypeSuppliers;
private final Supplier<CommandContext<C>> dummyContextProvider;
private final CommandManager<C> commandManager;
private Function<S, C> brigadierCommandSenderMapper;
/**
* Create a new cloud brigadier manager
@ -192,6 +193,28 @@ public final class CloudBrigadierManager<C, S> {
}, 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.
* <p>
@ -346,7 +369,11 @@ public final class CloudBrigadierManager<C, S> {
) {
final CommandTree.Node<CommandArgument<C, ?>> node = this.commandManager
.getCommandTree().getNamedNode(cloudCommand.getArguments().get(0).getName());
final SuggestionProvider<S> provider = (context, builder) -> this.buildSuggestions(node.getValue(), builder);
final SuggestionProvider<S> provider = (context, builder) -> this.buildSuggestions(
context,
node.getValue(),
builder
);
final LiteralArgumentBuilder<S> literalArgumentBuilder = LiteralArgumentBuilder
.<S>literal(label)
.requires(sender -> permissionChecker.test(sender, (CommandPermission) node.getNodeMeta()
@ -477,7 +504,9 @@ public final class CloudBrigadierManager<C, S> {
);
final SuggestionProvider<S> 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<C, S> {
}
private @NonNull CompletableFuture<Suggestions> buildSuggestions(
final com.mojang.brigadier.context.@Nullable CommandContext<S> senderContext,
final @NonNull CommandArgument<C, ?> argument,
final @NonNull SuggestionsBuilder builder
) {
final CommandContext<C> commandContext = this.dummyContextProvider.get();
final CommandContext<C> 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 */) {

View file

@ -58,6 +58,11 @@ class CloudCommodoreManager<C> extends BukkitPluginRegistrationHandler<C> {
commandManager.getCommandSenderMapper().apply(Bukkit.getConsoleSender()),
commandManager.getCaptionRegistry()
));
this.brigadierManager.brigadierSenderMapper(
sender -> this.commandManager.getCommandSenderMapper().apply(
commodore.getBukkitSender(sender)
)
);
new BukkitBrigadierMapper<>(this.commandManager, this.brigadierManager);
}

View file

@ -54,6 +54,9 @@ class PaperBrigadierListener<C> implements Listener {
this.paperCommandManager.getCaptionRegistry()
)
);
this.brigadierManager.brigadierSenderMapper(
sender -> this.paperCommandManager.getCommandSenderMapper().apply(sender.getBukkitSender())
);
new BukkitBrigadierMapper<>(this.paperCommandManager, this.brigadierManager);
}

View file

@ -52,6 +52,9 @@ final class VelocityPluginRegistrationHandler<C> implements CommandRegistrationH
velocityCommandManager.getCaptionRegistry()
)
);
this.brigadierManager.brigadierSenderMapper(
sender -> this.manager.getCommandSenderMapper().apply(sender)
);
}
@Override