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.Nickname;
15 import net.pterodactylus.irc.Reply;
17 import com.google.common.eventbus.EventBus;
18 import org.apache.log4j.Logger;
21 * Parses the server’s messages about which prefixes it understands for
22 * channels and nicknames.
24 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
26 public class PrefixHandler implements Handler {
28 private static final Logger logger =
29 getLogger(PrefixHandler.class);
31 private final Map<String, String> nickPrefixes = new HashMap<>();
32 private final Set<Character> channelTypes = new HashSet<>();
35 public boolean willHandle(Reply reply) {
36 return "005".equals(reply.command());
40 public void handleReply(Reply reply) {
41 List<String> parameters = reply.parameters();
43 for (String parameter : parameters) {
44 if (parameter.startsWith("PREFIX=")) {
45 parseNickPrefixes(parameter);
46 } else if (parameter.startsWith("CHANTYPES=")) {
47 parseChannelTypes(parameter);
52 public boolean isChannel(String receiver) {
53 return channelTypes.contains(receiver.charAt(0));
56 public boolean isNickPrefixed(String nick) {
57 return nickPrefixes.containsKey(nick.substring(0, 1));
60 public Nickname getNickname(String nicknameWithOptionalPrefix) {
61 if (isNickPrefixed(nicknameWithOptionalPrefix)) {
62 return new Nickname(nicknameWithOptionalPrefix.substring(1),
63 nicknameWithOptionalPrefix.substring(0, 1));
65 return new Nickname(nicknameWithOptionalPrefix, "");
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));
82 logger.debug(format("Parsed Prefixes: %s", nickPrefixes));
86 private void parseChannelTypes(String parameter) {
87 for (char channelType : parameter.substring(10).toCharArray()) {
88 channelTypes.add(channelType);
90 logger.debug(format("Parsed Channel Types: %s", channelTypes));