51e0b86b59db8fe6a80837aaa95bed3399d32777
[xudocci.git] / src / main / java / net / pterodactylus / irc / connection / PrefixHandler.java
1 package net.pterodactylus.irc.connection;
2
3 import static java.lang.String.format;
4 import static java.lang.String.valueOf;
5 import static org.apache.log4j.Logger.getLogger;
6
7 import java.util.HashMap;
8 import java.util.HashSet;
9 import java.util.List;
10 import java.util.Map;
11 import java.util.Set;
12
13 import net.pterodactylus.irc.Connection;
14 import net.pterodactylus.irc.Reply;
15
16 import com.google.common.eventbus.EventBus;
17 import org.apache.log4j.Logger;
18
19 /**
20  * Parses the server’s messages about which prefixes it understands for
21  * channels and nicknames.
22  *
23  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
24  */
25 public class PrefixHandler implements Handler {
26
27         private static final Logger logger =
28                         getLogger(PrefixHandler.class);
29
30         private final Map<String, String> nickPrefixes = new HashMap<>();
31         private final Set<Character> channelTypes = new HashSet<>();
32
33         @Override
34         public boolean willHandle(Reply reply) {
35                 return "005".equals(reply.command());
36         }
37
38         @Override
39         public void handleReply(Reply reply) {
40                 List<String> parameters = reply.parameters();
41
42                 for (String parameter : parameters) {
43                         if (parameter.startsWith("PREFIX=")) {
44                                 parseNickPrefixes(parameter);
45                         } else if (parameter.startsWith("CHANTYPES=")) {
46                                 parseChannelTypes(parameter);
47                         }
48                 }
49         }
50
51         public boolean isChannel(String receiver) {
52                 return channelTypes.contains(receiver.charAt(0));
53         }
54
55         public boolean isNickPrefixed(String nick) {
56                 return nickPrefixes.containsKey(nick.substring(0, 1));
57         }
58
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));
72                         }
73                         logger.debug(format("Parsed Prefixes: %s", nickPrefixes));
74                 }
75         }
76
77         private void parseChannelTypes(String parameter) {
78                 for (char channelType : parameter.substring(10).toCharArray()) {
79                         channelTypes.add(channelType);
80                 }
81                 logger.debug(format("Parsed Channel Types: %s", channelTypes));
82         }
83
84 }