✨ Try to preserve command sender when getting Brigadier suggestions
This commit is contained in:
parent
ded94567c6
commit
070a719165
5 changed files with 55 additions and 3 deletions
|
|
@ -60,6 +60,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
### Fixed
|
### Fixed
|
||||||
- Fix arguments with no required children not being executors (cloud-brigadier)
|
- Fix arguments with no required children not being executors (cloud-brigadier)
|
||||||
- Detect and throw an exception for ambiguous nodes in more cases
|
- Detect and throw an exception for ambiguous nodes in more cases
|
||||||
|
- CloudBrigadierManager no longer forgets the command sender
|
||||||
|
|
||||||
## [1.0.2] - 2020-10-18
|
## [1.0.2] - 2020-10-18
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -87,6 +87,7 @@ public final class CloudBrigadierManager<C, S> {
|
||||||
private final Map<@NonNull Class<?>, @NonNull Supplier<@Nullable ArgumentType<?>>> defaultArgumentTypeSuppliers;
|
private final Map<@NonNull Class<?>, @NonNull Supplier<@Nullable ArgumentType<?>>> defaultArgumentTypeSuppliers;
|
||||||
private final Supplier<CommandContext<C>> dummyContextProvider;
|
private final Supplier<CommandContext<C>> dummyContextProvider;
|
||||||
private final CommandManager<C> commandManager;
|
private final CommandManager<C> commandManager;
|
||||||
|
private Function<S, C> brigadierCommandSenderMapper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new cloud brigadier manager
|
* Create a new cloud brigadier manager
|
||||||
|
|
@ -192,6 +193,28 @@ public final class CloudBrigadierManager<C, S> {
|
||||||
}, false, argument -> StringArgumentType.greedyString());
|
}, 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.
|
* Set whether to use Brigadier's native suggestions for number argument types.
|
||||||
* <p>
|
* <p>
|
||||||
|
|
@ -346,7 +369,11 @@ public final class CloudBrigadierManager<C, S> {
|
||||||
) {
|
) {
|
||||||
final CommandTree.Node<CommandArgument<C, ?>> node = this.commandManager
|
final CommandTree.Node<CommandArgument<C, ?>> node = this.commandManager
|
||||||
.getCommandTree().getNamedNode(cloudCommand.getArguments().get(0).getName());
|
.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
|
final LiteralArgumentBuilder<S> literalArgumentBuilder = LiteralArgumentBuilder
|
||||||
.<S>literal(label)
|
.<S>literal(label)
|
||||||
.requires(sender -> permissionChecker.test(sender, (CommandPermission) node.getNodeMeta()
|
.requires(sender -> permissionChecker.test(sender, (CommandPermission) node.getNodeMeta()
|
||||||
|
|
@ -477,7 +504,9 @@ public final class CloudBrigadierManager<C, S> {
|
||||||
);
|
);
|
||||||
final SuggestionProvider<S> provider = pair.getSecond()
|
final SuggestionProvider<S> provider = pair.getSecond()
|
||||||
? null
|
? null
|
||||||
: (context, builder) -> this.buildSuggestions(root.getValue(),
|
: (context, builder) -> this.buildSuggestions(
|
||||||
|
context,
|
||||||
|
root.getValue(),
|
||||||
builder
|
builder
|
||||||
);
|
);
|
||||||
argumentBuilder = RequiredArgumentBuilder
|
argumentBuilder = RequiredArgumentBuilder
|
||||||
|
|
@ -505,10 +534,21 @@ public final class CloudBrigadierManager<C, S> {
|
||||||
}
|
}
|
||||||
|
|
||||||
private @NonNull CompletableFuture<Suggestions> buildSuggestions(
|
private @NonNull CompletableFuture<Suggestions> buildSuggestions(
|
||||||
|
final com.mojang.brigadier.context.@Nullable CommandContext<S> senderContext,
|
||||||
final @NonNull CommandArgument<C, ?> argument,
|
final @NonNull CommandArgument<C, ?> argument,
|
||||||
final @NonNull SuggestionsBuilder builder
|
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();
|
String command = builder.getInput();
|
||||||
if (command.startsWith("/") /* Minecraft specific */) {
|
if (command.startsWith("/") /* Minecraft specific */) {
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,11 @@ class CloudCommodoreManager<C> extends BukkitPluginRegistrationHandler<C> {
|
||||||
commandManager.getCommandSenderMapper().apply(Bukkit.getConsoleSender()),
|
commandManager.getCommandSenderMapper().apply(Bukkit.getConsoleSender()),
|
||||||
commandManager.getCaptionRegistry()
|
commandManager.getCaptionRegistry()
|
||||||
));
|
));
|
||||||
|
this.brigadierManager.brigadierSenderMapper(
|
||||||
|
sender -> this.commandManager.getCommandSenderMapper().apply(
|
||||||
|
commodore.getBukkitSender(sender)
|
||||||
|
)
|
||||||
|
);
|
||||||
new BukkitBrigadierMapper<>(this.commandManager, this.brigadierManager);
|
new BukkitBrigadierMapper<>(this.commandManager, this.brigadierManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,9 @@ class PaperBrigadierListener<C> implements Listener {
|
||||||
this.paperCommandManager.getCaptionRegistry()
|
this.paperCommandManager.getCaptionRegistry()
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
this.brigadierManager.brigadierSenderMapper(
|
||||||
|
sender -> this.paperCommandManager.getCommandSenderMapper().apply(sender.getBukkitSender())
|
||||||
|
);
|
||||||
new BukkitBrigadierMapper<>(this.paperCommandManager, this.brigadierManager);
|
new BukkitBrigadierMapper<>(this.paperCommandManager, this.brigadierManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,9 @@ final class VelocityPluginRegistrationHandler<C> implements CommandRegistrationH
|
||||||
velocityCommandManager.getCaptionRegistry()
|
velocityCommandManager.getCaptionRegistry()
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
this.brigadierManager.brigadierSenderMapper(
|
||||||
|
sender -> this.manager.getCommandSenderMapper().apply(sender)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue