Replace command permissions with a new smarter permission system that allows for compound permissions

This commit is contained in:
Alexander Söderberg 2020-09-24 23:18:22 +02:00 committed by Alexander Söderberg
parent ce2fbe9746
commit e8a1a9a6cf
15 changed files with 455 additions and 41 deletions

View file

@ -40,6 +40,8 @@ import com.intellectualsites.commands.arguments.standard.ShortArgument;
import com.intellectualsites.commands.arguments.standard.StringArgument;
import com.intellectualsites.commands.context.CommandContext;
import com.intellectualsites.commands.execution.preprocessor.CommandPreprocessingContext;
import com.intellectualsites.commands.permission.CommandPermission;
import com.intellectualsites.commands.permission.Permission;
import com.mojang.brigadier.LiteralMessage;
import com.mojang.brigadier.arguments.ArgumentType;
import com.mojang.brigadier.arguments.BoolArgumentType;
@ -243,14 +245,15 @@ public final class CloudBrigadierManager<C, S> {
*/
public LiteralCommandNode<S> createLiteralCommandNode(@Nonnull final String label,
@Nonnull final Command<C> cloudCommand,
@Nonnull final BiPredicate<S, String> permissionChecker,
@Nonnull final BiPredicate<S, CommandPermission> permissionChecker,
@Nonnull final com.mojang.brigadier.Command<S> executor) {
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(), context, builder);
final LiteralArgumentBuilder<S> literalArgumentBuilder = LiteralArgumentBuilder
.<S>literal(label)
.requires(sender -> permissionChecker.test(sender, node.getNodeMeta().getOrDefault("permission", "")));
.requires(sender -> permissionChecker.test(sender, (CommandPermission) node.getNodeMeta()
.getOrDefault("permission", Permission.empty())));
literalArgumentBuilder.executes(executor);
final LiteralCommandNode<S> constructedRoot = literalArgumentBuilder.build();
for (final CommandTree.Node<CommandArgument<C, ?>> child : node.getChildren()) {
@ -275,9 +278,10 @@ public final class CloudBrigadierManager<C, S> {
@Nonnull final LiteralCommandNode<S> root,
@Nonnull final SuggestionProvider<S> suggestionProvider,
@Nonnull final com.mojang.brigadier.Command<S> executor,
@Nonnull final BiPredicate<S, String> permissionChecker) {
@Nonnull final BiPredicate<S, CommandPermission> permissionChecker) {
final LiteralArgumentBuilder<S> literalArgumentBuilder = LiteralArgumentBuilder.<S>literal(root.getLiteral())
.requires(sender -> permissionChecker.test(sender, cloudCommand.getNodeMeta().getOrDefault("permission", "")));
.requires(sender -> permissionChecker.test(sender, (CommandPermission) cloudCommand.getNodeMeta()
.getOrDefault("permission", Permission.empty())));
if (cloudCommand.isLeaf() && cloudCommand.getValue() != null) {
literalArgumentBuilder.executes(executor);
}
@ -291,14 +295,15 @@ public final class CloudBrigadierManager<C, S> {
private ArgumentBuilder<S, ?> constructCommandNode(final boolean forceExecutor,
@Nonnull final CommandTree.Node<CommandArgument<C, ?>> root,
@Nonnull final BiPredicate<S, String> permissionChecker,
@Nonnull final BiPredicate<S, CommandPermission> permissionChecker,
@Nonnull final com.mojang.brigadier.Command<S> executor,
@Nonnull final SuggestionProvider<S> suggestionProvider) {
ArgumentBuilder<S, ?> argumentBuilder;
if (root.getValue() instanceof StaticArgument) {
argumentBuilder = LiteralArgumentBuilder.<S>literal(root.getValue().getName())
.requires(sender -> permissionChecker.test(sender, root.getNodeMeta().getOrDefault("permission", "")))
.requires(sender -> permissionChecker.test(sender, (CommandPermission) root.getNodeMeta()
.getOrDefault("permission", Permission.empty())))
.executes(executor);
} else {
final Pair<ArgumentType<?>, Boolean> pair = this.getArgument(root.getValue().getValueType(),
@ -308,7 +313,8 @@ public final class CloudBrigadierManager<C, S> {
argumentBuilder = RequiredArgumentBuilder
.<S, Object>argument(root.getValue().getName(), (ArgumentType<Object>) pair.getLeft())
.suggests(provider)
.requires(sender -> permissionChecker.test(sender, root.getNodeMeta().getOrDefault("permission", "")));
.requires(sender -> permissionChecker.test(sender, (CommandPermission) root.getNodeMeta()
.getOrDefault("permission", Permission.empty())));
}
if (forceExecutor || root.isLeaf() || !root.getValue().isRequired()) {
argumentBuilder.executes(executor);

View file

@ -152,7 +152,7 @@ final class BukkitCommand<C> extends org.bukkit.command.Command implements Plugi
@Override
public String getPermission() {
return this.cloudCommand.getCommandPermission();
return this.cloudCommand.getCommandPermission().toString();
}
}

View file

@ -57,6 +57,7 @@ class CloudCommodoreManager<C> extends BukkitPluginRegistrationHandler<C> {
final com.mojang.brigadier.Command<?> cmd = o -> 1;
final LiteralCommandNode<?> literalCommandNode = this.brigadierManager
.createLiteralCommandNode(label, command, (o, p) -> true, cmd);
this.commodore.register(bukkitCommand, literalCommandNode, p -> p.hasPermission(command.getCommandPermission()));
this.commodore.register(bukkitCommand, literalCommandNode, p ->
p.hasPermission(command.getCommandPermission().toString()));
}
}

View file

@ -55,7 +55,7 @@ public final class BungeeCommand<C> extends Command implements TabExecutor {
@Nonnull final CommandArgument<C, ?> command,
@Nonnull final BungeeCommandManager<C> manager) {
super(command.getName(),
cloudCommand.getCommandPermission(),
cloudCommand.getCommandPermission().toString(),
((StaticArgument<C>) command).getAlternativeAliases().toArray(new String[0]));
this.command = command;
this.manager = manager;

View file

@ -56,7 +56,7 @@ final class CloudburstCommand<C> extends PluginCommand<Plugin> {
@Nonnull final CloudburstCommandManager<C> manager) {
super(manager.getOwningPlugin(), CommandData.builder(label)
.addAliases(aliases.toArray(new String[0]))
.addPermission(cloudCommand.getCommandPermission())
.addPermission(cloudCommand.getCommandPermission().toString())
.setDescription(cloudCommand.getCommandMeta().getOrDefault("description", ""))
.build());
this.command = command;

View file

@ -128,8 +128,8 @@ class PaperBrigadierListener<C> implements Listener {
event.getLiteral(),
event.getBrigadierCommand(),
event.getBrigadierCommand(),
(s, p) -> p.isEmpty()
|| s.getBukkitSender().hasPermission(p)));
(s, p) -> p.toString().isEmpty()
|| s.getBukkitSender().hasPermission(p.toString())));
}
}