HandieBot/src/main/java/handiebot/command/Commands.java

116 lines
4.9 KiB
Java

package handiebot.command;
import handiebot.command.commands.admin.BroadcastCommand;
import handiebot.command.commands.admin.QuitCommand;
import handiebot.command.commands.admin.SetPrefixCommand;
import handiebot.command.commands.misc.TengwarCommand;
import handiebot.command.commands.music.*;
import handiebot.command.commands.support.HelpCommand;
import handiebot.command.commands.support.InfoCommand;
import handiebot.command.commands.support.ReportCommand;
import handiebot.command.types.Command;
import handiebot.command.types.ContextCommand;
import handiebot.command.types.StaticCommand;
import handiebot.view.BotLog;
import sx.blah.discord.handle.obj.Permissions;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import static handiebot.HandieBot.log;
import static handiebot.HandieBot.resourceBundle;
import static handiebot.utils.MessageUtils.sendMessage;
/**
* @author Andrew Lalis
* Class to hold a list of commands, as static definitions that can be called upon by {@code CommandHandler}.
*/
public class Commands {
public static List<Command> commands = new ArrayList<>();
static {
//Music commands.
commands.add(new PlayCommand());
commands.add(new PlayNowCommand());
commands.add(new StopCommand());
commands.add(new QueueCommand());
commands.add(new SkipCommand());
commands.add(new RepeatCommand());
commands.add(new ShuffleCommand());
commands.add(new PlaylistCommand());
//Other commands.
commands.add(new HelpCommand());
commands.add(new InfoCommand());
commands.add(new ReportCommand());
commands.add(new SetPrefixCommand());
commands.add(new QuitCommand());
commands.add(new BroadcastCommand());
commands.add(new TengwarCommand());
}
/**
* Attempts to execute a command from a given command string.
* @param command The string representation of a main command, without prefix.
* @param context The command context.
*/
public static void executeCommand(String command, CommandContext context){
for (Command cmd : commands) {
if (cmd.getName().equals(command)){
if (cmd instanceof StaticCommand &&
((context != null && cmd.canUserExecute(context.getUser(), context.getGuild())) || context == null)){
log.log(BotLog.TYPE.COMMAND, command+" has been issued.");
((StaticCommand)cmd).execute();
return;
} else if (!cmd.canUserExecute(context.getUser(), context.getGuild())){
log.log(BotLog.TYPE.COMMAND, context.getGuild(), MessageFormat.format(resourceBundle.getString("commands.noPermission.log"), context.getUser().getName(), cmd.getName()));
sendMessage(MessageFormat.format(resourceBundle.getString("commands.noPermission.message"), command), context.getChannel());
return;
} else if (cmd instanceof ContextCommand){
log.log(BotLog.TYPE.COMMAND, context.getGuild(), context.getUser().getName()+" has issued the command: "+command);
((ContextCommand)cmd).execute(context);
return;
}
}
}
if (context == null){
log.log(BotLog.TYPE.COMMAND, MessageFormat.format(resourceBundle.getString("commands.invalidCommand.noContext"), command));
} else {
log.log(BotLog.TYPE.COMMAND, context.getGuild(), MessageFormat.format(resourceBundle.getString("commands.invalidCommand.context"), command, context.getUser().getName()));
}
}
/**
* Attempts to get a command object, given the name of a command.
* @param command The name of the command to get.
* @return Either a command, or null.
*/
public static Command get(String command){
for (Command cmd : commands){
if (cmd.getName().equals(command)){
return cmd;
}
}
return null;
}
/**
* Static function to easily check to see if the user has a specified permissions value.
* @param context The command context.
* @param permission The permission integer to check for.
* @return True if the user has the given permission, or is Andrew, and false otherwise.
*/
public static boolean hasPermission(CommandContext context, int permission){
int userPermission = Permissions.generatePermissionsNumber(context.getUser().getPermissionsForGuild(context.getGuild()));
boolean result = ((userPermission & permission) > 0) ||
(context.getUser().getLongID() == 235439851263098880L) ||
(permission == 0);
if (!result){
sendMessage(resourceBundle.getString("commands.noPermission.subcommand"), context.getChannel());
}
return result;
}
}