package bashoid; import java.io.UnsupportedEncodingException; import java.util.*; import org.jibble.pircbot.*; import utils.Config; import utils.FloodChecker; public class Bashoid extends PircBot implements AddonListener { private static final long CONNECT_CHECK_TIME = 5000; private ArrayList<Addon> addons = new ArrayList<>(); private Timer connectCheckTimer; private Bashoid.ConnectedCheckTask checkTask; private String channel; public Bashoid() { setName( getNickFromConfig("bashoid") ); setLogin("bashoid"); setAutoNickChange(true); setMessageDelay(0); trySetUTFEncoding(); } private String getNickFromConfig(String defaultNick) { Config config = new Config(); return config.getValue("nickname", defaultNick); } private void trySetUTFEncoding() { try { setEncoding("UTF-8"); } catch (UnsupportedEncodingException e) { System.err.println("Cannot set UTF-8 encoding."); } } private void registerAddons() { Addon.setAddonListener(this); addons.add( new addon.bash.Bash() ); addons.add( new addon.counter.Counter() ); addons.add( new addon.currency.Currency() ); addons.add( new addon.currency.CzechCurrency() ); addons.add( new addon.explain.Explain() ); addons.add( new addon.help.Help() ); addons.add( new addon.movie.Movie() ); addons.add( new addon.pepa.Pepa() ); addons.add( new addon.rss.RSS() ); // addons.add( new period.PeriodicMessage() ); addons.add( new addon.slap.Slap() ); addons.add( new addon.steam.Steam() ); addons.add( new addon.stopwatch.Stopwatch() ); addons.add( new addon.title.Title() ); addons.add( new addon.translator.Translator() ); addons.add( new addon.youtube.Youtube() ); } @Override protected void onConnect() { if(addons.isEmpty()) registerAddons(); } @Override protected void onAction(String sender, String login, String hostname, String target, String action) { onMessage(target, sender, login, hostname, action); } @Override protected void onJoin(String channel, String sender, String login, String hostname) { this.channel = channel; cancelCheckTask(); } @Override protected void onKick(String channel, String kickerNick, String kickerLogin, String kickerHostname, String recipientNick, String reason) { if ( recipientNick.equals( getNick() ) ) { joinChannel(channel); sendMessage(channel, kickerNick + ": polib si elipsy"); } } @Override protected void onMessage(String channel, String sender, String login, String hostname, String message) { onMessage( new Message(channel, sender, login, hostname, message) ); } protected void onMessage(Message message) { boolean canBeServed = FloodChecker.canBeServed(message.hostname); boolean hasReacted = false; for (Addon a : addons) { if (a.shouldReact(message) ) { if(!canBeServed) { sendNotice(message.author, "Max requests per minute: " + FloodChecker.maxServesPerMinute() ); break; } else { sendAddonOutput(a, message); hasReacted = true; } } } if (hasReacted) FloodChecker.logServed(message.hostname); } @Override protected void onRemoveChannelBan(String channel, String sourceNick, String sourceLogin, String sourceHostname, String hostmask) { cancelCheckTask(); } @Override protected void onSetChannelBan(String channel, String sourceNick, String sourceLogin, String sourceHostname, String hostmask) { runCheckTask(); } public void sendAddonAction(String target, String msg) { sendAction(target, msg); } public void sendAddonMessage(String target, String msg) { sendMessage(target, msg); } public void sendAddonMessageToChannels(String msg) { String[] channels = getChannels(); for (String channel : channels) sendMessage(channel, msg ); } private void sendAddonOutput(Addon addon, Message message) { List<String> reaction = addon.generateReaction(message); if ( addon.errorOccurred() ) { displayAddonFailureIfIsSet( addon.getError() ); sendListOfNotices(message.author, reaction); } else { sendListOfMessages(message.channel, reaction); } } protected void sendListOfMessages(String target, List<String> output) { for ( String line : output ) sendMessage(target, line); } protected void sendListOfNotices(String target, List<String> output) { for ( String line : output ) sendNotice(target, line); } protected void displayAddonFailureIfIsSet(Exception e) { if (e != null) System.err.println( e.getMessage() ); } public String getBotNickname() { return getNick(); } private void runCheckTask() { checkTask = new ConnectedCheckTask(); connectCheckTimer = new Timer(); connectCheckTimer.scheduleAtFixedRate(checkTask, CONNECT_CHECK_TIME, CONNECT_CHECK_TIME); } private void cancelCheckTask() { if (checkTask != null) checkTask.cancel(); } private class ConnectedCheckTask extends TimerTask { @Override public void run() { if( getChannels().length == 0 ) joinChannel(channel); } } }