`perm:setuser`, also adjusted `perm:canrun`.

keep-around/d31701866686f66088b78de2e29736ae36e55a68
Pingex aka Raphaël 9 years ago
parent fa2668e0c2
commit 1b89180c86

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