package modules; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; import java.net.URISyntaxException; import java.util.HashMap; import java.util.HashSet; import java.util.Scanner; import java.util.logging.Level; import bot.Config; import bot.Message; import bot.Module; import bot.Server; import bot.info.Channel; import bot.info.Info; public class Administration implements Module { private HashSet<String> rooms = new HashSet<String>(); private HashMap<String, HashMap<String,Integer>> antispams; File file; public Administration() { antispams = new HashMap<String, HashMap<String,Integer>>(); try { file = new File(this.getClass().getResource("files/administration.txt").toURI()); Scanner scan = new Scanner(file); while(scan.hasNextLine()){ String next = scan.nextLine(); if(next.startsWith("#")) rooms.add(next); } scan.close(); } catch (URISyntaxException | FileNotFoundException e) { e.printStackTrace(); } } @Override public void parse(Message m) { String target = m.param(); if(!target.startsWith("#"))target = m.sender(); if(m.botCommand().equals("adminon") && Config.getAdmins().contains(m.sender())){ if(m.hasBotParams()){ for(String s : m.botParamsArray()){ if(s.startsWith("#"))rooms.add(s); else rooms.add("#" + s); } write(); } } if(m.botCommand().equals("adminoff") && Config.getAdmins().contains(m.sender())){ if(m.hasBotParams()){ for(String s : m.botParamsArray()){ if(s.startsWith("#"))rooms.remove(s); else rooms.remove("#" + s); } write(); } } if(m.param().startsWith("#") && rooms.contains(m.param())){ //In channel commands only if(m.command().equals("PRIVMSG") && (getLevel(m.sender(), m.param()) < 3) && (isop(m.param()))){ HashMap<String, Integer> roomcheck; if(!antispams.containsKey(m.param())){ roomcheck = new HashMap<String, Integer>(); } else{ roomcheck = antispams.get(m.param()); } int useroffences = 0; if(roomcheck.containsKey(m.sender())){ useroffences = roomcheck.get(m.sender()); } useroffences++; if(useroffences >= 5){ Server.send("KICK " + m.param() + " " + m.sender() + " :Stop flooding!"); roomcheck.remove(m.sender()); antispams.put(m.param(), roomcheck); return; } roomcheck.put(m.sender(), useroffences); antispams.put(m.param(), roomcheck); waitForAntiSpam(m.param(), m.sender(), 10); } if(m.botCommand().equals("title")){ // Title changes int level = getLevel(m.sender(), m.param()); if(!isop(m.param()))Server.say(target, "I am not an operator"); if(level < 2) Server.say(target, "You need to be at least halfop to do this"); } if(m.botCommand().equals("kb")){ // Kick ban int level = getLevel(m.sender(), m.param()); if(!isop(m.param())){ Server.say(target, "I am not an operator"); return; } if(level == -1){ Server.say(target, "An error has occured. Some channel or nick info may be unavailable"); } if(level < 2) { Server.say(target, "You need to be at least halfop to do this"); return; } int otherlevel = getLevel(m.botParamsArray()[0], m.param()); if(otherlevel == -1){ Server.say(target, "Cannot find target: " + m.botParamsArray()[0]); return; } if(otherlevel > level){ Server.say(target, "They are a higher rank than you"); return; } String reason = ""; for(int i = 1; i < m.botParamsArray().length; i++){ reason += m.botParamsArray()[i] + " "; } reason = reason.trim(); if(reason.equals("")) reason = m.botParamsArray()[0]; m.send("KICK " + m.param() + " " + m.botParamsArray()[0] + " :" + reason); m.send("MODE " + m.param() + " +b " + Info.getUserInfo(m.botParamsArray()[0]).getHost() ); } if(m.botCommand().equals("ub")){ // Unban int level = getLevel(m.sender(), m.param()); if(!isop(m.param())){ Server.say(target, "I am not an operator"); return; } if(level == -1){ Server.say(target, "An error has occured. Some channel or nick info may be unavailable"); } if(level < 2) { Server.say(target, "You need to be at least halfop to do this"); return; } if(!Info.hasUserInfo(m.botParamsArray()[0])){ Server.say(target, "Cannot find target: " + m.botParamsArray()[0]); return; } m.send("MODE " + m.param() + " -b " + Info.getUserInfo(m.botParamsArray()[0]).getHost() ); } if(m.botCommand().equals("k")){ // Kick int level = getLevel(m.sender(), m.param()); if(!isop(m.param())){ Server.say(target, "I am not an operator"); return; } if(level == -1){ Server.say(target, "An error has occured. Some channel or nick info may be unavailable"); } if(level < 2) { Server.say(target, "You need to be at least halfop to do this"); return; } int otherlevel = getLevel(m.botParamsArray()[0], m.param()); if(otherlevel == -1){ Server.say(target, "Cannot find target: " + m.botParamsArray()[0]); return; } if(otherlevel > level){ Server.say(target, "They are a higher rank than you"); return; } String reason = ""; for(int i = 1; i < m.botParamsArray().length; i++){ reason += m.botParamsArray()[i] + " "; } reason = reason.trim(); if(reason.equals("")) reason = m.botParamsArray()[0]; m.send("KICK " + m.param() + " " + m.botParamsArray()[0] + " :" + reason); } } } /** * 5 = ~, qop, owner * 4 = &, aop, protectop * 3 = @, op, operator * 2 = %, hop, halfop * 1 = +, vop, voice * 0 = regular * -1 = not in channel * @return */ private int getLevel(String nick, String chan){ if(!Info.hasChannelInfo(chan))return -1; Channel channel = Info.getChannelInfo(chan); if(!channel.has(nick))return -1; String modes = channel.getModes(nick); if(modes.contains("~")) return 5; if(modes.contains("&")) return 4; if(modes.contains("@")) return 3; if(modes.contains("%")) return 2; if(modes.contains("+")) return 1; return 0; } private boolean isop(String chan){ if(!Info.hasChannelInfo(chan))return false; Channel channel = Info.getChannelInfo(chan); if(!channel.has(Config.getNick()))return false; String modes = channel.getModes(Config.getNick()); if(modes.contains("~")) return true; if(modes.contains("&")) return true; if(modes.contains("@")) return true; if(modes.contains("%")) return true; return false; } private void write(){ try { PrintWriter writer = new PrintWriter(file); for(String s : rooms){ writer.println(s); } writer.close(); } catch (IOException e) {} } private void waitForAntiSpam(String room, String user, int cooldowntime){ new Thread(new Runnable(){ public void run(){ try { Thread.sleep(cooldowntime*1000); } catch (InterruptedException e) {} HashMap<String, Integer> roomcheck = antispams.get(room); if(!roomcheck.containsKey(user))return; int userspams = roomcheck.get(user); userspams--; if(userspams < 0) userspams = 0; roomcheck.put(user, userspams); antispams.put(room, roomcheck); } }).start(); } }