import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.pircbotx.PircBotX; import org.pircbotx.ShockyBot; import org.pircbotx.User; import org.pircbotx.hooks.events.InviteEvent; import org.pircbotx.hooks.events.NoticeEvent; import org.pircbotx.hooks.events.ServerResponseEvent; import pl.shockah.shocky.Data; import pl.shockah.shocky.Module; import pl.shockah.shocky.MultiChannel; import pl.shockah.shocky.Shocky; public class ModuleInvite extends Module { private static final Pattern chanExists = Pattern.compile("Information on \\x02(#[\\w:]+)\\x02:"); private static final Pattern chanNotExists = Pattern.compile("Channel \\x02(#[\\w:]+)\\x02 is not registered."); public Map<String,String> queue = new ConcurrentHashMap<String,String>(); public String name() {return "invite";} public boolean isListener() {return true;} public void onInvite(InviteEvent<ShockyBot> event) { String username = event.getUser(); String channel = event.getChannel().toLowerCase(); User user = event.getBot().getUser(username); System.out.println(String.format("[invite] %s(%s) -> %s", username, user, channel)); if (Data.isBlacklisted(user)) return; queue.put(channel, username); event.getBot().sendMessage("ChanServ", String.format("INFO %s",channel)); } @Override public void onNotice(NoticeEvent<ShockyBot> event) throws Exception { if (queue.isEmpty()) return; System.out.println("[invite] Queue not empty."); if (!event.getUser().getNick().equals("ChanServ")) return; System.out.println("[invite] Noticed from ChanServ."); Matcher m = chanNotExists.matcher(event.getMessage()); if (m.find()) { String channel = m.group(1).toLowerCase(); String username = queue.remove(channel); System.out.println(String.format("[invite] [not exists] %s -> %s", username, channel)); if (username != null) { User user = event.getBot().getUser(username); if (user != null) Shocky.sendNotice(event.getBot(),user,"I will only join registered channels."); } return; } m = chanExists.matcher(event.getMessage()); if (m.find()) { String channel = m.group(1).toLowerCase(); String username = queue.remove(channel); System.out.println(String.format("[invite] [exists] %s -> %s", username, channel)); if (username != null) joinChannel(event.getBot(), channel, username); } } @Override public void onServerResponse(ServerResponseEvent<ShockyBot> event) throws Exception { if (event.getCode() == 401 && !queue.isEmpty()) { String[] tokens = event.getResponse().split("\\s+"); if (!tokens[1].equals("ChanServ")) return; Iterator<Entry<String, String>> iter = queue.entrySet().iterator(); while(iter.hasNext()) { Entry<String, String> entry = iter.next(); joinChannel(event.getBot(), entry.getKey(), entry.getValue()); iter.remove(); } } } private void joinChannel(PircBotX bot, String channel, String username) { try { MultiChannel.join(channel); } catch (Exception e) { if (username != null) { e.printStackTrace(); User user = bot.getUser(username); if (user != null) Shocky.sendNotice(bot,user,"I'm already in channel "+channel); } } } }