|
|
|
@ -11,7 +11,6 @@ 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;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Commands for the permissions package.
|
|
|
|
@ -30,13 +29,10 @@ public class PermissionsCommands implements IWithCommands
|
|
|
|
|
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]")
|
|
|
|
|
.usage("Command <User#Disc|ID|me> <Guild|ID|this|*> [verbose]")
|
|
|
|
|
.defaultPermission(DefaultPermission.BOT_OWNER)
|
|
|
|
|
.build(PermissionsCommands::isAllowedImpl);
|
|
|
|
|
|
|
|
|
|
private static Pattern usernamePattern = Pattern.compile("^.*#\\d{4}$");
|
|
|
|
|
private static Pattern idPattern = Pattern.compile("^\\d{18}$");
|
|
|
|
|
|
|
|
|
|
private static void isAllowedImpl(MessageReceivedEvent event, List<String> arguments)
|
|
|
|
|
{
|
|
|
|
|
// Parameters
|
|
|
|
@ -46,15 +42,8 @@ public class PermissionsCommands implements IWithCommands
|
|
|
|
|
IGuild targetGuild = null;
|
|
|
|
|
ICommandPermissionsProvider provider = PermissionsHandler.getProvider();
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
targetGuild = event.getMessage().getGuild();
|
|
|
|
|
}
|
|
|
|
|
catch(UnsupportedOperationException ignored) // DM NOP
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
// Argchk size
|
|
|
|
|
if(arguments.size() != 2 && arguments.size() != 3)
|
|
|
|
|
if(arguments.size() != 3 && arguments.size() != 4)
|
|
|
|
|
{
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "Invalid arguments.");
|
|
|
|
|
return;
|
|
|
|
@ -70,28 +59,50 @@ public class PermissionsCommands implements IWithCommands
|
|
|
|
|
else target = uncheckedTarget.get();
|
|
|
|
|
|
|
|
|
|
// Argchk#2 - uid OR username#1234 OR "me"
|
|
|
|
|
Optional<IUser> uncheckedUser = Optional.empty();
|
|
|
|
|
if(arguments.get(1).equalsIgnoreCase("me"))
|
|
|
|
|
userToLookup = event.getMessage().getAuthor();
|
|
|
|
|
if(arguments.get(1).equalsIgnoreCase("me")) userToLookup = event.getMessage().getAuthor(); // me
|
|
|
|
|
else // Anything else
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
uncheckedUser = ArgumentParser.checkParseUsernameOrID(arguments.get(1), event.getClient());
|
|
|
|
|
Optional<IUser> uncheckedUser = ArgumentParser.checkParseUsernameOrID(arguments.get(1), event.getClient());
|
|
|
|
|
|
|
|
|
|
if(uncheckedUser.isPresent()) userToLookup = uncheckedUser.get();
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "User not found.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch(ArgumentParser.ParserException e)
|
|
|
|
|
{
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "Invalid arguments.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if(!uncheckedUser.isPresent())
|
|
|
|
|
|
|
|
|
|
// Argchk#3 - Guild
|
|
|
|
|
if(arguments.get(2).equalsIgnoreCase("this"))
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
targetGuild = event.getMessage().getGuild(); // this
|
|
|
|
|
}
|
|
|
|
|
catch(UnsupportedOperationException ignored) // DM
|
|
|
|
|
{
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "`this` is not supported outside a guild.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else if(arguments.get(2).equals("*")) targetGuild = null; // Global - ~NOP
|
|
|
|
|
else // Parse Name/ID
|
|
|
|
|
{
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "User not found.");
|
|
|
|
|
return;
|
|
|
|
|
Optional<IGuild> uncheckedGuild = ArgumentParser.checkParseGuildOrID(arguments.get(2), event.getClient());
|
|
|
|
|
if(uncheckedGuild.isPresent()) targetGuild = uncheckedGuild.get();
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "Guild not found.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
userToLookup = uncheckedUser.get();
|
|
|
|
|
|
|
|
|
|
// Argchk#3 - verbosity
|
|
|
|
|
if(arguments.size() == 3) verbose = true;
|
|
|
|
|
// Argchk#4 - verbosity
|
|
|
|
|
if(arguments.size() == 4) verbose = true;
|
|
|
|
|
|
|
|
|
|
// ========================================
|
|
|
|
|
|
|
|
|
@ -196,37 +207,44 @@ public class PermissionsCommands implements IWithCommands
|
|
|
|
|
else targetCommand = uncheckedCommand.get();
|
|
|
|
|
|
|
|
|
|
// Argchk#2 User#Disc/UID
|
|
|
|
|
Optional<IUser> uncheckedUser = Optional.empty();
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
uncheckedUser = ArgumentParser.checkParseUsernameOrID(arguments.get(1), event.getClient());
|
|
|
|
|
Optional<IUser> uncheckedUser = ArgumentParser.checkParseUsernameOrID(arguments.get(1), event.getClient());
|
|
|
|
|
|
|
|
|
|
if(uncheckedUser.isPresent()) targetUser = uncheckedUser.get();
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "User not found.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
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
|
|
|
|
|
if(arguments.get(2).equalsIgnoreCase("this"))
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
targetGuild = event.getMessage().getGuild(); // this
|
|
|
|
|
}
|
|
|
|
|
catch(UnsupportedOperationException ignored) // DM
|
|
|
|
|
{
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "`this` is not supported outside a guild.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else if(arguments.get(2).equals("*")) targetGuild = null; // Global - ~NOP
|
|
|
|
|
else // Parse Name/ID
|
|
|
|
|
{
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "Guild not found.");
|
|
|
|
|
return;
|
|
|
|
|
Optional<IGuild> uncheckedGuild = ArgumentParser.checkParseGuildOrID(arguments.get(2), event.getClient());
|
|
|
|
|
if(uncheckedGuild.isPresent()) targetGuild = uncheckedGuild.get();
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
DiscordInteractionsUtil.sendMessage(event.getMessage().getChannel(), "Guild not found.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Argchk#4 true/false/null
|
|
|
|
|