import java.io.File; import java.util.HashMap; import java.util.regex.Pattern; import org.luaj.vm2.LuaTable; import org.luaj.vm2.LuaValue; import org.luaj.vm2.lib.TwoArgFunction; import org.pircbotx.ShockyBot; import org.pircbotx.User; import org.pircbotx.hooks.events.MessageEvent; import pl.shockah.Config; import pl.shockah.shocky.Data; import pl.shockah.shocky.Module; import pl.shockah.shocky.Shocky; import pl.shockah.shocky.interfaces.ILua; public class ModuleHighFive extends Module implements ILua { private Config config = new Config(); private HashMap<String,User> started = new HashMap<String,User>(); private HashMap<String,Long> timers = new HashMap<String,Long>(); private static final Pattern pattern = Pattern.compile("(\\s|^)(o/|\\\\o)(\\s|$)", Pattern.CASE_INSENSITIVE); public int changeStat(String nick1, String nick2, int change) { nick1 = nick1.toLowerCase(); nick2 = nick2.toLowerCase(); if (nick1.equals(nick2)) return 0; if (nick1.compareTo(nick2)>0) { String temp = nick1; nick1 = nick2; nick2 = temp; } String key = nick1+' '+nick2; config.setNotExists(key,0); int i = config.getInt(key)+change; config.set(key,i); return i; } public String name() {return "highfive";} public boolean isListener() {return true;} public void onEnable(File dir) { Data.config.setNotExists("hf-announce",true); Data.config.setNotExists("hf-maxtime",1000*60*5); Data.config.setNotExists("hf-kickat",5); config.load(new File(dir,"highfive.cfg")); } public void onDisable() { } public void onDataSave(File dir) { config.save(new File(dir,"highfive.cfg")); } public void onMessage(MessageEvent<ShockyBot> event) { if (Data.isBlacklisted(event.getUser())) return; String msg = event.getMessage(); if (!pattern.matcher(msg).find()) return; String chan = event.getChannel().getName(); Long time = timers.get(chan); User s = started.get(chan); if (s != null && time != null && time < System.currentTimeMillis()) { started.remove(chan); timers.remove(chan); s = null; } if (s == null) { time = System.currentTimeMillis()+Data.forChannel(event.getChannel()).getInt("hf-maxtime"); //event.respond(String.format("Will expired at %s", DateFormat.getDateTimeInstance().format(new Date(time)))); started.put(chan,event.getUser()); timers.put(chan,time); } else { int stat = changeStat(s.getNick(),event.getUser().getNick(),1); if (stat != 0) { if (event.getChannel().isOp(event.getBot().getUserBot()) && stat >= Data.forChannel(event.getChannel()).getInt("hf-kickat")) { stat = changeStat(s.getNick(),event.getUser().getNick(),-stat); msg = s.getNick()+" o/ * \\o "+event.getUser().getNick()+" - have been kicked!"; event.getBot().kick(event.getChannel(), s); event.getBot().kick(event.getChannel(), event.getUser()); if (Data.forChannel(event.getChannel()).getBoolean("hf-announce")) Shocky.sendChannel(event.getBot(),event.getChannel(),msg); else { Shocky.sendNotice(event.getBot(),event.getUser(),msg); Shocky.sendNotice(event.getBot(),s,msg); } } else { msg = s.getNick()+" o/ * \\o "+event.getUser().getNick()+" - "+getOrderNumber(stat)+" time"; if (Data.forChannel(event.getChannel()).getBoolean("hf-announce")) Shocky.sendChannel(event.getBot(),event.getChannel(),msg); else { Shocky.sendNotice(event.getBot(),event.getUser(),msg); Shocky.sendNotice(event.getBot(),s,msg); } } started.remove(chan); timers.remove(chan); } } } public String getOrderNumber(int n) { StringBuilder sb = new StringBuilder(3); sb.append(n); int n100 = n % 100; if (n100 >= 10 && n100 < 20) { sb.append("th"); } else { switch (n % 10) { case 1: sb.append("st"); break; case 2: sb.append("nd"); break; case 3: sb.append("rd"); break; default: sb.append("th"); break; } } return sb.toString(); } public class Function extends TwoArgFunction { @Override public LuaValue call(LuaValue arg1, LuaValue arg2) { String nick1 = arg1.checkjstring().toLowerCase(); String nick2 = arg2.checkjstring().toLowerCase(); if (nick1.compareTo(nick2)>0) { String temp = nick1; nick1 = nick2; nick2 = temp; } String key = nick1+' '+nick2; return valueOf(config.exists(key)?config.getInt(key):0); } } @Override public void setupLua(LuaTable env) { env.set("hf", new Function()); } }