diff --git a/cloud-discord/cloud-javacord/src/main/java/cloud/commandframework/javacord/JavacordCommandManager.java b/cloud-discord/cloud-javacord/src/main/java/cloud/commandframework/javacord/JavacordCommandManager.java index 01c57035..66a06c0d 100644 --- a/cloud-discord/cloud-javacord/src/main/java/cloud/commandframework/javacord/JavacordCommandManager.java +++ b/cloud-discord/cloud-javacord/src/main/java/cloud/commandframework/javacord/JavacordCommandManager.java @@ -27,20 +27,26 @@ import cloud.commandframework.CommandManager; import cloud.commandframework.CommandTree; import cloud.commandframework.execution.CommandExecutionCoordinator; import cloud.commandframework.javacord.sender.JavacordCommandSender; +import cloud.commandframework.javacord.sender.JavacordServerSender; import cloud.commandframework.meta.SimpleCommandMeta; import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import org.javacord.api.DiscordApi; +import org.javacord.api.entity.permission.PermissionType; +import org.javacord.api.entity.user.User; +import java.util.Optional; +import java.util.function.BiFunction; import java.util.function.Function; public class JavacordCommandManager extends CommandManager { private final DiscordApi discordApi; - private final Function commandSenderMapper; - private final Function backwardsCommandSenderMapper; + private final Function<@NonNull JavacordCommandSender, @NonNull C> commandSenderMapper; + private final Function<@NonNull C, @NonNull JavacordCommandSender> backwardsCommandSenderMapper; - private final Function commandPrefixMapper; - private final Function commandPermissionMapper; + private final Function<@NonNull C, @NonNull String> commandPrefixMapper; + private final BiFunction<@NonNull C, @NonNull String, @NonNull Boolean> commandPermissionMapper; /** * Construct a new Javacord command manager @@ -57,10 +63,11 @@ public class JavacordCommandManager extends CommandManager { final @NonNull Function<@NonNull CommandTree, @NonNull CommandExecutionCoordinator> commandExecutionCoordinator, final @NonNull Function<@NonNull JavacordCommandSender, @NonNull C> commandSenderMapper, - @NonNull - final Function<@NonNull C, @NonNull JavacordCommandSender> backwardsCommandSenderMapper, + final @NonNull Function<@NonNull C, + @NonNull JavacordCommandSender> backwardsCommandSenderMapper, final @NonNull Function<@NonNull C, @NonNull String> commandPrefixMapper, - final @NonNull Function<@NonNull C, @NonNull Boolean> commandPermissionMapper) + final @Nullable BiFunction<@NonNull C, + @NonNull String, @NonNull Boolean> commandPermissionMapper) throws Exception { super(commandExecutionCoordinator, new JavacordRegistrationHandler<>()); ((JavacordRegistrationHandler) this.getCommandRegistrationHandler()).initialize(this); @@ -78,7 +85,23 @@ public class JavacordCommandManager extends CommandManager { if (permission.isEmpty()) { return true; } - return this.commandPermissionMapper.apply(sender); + + if (this.commandPermissionMapper != null) { + return this.commandPermissionMapper.apply(sender, permission); + } + + final JavacordCommandSender commandSender = this.backwardsCommandSenderMapper.apply(sender); + if (!(commandSender instanceof JavacordServerSender)) { + return false; + } + + final Optional authorOptional = commandSender.getAuthor().asUser(); + if (!authorOptional.isPresent()) { + return false; + } + + final JavacordServerSender serverSender = (JavacordServerSender) commandSender; + return serverSender.getServer().hasPermission(authorOptional.get(), PermissionType.valueOf(permission)); } @Override