package org.pircbotx; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import pl.shockah.shocky.interfaces.ILogger; public class ShockyBot extends PircBotX { private static final List<ILogger> loggers = new ArrayList<ILogger>(); public ShockyBot() { super(); } @Override public ShockyChannel getChannel(String name) { if (name == null) throw new NullPointerException("Can't get a null channel"); for (Channel curChan : this.userChanInfo.getAValues()) { if (curChan.getName().equals(name)) { return (ShockyChannel) curChan; } } ShockyChannel chan = new ShockyChannel(this, name); this.userChanInfo.putB(chan); return chan; } @Override public ShockyUser getUser(String nick) { if (nick == null) throw new NullPointerException("Can't get a null user"); if (this.userNickMap.containsKey(nick)) return (ShockyUser) this.userNickMap.get(nick); ShockyUser user = new ShockyUser(this, nick); this.userChanInfo.putA(user); return user; } @Override public Set<User> getUsers(Channel chan) { if (chan == null) throw new NullPointerException("Can't get a null channel"); if (!chan.getName().startsWith("#")) { this.userChanInfo.deleteA(chan); return Collections.emptySet(); } return super.getUsers(chan); } public String getChannelPrefixes() { return channelPrefixes; } public static void addLogger(ILogger logger) { synchronized(loggers) { loggers.add(logger); } } public static void removeLogger(ILogger logger) { synchronized(loggers) { loggers.remove(logger); } } @Override public void log(String line) { super.log(line); synchronized(loggers) { if (loggers.isEmpty()) return; for (int i = loggers.size() - 1; i >= 0; --i) { try { loggers.get(i).log(line); } catch (IOException e) { e.printStackTrace(); } } } } private static final String[] restrictedCmds = new String[] { "FLAGS", "INVITE", "OP", "RECOVER", "REGISTER", "SET", "UNBAN", "AKICK", "BAN", "CLEAR", "COUNT", "DEOP", "DEVOICE", "DF", "DROP", "GETKEY", "HELP", "INFO", "KICK", "KICKBAN", "NAMEGEN", "QUIET", "ROLL", "STATUS", "TAXONOMY", "TEMPLATE", "TOPIC", "TOPICAPPEND", "TOPICPREPEND", "UNQUIET", "VOICE", "WHY", "WOD", "ACT", "ASSIGN", "BOTLIST", "SAY", "UNASSIGN" }; private static boolean isRestricted(String message) { if (message == null || message.isEmpty()) return true; if (message.charAt(0) != '!') return false; for (int i = 0; i < restrictedCmds.length; ++i) { String s = restrictedCmds[i]; int endIndex = 1+s.length(); if (message.length() >= endIndex && message.substring(1, endIndex).equalsIgnoreCase(s)) return true; } return false; } @Override public void sendMessage(String target, String message) { if (!isRestricted(message)) super.sendMessage(target, message); } }