Move handling of the nicks sent on JOIN to its own handler.
[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.Nickname;
15 import net.pterodactylus.irc.Reply;
16
17 import com.google.common.eventbus.EventBus;
18 import org.apache.log4j.Logger;
19
20 /**
21  * Parses the server’s messages about which prefixes it understands for
22  * channels and nicknames.
23  *
24  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
25  */
26 public class PrefixHandler implements Handler {
27
28         private static final Logger logger =
29                         getLogger(PrefixHandler.class);
30
31         private final Map<String, String> nickPrefixes = new HashMap<>();
32         private final Set<Character> channelTypes = new HashSet<>();
33
34         @Override
35         public boolean willHandle(Reply reply) {
36                 return "005".equals(reply.command());
37         }
38
39         @Override
40         public void handleReply(Reply reply) {
41                 List<String> parameters = reply.parameters();
42
43                 for (String parameter : parameters) {
44                         if (parameter.startsWith("PREFIX=")) {
45                                 parseNickPrefixes(parameter);
46                         } else if (parameter.startsWith("CHANTYPES=")) {
47                                 parseChannelTypes(parameter);
48                         }
49                 }
50         }
51
52         public boolean isChannel(String receiver) {
53                 return channelTypes.contains(receiver.charAt(0));
54         }
55
56         public boolean isNickPrefixed(String nick) {
57                 return nickPrefixes.containsKey(nick.substring(0, 1));
58         }
59
60         public Nickname getNickname(String nicknameWithOptionalPrefix) {
61                 if (isNickPrefixed(nicknameWithOptionalPrefix)) {
62                         return new Nickname(nicknameWithOptionalPrefix.substring(1),
63                                         nicknameWithOptionalPrefix.substring(0, 1));
64                 }
65                 return new Nickname(nicknameWithOptionalPrefix, "");
66         }
67
68         private void parseNickPrefixes(String parameter) {
69                 int openParen = parameter.indexOf('(');
70                 int closeParen = parameter.indexOf(')');
71                 if ((openParen != -1) && (closeParen != -1)) {
72                         for (int modeCharacterIndex = 1;
73                                  modeCharacterIndex < (closeParen - openParen);
74                                  ++modeCharacterIndex) {
75                                 char modeCharacter = parameter.charAt(
76                                                 openParen + modeCharacterIndex);
77                                 char modeSymbol = parameter.charAt(
78                                                 closeParen + modeCharacterIndex);
79                                 nickPrefixes.put(valueOf(modeSymbol),
80                                                 valueOf(modeCharacter));
81                         }
82                         logger.debug(format("Parsed Prefixes: %s", nickPrefixes));
83                 }
84         }
85
86         private void parseChannelTypes(String parameter) {
87                 for (char channelType : parameter.substring(10).toCharArray()) {
88                         channelTypes.add(channelType);
89                 }
90                 logger.debug(format("Parsed Channel Types: %s", channelTypes));
91         }
92
93 }