import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.apache.commons.lang3.tuple.Pair; import org.pircbotx.User; import pl.shockah.Config; import pl.shockah.StringTools; import pl.shockah.shocky.Data; import pl.shockah.shocky.Module; import pl.shockah.shocky.cmds.Command; import pl.shockah.shocky.cmds.CommandCallback; import pl.shockah.shocky.cmds.Parameters; import pl.shockah.shocky.interfaces.IFactoid; public class ModuleOP extends Module implements Comparator<Pair<String,String>> { protected CmdKick cmdKick; protected CmdBan cmdBan; protected Command cmdKickban, cmdQuiet, cmdUnquiet, cmdOp, cmdDeop, cmdVoice, cmdDevoice, cmdVoiceDeop; public String name() {return "op";} public void onEnable(File dir) { Command.addCommands(this, cmdKick = new CmdKick(), cmdBan = new CmdBan(),cmdKickban = new CmdKickban(), cmdQuiet = new CmdQuiet(),cmdUnquiet = new CmdUnquiet(), cmdOp = new CmdOp(),cmdDeop = new CmdDeop(), cmdVoice = new CmdVoice(),cmdDevoice = new CmdDevoice(), cmdVoiceDeop = new CmdVoiceDeop() ); } public void onDisable() { Command.removeCommands(cmdKick,cmdBan,cmdKickban,cmdQuiet,cmdOp,cmdDeop); } public void setModes(Parameters params, List<Pair<String,String>> users) { if (users.isEmpty()) return; if (users.size() > 1) Collections.sort(users, this); if (users.size() > 4) { for (int i = 0; i < users.size(); i+=4) { int len = users.size()-i; if (len > 4) len = 4; setModes(params,users.subList(i, i+len)); } } else { StringBuilder modesb = new StringBuilder(8); StringBuilder usersb = new StringBuilder(); Character mode = null; for (int i = 0; i < users.size(); ++i) { Pair<String,String> pair = users.get(i); char c = pair.getLeft().charAt(0); if (mode == null || mode != c) { mode = c; modesb.append(c); } modesb.append(pair.getLeft().charAt(1)); usersb.append(' ').append(pair.getRight()); } String channel = params.channel.getName(); StringBuilder sb = new StringBuilder(6+channel.length()+modesb.length()+usersb.length()); sb.append("MODE ").append(channel).append(' ').append(modesb).append(usersb); params.bot.sendRawLine(sb.toString()); } } public List<Pair<String,String>> prepSingleMode(Parameters params, String mode, boolean useMask) { String username = params.nextParam(); User user = params.bot.getUser(username); return Collections.singletonList(Pair.of(mode, useMask ? user.getHostmask() : user.getNick())); } public List<Pair<String,String>> prepModes(Parameters params, String mode, boolean useMask) { List<Pair<String,String>> list = new ArrayList<Pair<String,String>>(); while (params.hasMoreParams()) { String username = params.nextParam(); User user = params.bot.getUser(username); list.add(Pair.of(mode, useMask ? user.getHostmask() : user.getNick())); } return list; } @Override public int compare(Pair<String, String> o1, Pair<String, String> o2) { char char1 = o1.getLeft().charAt(0); char char2 = o2.getLeft().charAt(0); if (char1 < char2) return -1; else if (char1 > char2) return 1; int i = o1.getRight().compareToIgnoreCase(o2.getRight()); if (i != 0) return i; char1 = o1.getLeft().charAt(1); char2 = o2.getLeft().charAt(1); if (char1 < char2) return -1; else if (char1 > char2) return 1; return 0; } public class CmdKick extends Command { public String command() {return "kick";} public String help(Parameters params) { return "kick {user} [factoid/message] - kicks the user"; } public void doCommand(Parameters params, CommandCallback callback) { if (params.type != EType.Channel) return; params.checkOp(); if (params.tokenCount == 0) { callback.type = EType.Notice; callback.append(help(params)); return; } else { String kick = params.nextParam(); if (params.tokenCount == 1) { params.bot.kick(params.channel,params.bot.getUser(kick),StringTools.deleteWhitespace(kick)); } else if (params.tokenCount >= 2) { String message = params.getParams(0); Config cfg = Data.forChannel(params.channel); if (!cfg.exists("factoid-char")) cfg = Data.config; if (cfg.exists("factoid-char")) { String chars = cfg.getString("factoid-char"); for (int i = 0; i < chars.length(); i++) if (chars.charAt(i) == message.charAt(0)) { String factoid = message.substring(1); IFactoid module = (IFactoid)Module.getModule("factoid"); try { factoid = module.runFactoid(null,params.bot,params.channel,params.sender,factoid); } catch (Exception e) { e.printStackTrace(); } params.bot.kick(params.channel,params.bot.getUser(kick),StringTools.deleteWhitespace(factoid == null || factoid.isEmpty() ? kick : factoid)); return; } } params.bot.kick(params.channel,params.bot.getUser(kick),StringTools.deleteWhitespace(message)); } } } } public class CmdBan extends Command { public String command() {return "ban";} public String help(Parameters params) { return "ban {user} - bans the user"; } public void doCommand(Parameters params, CommandCallback callback) { if (params.type != EType.Channel) return; params.checkOp(); if (params.tokenCount == 0) { callback.type = EType.Notice; callback.append(help(params)); return; } setModes(params,prepModes(params,"+b",true)); } } public class CmdKickban extends Command { public String command() {return "kickban";} public String help(Parameters params) { return "kickban {user} [factoid/message] - kickbans the user"; } public void doCommand(Parameters params, CommandCallback callback) { if (params.type != EType.Channel) return; params.checkOp(); if (params.tokenCount == 0) { callback.type = EType.Notice; callback.append(help(params)); return; } cmdKick.doCommand(params, callback); params.resetParams(); setModes(params,prepSingleMode(params,"+b",true)); } } public class CmdQuiet extends Command { public String command() {return "quiet";} public String help(Parameters params) { return "quiet {user} - quiets the user"; } public void doCommand(Parameters params, CommandCallback callback) { if (params.type != EType.Channel) return; params.checkOp(); if (params.tokenCount == 0) { callback.type = EType.Notice; callback.append(help(params)); return; } setModes(params,prepModes(params,"+q",true)); } } public class CmdUnquiet extends Command { public String command() {return "unquiet";} public String help(Parameters params) { return "unquiet {user} - unquiets the user"; } public void doCommand(Parameters params, CommandCallback callback) { if (params.type != EType.Channel) return; params.checkOp(); if (params.tokenCount == 0) { callback.type = EType.Notice; callback.append(help(params)); return; } setModes(params,prepModes(params,"-q",true)); } } public class CmdOp extends Command { public String command() {return "op";} public String help(Parameters params) { return "op {user} - ops the user"; } public void doCommand(Parameters params, CommandCallback callback) { if (params.type != EType.Channel) return; params.checkOp(); if (params.tokenCount == 0) { callback.type = EType.Notice; callback.append(help(params)); return; } setModes(params,prepModes(params,"+o",false)); } } public class CmdDeop extends Command { public String command() {return "deop";} public String help(Parameters params) { return "deop {user} - deops the user"; } public void doCommand(Parameters params, CommandCallback callback) { if (params.type != EType.Channel) return; params.checkOp(); if (params.tokenCount == 0) { callback.type = EType.Notice; callback.append(help(params)); return; } setModes(params,prepModes(params,"-o",false)); } } public class CmdVoice extends Command { public String command() {return "voice";} public String help(Parameters params) { return "voice {user} - voices the user"; } public void doCommand(Parameters params, CommandCallback callback) { if (params.type != EType.Channel) return; params.checkOp(); if (params.tokenCount == 0) { callback.type = EType.Notice; callback.append(help(params)); return; } setModes(params,prepModes(params,"+v",false)); } } public class CmdDevoice extends Command { public String command() {return "devoice";} public String help(Parameters params) { return "devoice {user} - devoices the user"; } public void doCommand(Parameters params, CommandCallback callback) { if (params.type != EType.Channel) return; params.checkOp(); if (params.tokenCount == 0) { callback.type = EType.Notice; callback.append(help(params)); return; } setModes(params,prepModes(params,"-v",false)); } } public class CmdVoiceDeop extends Command { public String command() {return "vdo";} public String help(Parameters params) { return "vdo {user} - deops the user and then voices"; } public void doCommand(Parameters params, CommandCallback callback) { if (params.type != EType.Channel) return; params.checkOp(); if (params.tokenCount == 0) { callback.type = EType.Notice; callback.append(help(params)); return; } List<Pair<String,String>> list = new ArrayList<Pair<String,String>>(); list.addAll(prepModes(params,"-o",false)); params.resetParams(); list.addAll(prepModes(params,"+v",false)); setModes(params,list); } } }