// Copyright (c) 2015, Christopher "BlayTheNinth" Baker
package net.blay09.mods.eirairc.command.base;
import net.blay09.mods.eirairc.api.SubCommand;
import net.blay09.mods.eirairc.command.*;
import net.blay09.mods.eirairc.command.extension.*;
import net.blay09.mods.eirairc.command.interop.InterOpCommandKick;
import net.blay09.mods.eirairc.command.interop.InterOpCommandMode;
import net.blay09.mods.eirairc.command.interop.InterOpCommandTopic;
import net.blay09.mods.eirairc.command.interop.InterOpCommandUserModeBase;
import net.blay09.mods.eirairc.config.SharedGlobalConfig;
import net.blay09.mods.eirairc.util.ChatComponentBuilder;
import net.blay09.mods.eirairc.util.Utils;
import net.minecraft.command.CommandException;
import net.minecraft.command.CommandHandler;
import net.minecraft.command.ICommandSender;
import net.minecraft.command.WrongUsageException;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.BlockPos;
import net.minecraft.util.ChatComponentText;
import org.apache.commons.lang3.ArrayUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class IRCCommandHandler {
private static final Map<String, SubCommandWrapper> commands = new HashMap<>();
public static void registerCommands() {
registerCommand(new CommandConnect());
registerCommand(new CommandDisconnect());
registerCommand(new CommandJoin());
registerCommand(new CommandLeave());
registerCommand(new CommandConfig());
registerCommand(new CommandList());
registerCommand(new CommandMessage());
registerCommand(new CommandCTCP());
registerCommand(new CommandNick());
registerCommand(new CommandNickServ());
registerCommand(new CommandQuote());
registerCommand(new CommandTwitch());
registerCommand(new CommandWho());
registerCommand(new CommandColor());
registerCommand(new CommandGhost());
registerCommand(new CommandIgnore());
registerCommand(new CommandUnignore());
registerCommand(new InterOpCommandKick());
registerCommand(new InterOpCommandMode());
registerCommand(new InterOpCommandTopic());
registerCommand(new InterOpCommandUserModeBase("op", "+o", false));
registerCommand(new InterOpCommandUserModeBase("deop", "-o", false));
registerCommand(new InterOpCommandUserModeBase("voice", "+v", false));
registerCommand(new InterOpCommandUserModeBase("devoice", "-v", false));
registerCommand(new InterOpCommandUserModeBase("ban", "+b", true));
registerCommand(new InterOpCommandUserModeBase("unban", "-b", true));
}
public static void registerCommand(SubCommand command) {
SubCommandWrapper wrapper = new SubCommandWrapper(command);
commands.put(command.getCommandName(), wrapper);
String[] aliases = command.getAliases();
if (aliases != null) {
for (String alias : aliases) {
commands.put(alias, wrapper);
}
}
}
public static void registerQuickCommands(CommandHandler commandHandler) {
for (SubCommandWrapper wrapper : commands.values()) {
if (wrapper.command.hasQuickCommand()) {
commandHandler.registerCommand(wrapper);
}
}
}
public static boolean isUsernameIndex(String[] args, int idx) {
SubCommandWrapper cmd = commands.get(args[0]);
if (cmd != null) {
String[] shiftedArgs = ArrayUtils.subarray(args, 1, args.length);
return cmd.isUsernameIndex(shiftedArgs, idx - 1);
}
return false;
}
public static List<String> addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) {
if (args.length == 1) {
List<String> list = new ArrayList<>();
if (args[0].isEmpty()) {
list.addAll(commands.keySet());
} else {
for (String key : commands.keySet()) {
if (key.startsWith(args[0])) {
list.add(key);
}
}
}
return list;
}
SubCommandWrapper cmd = commands.get(args[0]);
if (cmd != null) {
String[] shiftedArgs = ArrayUtils.subarray(args, 1, args.length);
return cmd.addTabCompletionOptions(sender, shiftedArgs, pos);
}
return null;
}
public static boolean processCommand(ICommandSender sender, String[] args, boolean serverSide) throws CommandException {
SubCommandWrapper cmd = commands.get(args[0]);
if (cmd == null) {
sendUsageHelp(sender);
return false;
}
if (!cmd.canCommandSenderUseCommand(sender)) {
ChatComponentBuilder.create().color('c').lang("commands.generic.permission").send(sender);
return true;
}
String[] shiftedArgs = ArrayUtils.subarray(args, 1, args.length);
return cmd.command.processCommand(sender, Utils.getSuggestedTarget(), shiftedArgs, serverSide);
}
public static void sendUsageHelp(ICommandSender sender) {
ChatComponentBuilder ccb = new ChatComponentBuilder();
ccb.color('c').lang("commands.generic.usage", ccb.push().lang("eirairc:commands.irc.usage").pop()).send(sender);
ccb.color('e').lang("eirairc:commands.irc.list.general").color('f').text(" config, help, list, ignore, unignore").send(sender);
ccb.color('e').lang("eirairc:commands.irc.list.irc").color('f').text(" connect, disconnect, join, leave, nick, msg, who").send(sender);
ccb.color('e').lang("eirairc:commands.irc.list.interop").color('f').text(" op, deop, voice, devoice, kick, ban, unban, umode, mode, topic").send(sender);
ccb.color('e').lang("eirairc:commands.irc.list.special").color('f').text(" twitch, color, ctcp, ghost, nickserv").send(sender);
}
public static boolean onChatCommand(EntityPlayer sender, String text, boolean serverSide) {
if (text.equals(SharedGlobalConfig.ircCommandPrefix + "who") || text.startsWith(SharedGlobalConfig.ircCommandPrefix + "who ")) {
String[] params = text.substring(1).split(" ");
try {
return processCommand(sender, params, serverSide);
} catch (WrongUsageException e) {
ChatComponentBuilder ccb = new ChatComponentBuilder();
ccb.color('c').lang("commands.generic.usage", ccb.push().lang(e.getMessage(), e.getErrorObjects()).pop()).send(sender);
return true;
} catch (CommandException e) {
sender.addChatMessage(new ChatComponentText(e.getMessage()));
return true;
}
}
return false;
}
}