From 561828f223b8ce579be2962a3a75cb6f2c68fe02 Mon Sep 17 00:00:00 2001 From: Pingex Date: Sun, 15 Jan 2017 23:41:38 +0100 Subject: [PATCH] Set user & set role permission commands. Permissions setting are only available for the current guild, as it may compromise other's guild permissions if messed up with. --- .../permissions/PermissionsCommands.java | 143 +++++++++++++++++- 1 file changed, 142 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/pingex/dcf/commands/permissions/PermissionsCommands.java b/src/main/java/net/pingex/dcf/commands/permissions/PermissionsCommands.java index 58ccc3f..94ecb06 100644 --- a/src/main/java/net/pingex/dcf/commands/permissions/PermissionsCommands.java +++ b/src/main/java/net/pingex/dcf/commands/permissions/PermissionsCommands.java @@ -6,10 +6,12 @@ import net.pingex.dcf.commands.Context; import net.pingex.dcf.commands.IWithCommands; import net.pingex.dcf.commands.audit.AuditResult; import net.pingex.dcf.commands.audit.IAuditComponentProvider; +import net.pingex.dcf.commands.options.ScopeOption; import net.pingex.dcf.util.ArgumentParser; import net.pingex.dcf.util.DiscordInteractionsUtil; import org.apache.commons.lang3.StringUtils; import sx.blah.discord.handle.obj.IGuild; +import sx.blah.discord.handle.obj.IRole; import sx.blah.discord.handle.obj.IUser; import java.util.*; @@ -22,10 +24,20 @@ public class PermissionsCommands implements IWithCommands public Set getCommands() { return new HashSet<>(Arrays.asList( - permissionAudit + permissionAudit, setUser, setRole )); } + /** + * Quick helper function to convert a bool to a String. + * @param input Input boolean, can be `null` + * @return "PASS" => `true`, "FAIL" => `false`, "NOOP" => `null` + */ + private static String booleanToString(Boolean input) + { + return input != null ? (input ? "PASS" : "FAIL") : "NOOP"; + } + private static final Command permissionAudit = Command.builder("permissions:audit") .aliases("perm:audit", "auditperm") .description("Audits permissions status for an user to run a command.") @@ -119,4 +131,133 @@ public class PermissionsCommands implements IWithCommands sb.append("```"); DiscordInteractionsUtil.sendMessage(context.getChannel(), sb.toString()); } + + private static final Command setUser = Command.builder("permissions:setUser") + .aliases("perm:setuser", "setuserperm") + .description("Sets an user's permission to run a command.") + .usage(" ") + .options(Collections.singleton(new DefaultPermissionOption(DefaultPermissionOption.Value.ANY_OWNER))) + .build(PermissionsCommands::setUserImpl); + + private static void setUserImpl(Context context) + { + // argchk#1 count + if(context.getArguments().size() != 3) + { + DiscordInteractionsUtil.sendMessage(context.getChannel(), "Invalid arguments."); + return; + } + + // argchk#2 command + Optional optionalCommand = CommandRegistry.getCommandOrAliasByName(context.getArguments().get(0)); + if(!optionalCommand.isPresent()) + { + DiscordInteractionsUtil.sendMessage(context.getChannel(), "Target command not found."); + return; + } + Command targetCommand = optionalCommand.get(); + + // argchk#3 user + Optional optionalUser; + try + { + optionalUser = ArgumentParser.checkParseUsernameOrID(context.getArguments().get(1), context.getClient()); + } + catch(ArgumentParser.ParserException e) + { + DiscordInteractionsUtil.sendMessage(context.getChannel(), "Invalid arguments."); + return; + } + if(!optionalUser.isPresent()) + { + DiscordInteractionsUtil.sendMessage(context.getChannel(), "Target user not found."); + return; + } + IUser targetUser = optionalUser.get(); + + // argchk#4 target + Boolean targetAction = (Boolean) ArgumentParser.parse(Boolean.class, context.getArguments().get(2)); + + // Arg: Guild + IGuild targetGuild = context.getGuild(); + + // Operation + Boolean oldPermission = PermissionCheck.getProvider().validateUser(targetGuild, targetUser, targetCommand); + PermissionCheck.getProvider().setUserPermission(targetGuild, targetUser, targetCommand, targetAction); + Boolean newPermission = PermissionCheck.getProvider().validateUser(targetGuild, targetUser, targetCommand); + + // Output + StringBuilder sb = new StringBuilder("**Permissions changes**\n").append("```\n"); + sb.append("Target infos\n") + .append("=> User: ").append(targetUser.getName()).append("#").append(targetUser.getDiscriminator()).append(" - ").append(targetUser.getID()).append("\n") + .append("=> Command: ").append(targetCommand.getName()).append(" (").append(targetCommand.getDescription()).append(")").append("\n") + .append("=> Guild: "); + if(targetGuild == null) sb.append("[Global]"); + else sb.append(targetGuild.getName()).append(" - ").append(targetGuild.getID()); + sb.append("\n\n"); + sb.append("Permissions\n") + .append("=> Old permission: ").append(booleanToString(oldPermission)).append("\n") + .append("=> New permission: ").append(booleanToString(newPermission)).append("\n"); + sb.append("```"); + DiscordInteractionsUtil.sendMessage(context.getChannel(), sb.toString()); + } + + private static final Command setRole = Command.builder("permissions:setRole") + .aliases("perm:setrole", "setroleperm") + .description("Sets a role's permission to run a command.") + .usage(" ") + .options(new HashSet<>(Arrays.asList( + new DefaultPermissionOption(DefaultPermissionOption.Value.ANY_OWNER), + new ScopeOption(ScopeOption.CommandScope.GUILD_CHAT)))) + .build(PermissionsCommands::setRoleImpl); + + private static void setRoleImpl(Context context) + { + // argchk#1 count + if(context.getArguments().size() != 3) + { + DiscordInteractionsUtil.sendMessage(context.getChannel(), "Invalid arguments."); + return; + } + + // argchk#2 command + Optional optionalCommand = CommandRegistry.getCommandOrAliasByName(context.getArguments().get(0)); + if(!optionalCommand.isPresent()) + { + DiscordInteractionsUtil.sendMessage(context.getChannel(), "Target command not found."); + return; + } + Command targetCommand = optionalCommand.get(); + + // argchk#3 role + Optional optionalRole; + optionalRole = ArgumentParser.checkParseRoleOrID(context.getArguments().get(1), context.getGuild()); + if(!optionalRole.isPresent()) + { + DiscordInteractionsUtil.sendMessage(context.getChannel(), "Target role not found."); + return; + } + IRole targetRole = optionalRole.get(); + + // argchk#4 target + Boolean targetAction = (Boolean) ArgumentParser.parse(Boolean.class, context.getArguments().get(2)); + + // Operation + Boolean oldPermission = PermissionCheck.getProvider().validateGroup(targetRole, targetCommand); + PermissionCheck.getProvider().setGroupPermissions(targetRole, targetCommand, targetAction); + Boolean newPermission = PermissionCheck.getProvider().validateGroup(targetRole, targetCommand); + + // Output + StringBuilder sb = new StringBuilder("**Permissions changes**\n").append("```\n"); + sb.append("Target infos\n") + .append("=> Role: ").append(targetRole.getName()).append(" - ").append(targetRole.getID()).append("\n") + .append("=> Command: ").append(targetCommand.getName()).append(" (").append(targetCommand.getDescription()).append(")").append("\n") + .append("=> Guild: ").append(targetRole.getGuild().getName()).append(" - ").append(targetRole.getGuild().getID());; + sb.append("\n\n"); + sb.append("Permissions\n") + .append("=> Old permission: ").append(booleanToString(oldPermission)).append("\n") + .append("=> New permission: ").append(booleanToString(newPermission)).append("\n"); + sb.append("```"); + DiscordInteractionsUtil.sendMessage(context.getChannel(), sb.toString()); + } }