1 package net.pterodactylus.irc.connection;
3 import static java.lang.String.format;
4 import static java.lang.String.valueOf;
5 import static org.apache.log4j.Logger.getLogger;
7 import java.util.HashMap;
8 import java.util.HashSet;
13 import net.pterodactylus.irc.Connection;
14 import net.pterodactylus.irc.Reply;
16 import com.google.common.eventbus.EventBus;
17 import org.apache.log4j.Logger;
20 * Parses the server’s messages about which prefixes it understands for
21 * channels and nicknames.
23 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
25 public class PrefixHandler implements Handler {
27 private static final Logger logger =
28 getLogger(PrefixHandler.class);
30 private final Map<String, String> nickPrefixes = new HashMap<>();
31 private final Set<Character> channelTypes = new HashSet<>();
34 public boolean willHandle(Reply reply) {
35 return "005".equals(reply.command());
39 public void handleReply(Reply reply) {
40 List<String> parameters = reply.parameters();
42 for (String parameter : parameters) {
43 if (parameter.startsWith("PREFIX=")) {
44 parseNickPrefixes(parameter);
45 } else if (parameter.startsWith("CHANTYPES=")) {
46 parseChannelTypes(parameter);
51 public boolean isChannel(String receiver) {
52 return channelTypes.contains(receiver.charAt(0));
55 public boolean isNickPrefixed(String nick) {
56 return nickPrefixes.containsKey(nick.substring(0, 1));
59 private void parseNickPrefixes(String parameter) {
60 int openParen = parameter.indexOf('(');
61 int closeParen = parameter.indexOf(')');
62 if ((openParen != -1) && (closeParen != -1)) {
63 for (int modeCharacterIndex = 1;
64 modeCharacterIndex < (closeParen - openParen);
65 ++modeCharacterIndex) {
66 char modeCharacter = parameter.charAt(
67 openParen + modeCharacterIndex);
68 char modeSymbol = parameter.charAt(
69 closeParen + modeCharacterIndex);
70 nickPrefixes.put(valueOf(modeSymbol),
71 valueOf(modeCharacter));
73 logger.debug(format("Parsed Prefixes: %s", nickPrefixes));
77 private void parseChannelTypes(String parameter) {
78 for (char channelType : parameter.substring(10).toCharArray()) {
79 channelTypes.add(channelType);
81 logger.debug(format("Parsed Channel Types: %s", channelTypes));