|
|
|
@ -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<Command> 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("<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());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|