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.
master
Pingex aka Raphaël 9 years ago
parent 00d4961819
commit 561828f223

@ -6,10 +6,12 @@ import net.pingex.dcf.commands.Context;
import net.pingex.dcf.commands.IWithCommands; import net.pingex.dcf.commands.IWithCommands;
import net.pingex.dcf.commands.audit.AuditResult; import net.pingex.dcf.commands.audit.AuditResult;
import net.pingex.dcf.commands.audit.IAuditComponentProvider; 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.ArgumentParser;
import net.pingex.dcf.util.DiscordInteractionsUtil; import net.pingex.dcf.util.DiscordInteractionsUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import sx.blah.discord.handle.obj.IGuild; import sx.blah.discord.handle.obj.IGuild;
import sx.blah.discord.handle.obj.IRole;
import sx.blah.discord.handle.obj.IUser; import sx.blah.discord.handle.obj.IUser;
import java.util.*; import java.util.*;
@ -22,10 +24,20 @@ public class PermissionsCommands implements IWithCommands
public Set<Command> getCommands() public Set<Command> getCommands()
{ {
return new HashSet<>(Arrays.asList( 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") private static final Command permissionAudit = Command.builder("permissions:audit")
.aliases("perm:audit", "auditperm") .aliases("perm:audit", "auditperm")
.description("Audits permissions status for an user to run a command.") .description("Audits permissions status for an user to run a command.")
@ -119,4 +131,133 @@ public class PermissionsCommands implements IWithCommands
sb.append("```"); sb.append("```");
DiscordInteractionsUtil.sendMessage(context.getChannel(), sb.toString()); 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("<command> <user#disc|uid> <true|false|null>")
.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<Command> 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<IUser> 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("<command> <rolename|rid> <true|false|null>")
.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<Command> 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<IRole> 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());
}
} }