diff --git a/src/main/java/net/pingex/dcf/permissions/PermissionsCommands.java b/src/main/java/net/pingex/dcf/permissions/PermissionsCommands.java index 322f23f..de35167 100644 --- a/src/main/java/net/pingex/dcf/permissions/PermissionsCommands.java +++ b/src/main/java/net/pingex/dcf/permissions/PermissionsCommands.java @@ -3,13 +3,13 @@ package net.pingex.dcf.permissions; import net.pingex.dcf.commands.Command; import net.pingex.dcf.commands.CommandRegistry; import net.pingex.dcf.commands.IWithCommands; +import net.pingex.dcf.util.ArgumentParser; import net.pingex.dcf.util.DiscordInteractionsUtil; import org.apache.commons.lang3.StringUtils; import sx.blah.discord.handle.impl.events.MessageReceivedEvent; import sx.blah.discord.handle.obj.IGuild; import sx.blah.discord.handle.obj.IRole; import sx.blah.discord.handle.obj.IUser; - import java.util.*; import java.util.regex.Pattern; @@ -22,17 +22,17 @@ public class PermissionsCommands implements IWithCommands public Set getCommands() { return new HashSet<>(Arrays.asList( - IsAllowedCommand + isAllowedCommand, setUser )); } - private static final Command IsAllowedCommand = - new Command.Builder("canRun") - .description("Tells whether target user is allowed to run the command.") - .enabled(true) - .usage("Command [verbose]") - .defaultPermission(DefaultPermission.BOT_OWNER) - .build(PermissionsCommands::isAllowedImpl); + private static final Command isAllowedCommand = + new Command.Builder("perm:canRun") + .description("Tells whether target user is allowed to run the command.") + .enabled(true) + .usage("Command [verbose]") + .defaultPermission(DefaultPermission.BOT_OWNER) + .build(PermissionsCommands::isAllowedImpl); private static Pattern usernamePattern = Pattern.compile("^.*#\\d{4}$"); private static Pattern idPattern = Pattern.compile("^\\d{18}$"); @@ -70,33 +70,25 @@ public class PermissionsCommands implements IWithCommands else target = uncheckedTarget.get(); // Argchk#2 - uid OR username#1234 OR "me" - if(idPattern.matcher(arguments.get(1)).matches()) // uid - { - userToLookup = event.getClient().getUserByID(arguments.get(1)); - } - else if(usernamePattern.matcher(arguments.get(1)).matches()) // username#1234 - { - for(IUser iUser : event.getClient().getUsers()) // Greedy - if(arguments.get(1).equalsIgnoreCase(iUser.getName() + "#" + iUser.getDiscriminator())) - { - userToLookup = iUser; - break; // Limit greediness - } - } - else if(arguments.get(1).equalsIgnoreCase("me")) // me - { + Optional uncheckedUser = Optional.empty(); + if(arguments.get(1).equalsIgnoreCase("me")) userToLookup = event.getMessage().getAuthor(); - } - else // ? - { - DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "Invalid arguments."); - return; - } - if(userToLookup == null) + else // Anything else + try + { + uncheckedUser = ArgumentParser.checkParseUsernameOrID(arguments.get(1), event.getClient()); + } + catch(ArgumentParser.ParserException e) + { + DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "Invalid arguments."); + return; + } + if(!uncheckedUser.isPresent()) { DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "User not found."); return; } + userToLookup = uncheckedUser.get(); // Argchk#3 - verbosity if(arguments.size() == 3) verbose = true; @@ -169,4 +161,91 @@ public class PermissionsCommands implements IWithCommands { return input != null ? (input ? "Grant" : "Deny") : "N/A"; } + + private static final Command setUser = + new Command.Builder("perm:setUser") + .description("Overrides an user's permission to run a command.") + .enabled(true) + .usage("Command ") + .defaultPermission(DefaultPermission.BOT_OWNER) + .build(PermissionsCommands::setUserImpl); + + private static void setUserImpl(MessageReceivedEvent event, List arguments) + { + // Parameters + IUser targetUser; + IGuild targetGuild = null; + Command targetCommand; + Boolean action; + ICommandPermissionsProvider provider = PermissionsHandler.getProvider(); + + // Argchk size + if(arguments.size() != 3 && arguments.size() != 4) + { + DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "Invalid arguments."); + return; + } + + // Argchk#1 Command + Optional uncheckedCommand = CommandRegistry.getCommandOrAliasByName(arguments.get(0)); + if(!uncheckedCommand.isPresent()) // Command existence + { + DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "Target command not found."); + return; + } + else targetCommand = uncheckedCommand.get(); + + // Argchk#2 User#Disc/UID + Optional uncheckedUser = Optional.empty(); + try + { + uncheckedUser = ArgumentParser.checkParseUsernameOrID(arguments.get(1), event.getClient()); + } + catch(ArgumentParser.ParserException e) + { + DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "Invalid arguments."); + return; + } + if(!uncheckedUser.isPresent()) + { + DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "User not found."); + return; + } + else targetUser = uncheckedUser.get(); + + // Argchk#3 Guild + if(arguments.get(2).equalsIgnoreCase("this")) targetGuild = event.getMessage().getGuild(); // this + else if(arguments.get(2).matches("^\\d{18}$")) targetGuild = event.getClient().getGuildByID(arguments.get(2)); // GID + else + for(IGuild i : event.getClient().getGuilds()) // Name + if(arguments.get(2).equalsIgnoreCase(i.getName())) + { + targetGuild = i; + break; + } + if(targetGuild == null && !arguments.get(2).equals("*")) // Global + { + DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "Guild not found."); + return; + } + + // Argchk#4 true/false/null + action = (Boolean) ArgumentParser.parse(Boolean.class, arguments.size() > 3 ? arguments.get(3) : null); + + // ======================================== + + StringBuilder builder = new StringBuilder("**Changes summary**\n"); + builder.append("```\n"); + builder.append("User: ").append(targetUser.getName()).append("#").append(targetUser.getDiscriminator()).append("\n"); + builder.append("UID: ").append(targetUser.getID()).append("\n"); + builder.append("Guild: ").append(targetGuild != null ? targetGuild.getName() : "[GLOBAL]").append("\n"); + builder.append("Guild ID: ").append(targetGuild != null ? targetGuild.getID() : "N/A").append("\n"); + builder.append("Command: ").append(targetCommand.getName()).append("\n"); + builder.append("New perm: ").append(booleanToString(action)).append("\n"); + builder.append("```\n"); + + provider.setUserPermission(targetGuild, targetUser, targetCommand, action); + builder.append("Changes OK"); + DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), builder.toString()); + } }