|
|
|
@ -3,13 +3,13 @@ package net.pingex.dcf.permissions;
|
|
|
|
|
import net.pingex.dcf.commands.Command;
|
|
|
|
|
import net.pingex.dcf.commands.CommandRegistry;
|
|
|
|
|
import net.pingex.dcf.commands.IWithCommands;
|
|
|
|
|
import net.pingex.dcf.util.ArgumentParser;
|
|
|
|
|
import net.pingex.dcf.util.DiscordInteractionsUtil;
|
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
import sx.blah.discord.handle.impl.events.MessageReceivedEvent;
|
|
|
|
|
import sx.blah.discord.handle.obj.IGuild;
|
|
|
|
|
import sx.blah.discord.handle.obj.IRole;
|
|
|
|
|
import sx.blah.discord.handle.obj.IUser;
|
|
|
|
|
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
|
|
|
@ -22,17 +22,17 @@ public class PermissionsCommands implements IWithCommands
|
|
|
|
|
public Set<Command> getCommands()
|
|
|
|
|
{
|
|
|
|
|
return new HashSet<>(Arrays.asList(
|
|
|
|
|
IsAllowedCommand
|
|
|
|
|
isAllowedCommand, setUser
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static final Command IsAllowedCommand =
|
|
|
|
|
new Command.Builder("canRun")
|
|
|
|
|
.description("Tells whether target user is allowed to run the command.")
|
|
|
|
|
.enabled(true)
|
|
|
|
|
.usage("Command <User#Disc|ID> [verbose]")
|
|
|
|
|
.defaultPermission(DefaultPermission.BOT_OWNER)
|
|
|
|
|
.build(PermissionsCommands::isAllowedImpl);
|
|
|
|
|
private static final Command isAllowedCommand =
|
|
|
|
|
new Command.Builder("perm:canRun")
|
|
|
|
|
.description("Tells whether target user is allowed to run the command.")
|
|
|
|
|
.enabled(true)
|
|
|
|
|
.usage("Command <User#Disc|ID|me> [verbose]")
|
|
|
|
|
.defaultPermission(DefaultPermission.BOT_OWNER)
|
|
|
|
|
.build(PermissionsCommands::isAllowedImpl);
|
|
|
|
|
|
|
|
|
|
private static Pattern usernamePattern = Pattern.compile("^.*#\\d{4}$");
|
|
|
|
|
private static Pattern idPattern = Pattern.compile("^\\d{18}$");
|
|
|
|
@ -70,33 +70,25 @@ public class PermissionsCommands implements IWithCommands
|
|
|
|
|
else target = uncheckedTarget.get();
|
|
|
|
|
|
|
|
|
|
// Argchk#2 - uid OR username#1234 OR "me"
|
|
|
|
|
if(idPattern.matcher(arguments.get(1)).matches()) // uid
|
|
|
|
|
{
|
|
|
|
|
userToLookup = event.getClient().getUserByID(arguments.get(1));
|
|
|
|
|
}
|
|
|
|
|
else if(usernamePattern.matcher(arguments.get(1)).matches()) // username#1234
|
|
|
|
|
{
|
|
|
|
|
for(IUser iUser : event.getClient().getUsers()) // Greedy
|
|
|
|
|
if(arguments.get(1).equalsIgnoreCase(iUser.getName() + "#" + iUser.getDiscriminator()))
|
|
|
|
|
{
|
|
|
|
|
userToLookup = iUser;
|
|
|
|
|
break; // Limit greediness
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if(arguments.get(1).equalsIgnoreCase("me")) // me
|
|
|
|
|
{
|
|
|
|
|
Optional<IUser> uncheckedUser = Optional.empty();
|
|
|
|
|
if(arguments.get(1).equalsIgnoreCase("me"))
|
|
|
|
|
userToLookup = event.getMessage().getAuthor();
|
|
|
|
|
}
|
|
|
|
|
else // ?
|
|
|
|
|
{
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "Invalid arguments.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if(userToLookup == null)
|
|
|
|
|
else // Anything else
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
uncheckedUser = ArgumentParser.checkParseUsernameOrID(arguments.get(1), event.getClient());
|
|
|
|
|
}
|
|
|
|
|
catch(ArgumentParser.ParserException e)
|
|
|
|
|
{
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "Invalid arguments.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if(!uncheckedUser.isPresent())
|
|
|
|
|
{
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "User not found.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
userToLookup = uncheckedUser.get();
|
|
|
|
|
|
|
|
|
|
// Argchk#3 - verbosity
|
|
|
|
|
if(arguments.size() == 3) verbose = true;
|
|
|
|
@ -169,4 +161,91 @@ public class PermissionsCommands implements IWithCommands
|
|
|
|
|
{
|
|
|
|
|
return input != null ? (input ? "Grant" : "Deny") : "N/A";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static final Command setUser =
|
|
|
|
|
new Command.Builder("perm:setUser")
|
|
|
|
|
.description("Overrides an user's permission to run a command.")
|
|
|
|
|
.enabled(true)
|
|
|
|
|
.usage("Command <User#Disc|ID> <Guild|ID|this|*> <true|false|null>")
|
|
|
|
|
.defaultPermission(DefaultPermission.BOT_OWNER)
|
|
|
|
|
.build(PermissionsCommands::setUserImpl);
|
|
|
|
|
|
|
|
|
|
private static void setUserImpl(MessageReceivedEvent event, List<String> arguments)
|
|
|
|
|
{
|
|
|
|
|
// Parameters
|
|
|
|
|
IUser targetUser;
|
|
|
|
|
IGuild targetGuild = null;
|
|
|
|
|
Command targetCommand;
|
|
|
|
|
Boolean action;
|
|
|
|
|
ICommandPermissionsProvider provider = PermissionsHandler.getProvider();
|
|
|
|
|
|
|
|
|
|
// Argchk size
|
|
|
|
|
if(arguments.size() != 3 && arguments.size() != 4)
|
|
|
|
|
{
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "Invalid arguments.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Argchk#1 Command
|
|
|
|
|
Optional<Command> uncheckedCommand = CommandRegistry.getCommandOrAliasByName(arguments.get(0));
|
|
|
|
|
if(!uncheckedCommand.isPresent()) // Command existence
|
|
|
|
|
{
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "Target command not found.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else targetCommand = uncheckedCommand.get();
|
|
|
|
|
|
|
|
|
|
// Argchk#2 User#Disc/UID
|
|
|
|
|
Optional<IUser> uncheckedUser = Optional.empty();
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
uncheckedUser = ArgumentParser.checkParseUsernameOrID(arguments.get(1), event.getClient());
|
|
|
|
|
}
|
|
|
|
|
catch(ArgumentParser.ParserException e)
|
|
|
|
|
{
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "Invalid arguments.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if(!uncheckedUser.isPresent())
|
|
|
|
|
{
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "User not found.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else targetUser = uncheckedUser.get();
|
|
|
|
|
|
|
|
|
|
// Argchk#3 Guild
|
|
|
|
|
if(arguments.get(2).equalsIgnoreCase("this")) targetGuild = event.getMessage().getGuild(); // this
|
|
|
|
|
else if(arguments.get(2).matches("^\\d{18}$")) targetGuild = event.getClient().getGuildByID(arguments.get(2)); // GID
|
|
|
|
|
else
|
|
|
|
|
for(IGuild i : event.getClient().getGuilds()) // Name
|
|
|
|
|
if(arguments.get(2).equalsIgnoreCase(i.getName()))
|
|
|
|
|
{
|
|
|
|
|
targetGuild = i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if(targetGuild == null && !arguments.get(2).equals("*")) // Global
|
|
|
|
|
{
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "Guild not found.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Argchk#4 true/false/null
|
|
|
|
|
action = (Boolean) ArgumentParser.parse(Boolean.class, arguments.size() > 3 ? arguments.get(3) : null);
|
|
|
|
|
|
|
|
|
|
// ========================================
|
|
|
|
|
|
|
|
|
|
StringBuilder builder = new StringBuilder("**Changes summary**\n");
|
|
|
|
|
builder.append("```\n");
|
|
|
|
|
builder.append("User: ").append(targetUser.getName()).append("#").append(targetUser.getDiscriminator()).append("\n");
|
|
|
|
|
builder.append("UID: ").append(targetUser.getID()).append("\n");
|
|
|
|
|
builder.append("Guild: ").append(targetGuild != null ? targetGuild.getName() : "[GLOBAL]").append("\n");
|
|
|
|
|
builder.append("Guild ID: ").append(targetGuild != null ? targetGuild.getID() : "N/A").append("\n");
|
|
|
|
|
builder.append("Command: ").append(targetCommand.getName()).append("\n");
|
|
|
|
|
builder.append("New perm: ").append(booleanToString(action)).append("\n");
|
|
|
|
|
builder.append("```\n");
|
|
|
|
|
|
|
|
|
|
provider.setUserPermission(targetGuild, targetUser, targetCommand, action);
|
|
|
|
|
builder.append("Changes OK");
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), builder.toString());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|