New permissions checking command
parent
56ca209148
commit
ee4e1e0c84
@ -0,0 +1,122 @@
|
||||
package net.pingex.dcf.commands.permissions;
|
||||
|
||||
import net.pingex.dcf.commands.Command;
|
||||
import net.pingex.dcf.commands.CommandRegistry;
|
||||
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.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.IUser;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Contains every command about the permissions system.
|
||||
*/
|
||||
public class PermissionsCommands implements IWithCommands
|
||||
{
|
||||
@Override
|
||||
public Set<Command> getCommands()
|
||||
{
|
||||
return new HashSet<>(Arrays.asList(
|
||||
permissionAudit
|
||||
));
|
||||
}
|
||||
|
||||
private static final Command permissionAudit = Command.builder("permissions:audit")
|
||||
.aliases("perm:audit", "auditperm")
|
||||
.description("Audits permissions status for an user to run a command.")
|
||||
.usage("<command> <user#disc|uid|me> [serverid]")
|
||||
.options(Collections.singleton(new DefaultPermissionOption(DefaultPermissionOption.Value.EVERYONE)))
|
||||
.build(PermissionsCommands::permissionAuditImpl);
|
||||
|
||||
private static void permissionAuditImpl(Context context)
|
||||
{
|
||||
// argchk#1 arg counts
|
||||
if(context.getArguments().size() != 2 && context.getArguments().size() != 3)
|
||||
{
|
||||
DiscordInteractionsUtil.sendMessage(context.getChannel(), "Invalid arguments.");
|
||||
return;
|
||||
}
|
||||
|
||||
// argchk#2 command
|
||||
Optional<Command> targetCommand = CommandRegistry.getCommandOrAliasByName(context.getArguments().get(0));
|
||||
if(!targetCommand.isPresent())
|
||||
{
|
||||
DiscordInteractionsUtil.sendMessage(context.getChannel(), "Target command not found.");
|
||||
return;
|
||||
}
|
||||
|
||||
// argchk#3 user
|
||||
Optional<IUser> targetUser;
|
||||
if(context.getArguments().get(1).equalsIgnoreCase("me")) targetUser = Optional.of(context.getUser());
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
targetUser = ArgumentParser.checkParseUsernameOrID(context.getArguments().get(1), context.getClient());
|
||||
}
|
||||
catch(ArgumentParser.ParserException e)
|
||||
{
|
||||
DiscordInteractionsUtil.sendMessage(context.getChannel(), "Invalid arguments.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!targetUser.isPresent())
|
||||
{
|
||||
DiscordInteractionsUtil.sendMessage(context.getChannel(), "Target user not found.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// argchk#4 serverid
|
||||
Optional<IGuild> targetGuild = Optional.empty();
|
||||
if(context.getArguments().size() == 3)
|
||||
{
|
||||
targetGuild = ArgumentParser.checkParseGuildOrID(context.getArguments().get(2), context.getClient());
|
||||
if(!targetGuild.isPresent())
|
||||
{
|
||||
DiscordInteractionsUtil.sendMessage(context.getChannel(), "Target guild not found.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Context parsedContext = new Context(targetCommand.get(), null, targetUser.get(), null, targetGuild.orElseGet(() -> null), context.getClient());
|
||||
AuditResult result = new PermissionCheck().doAudit(parsedContext);
|
||||
|
||||
StringBuilder sb = new StringBuilder()
|
||||
.append("**Permissions audit**\n")
|
||||
.append("```");
|
||||
|
||||
// Target infos
|
||||
sb.append("Target infos\n")
|
||||
.append("=> User: ").append(parsedContext.getUser().getName()).append("#").append(parsedContext.getUser().getDiscriminator()).append(" - ").append(parsedContext.getUser().getID()).append("\n")
|
||||
.append("=> Command: ").append(parsedContext.getCommand().getName()).append(" (").append(parsedContext.getCommand().getDescription()).append(")").append("\n")
|
||||
.append("=> Guild: ");
|
||||
if(parsedContext.getGuild() == null) sb.append("N/A");
|
||||
else sb.append(parsedContext.getGuild().getName()).append(" - ").append(parsedContext.getGuild().getID());
|
||||
sb.append("\n\n");
|
||||
|
||||
// Result
|
||||
sb.append("Audit Results\n")
|
||||
.append("=> OPCode: ").append(result.getOpcode()).append("\n")
|
||||
.append("=> Message: ").append(result.getMessage() != null ? result.getMessage() : "N/A").append("\n\n");
|
||||
|
||||
// Walkthrough
|
||||
sb.append("Walkthrough\n");
|
||||
int maxPadding = result.getSubAuditsResults().stream().max(Comparator.comparingInt(i -> i.getKey().name().length())).get().getKey().name().length()+2;
|
||||
for(Map.Entry<IAuditComponentProvider, AuditResult> i : result.getSubAuditsResults())
|
||||
{
|
||||
sb.append("=> ").append(StringUtils.rightPad(i.getKey().name() + ":", maxPadding))
|
||||
.append(i.getValue().getOpcode()).append(" - ")
|
||||
.append(i.getValue().getMessage() != null ? i.getValue().getMessage() : "N/A")
|
||||
.append("\n");
|
||||
}
|
||||
|
||||
sb.append("```");
|
||||
DiscordInteractionsUtil.sendMessage(context.getChannel(), sb.toString());
|
||||
}
|
||||
}
|
Reference in New Issue