import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import javax.swing.Timer;
import org.pircbotx.Channel;
import org.pircbotx.PircBotX;
import org.pircbotx.ShockyBot;
import org.pircbotx.User;
import org.pircbotx.hooks.events.ActionEvent;
import org.pircbotx.hooks.events.MessageEvent;
import pl.shockah.shocky.Data;
import pl.shockah.shocky.Module;
public class ModuleAutoKick extends Module {
private Map<Channel,Map<User,CheckerStructure>> data = Collections.synchronizedMap(new HashMap<Channel,Map<User,CheckerStructure>>());
public String name() {return "autokick";}
public boolean isListener() {return true;}
public void onEnable(File dir) {
Data.config.setNotExists("autokick-messages",5);
Data.config.setNotExists("autokick-delay",1000);
}
public void onDisable() {
for (Channel key1 : data.keySet()) {
Map<User,CheckerStructure> map = data.get(key1);
for (User key2 : map.keySet())
map.get(key2).resetTimers();
}
data.clear();
}
private void onEvent(PircBotX bot, Channel channel, User user) {
if (!channel.isOp(bot.getUserBot())) return;
if (!data.containsKey(channel))
data.put(channel,Collections.synchronizedMap(new TreeMap<User,ModuleAutoKick.CheckerStructure>()));
Map<User,CheckerStructure> map = data.get(channel);
if (!map.containsKey(user))
map.put(user,new CheckerStructure(bot,channel,user));
map.get(user).runTimer();
}
public void onMessage(MessageEvent<ShockyBot> event) {
onEvent(event.getBot(), event.getChannel(), event.getUser());
}
public void onActionMessage(ActionEvent<PircBotX> event) {
onEvent(event.getBot(), event.getChannel(), event.getUser());
}
public class CheckerStructure implements ActionListener {
private final PircBotX bot;
private final Channel channel;
private final User nick;
private List<Timer> timers = Collections.synchronizedList(new ArrayList<Timer>());
private int counter;
public CheckerStructure(PircBotX bot, Channel channel, User nick) {
this.bot = bot;
this.channel = channel;
this.nick = nick;
counter = Data.forChannel(channel).getInt("autokick-messages");
}
public synchronized void runTimer() {
if (--counter == 0) {
bot.kick(channel,nick,"Excessive spam");
resetTimers();
} else {
Timer t = new Timer(Data.forChannel(channel).getInt("autokick-delay"),this);
timers.add(t);
t.start();
}
}
public synchronized void resetTimers() {
for (Timer atk : timers) atk.stop();
timers.clear();
}
public synchronized void actionPerformed(java.awt.event.ActionEvent e) {
((Timer)e.getSource()).stop();
timers.remove(e.getSource());
counter++;
}
}
}