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 10 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());
}
} }