X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Firc%2FConnection.java;h=30344be9b2c831023ce74edf1a2b8e7e0446d0fd;hb=1aa7f843043b8723a02b4bbd88eb21ae8b7db881;hp=86de5354d28183649892d8020e9e6869fe2e266b;hpb=e4793dbb593cf8babe654ed9311eae466d4e6291;p=xudocci.git diff --git a/src/main/java/net/pterodactylus/irc/Connection.java b/src/main/java/net/pterodactylus/irc/Connection.java index 86de535..30344be 100644 --- a/src/main/java/net/pterodactylus/irc/Connection.java +++ b/src/main/java/net/pterodactylus/irc/Connection.java @@ -29,42 +29,34 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.UnsupportedEncodingException; -import java.net.InetAddress; import java.net.Socket; -import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import javax.net.SocketFactory; +import net.pterodactylus.irc.connection.ChannelNickHandler; import net.pterodactylus.irc.connection.ChannelNotJoinedHandler; import net.pterodactylus.irc.connection.ConnectionEstablishHandler; +import net.pterodactylus.irc.connection.CtcpHandler; import net.pterodactylus.irc.connection.Handler; +import net.pterodactylus.irc.connection.MessageHandler; +import net.pterodactylus.irc.connection.MotdHandler; +import net.pterodactylus.irc.connection.PrefixHandler; +import net.pterodactylus.irc.connection.SimpleCommandHandler; import net.pterodactylus.irc.event.ChannelJoined; import net.pterodactylus.irc.event.ChannelLeft; -import net.pterodactylus.irc.event.ChannelMessageReceived; -import net.pterodactylus.irc.event.ChannelNicknames; -import net.pterodactylus.irc.event.ChannelNotJoined; -import net.pterodactylus.irc.event.ChannelNotJoined.Reason; -import net.pterodactylus.irc.event.ChannelNoticeReceived; import net.pterodactylus.irc.event.ChannelTopic; import net.pterodactylus.irc.event.ClientQuit; import net.pterodactylus.irc.event.ConnectionClosed; import net.pterodactylus.irc.event.ConnectionEstablished; import net.pterodactylus.irc.event.ConnectionFailed; -import net.pterodactylus.irc.event.DccAcceptReceived; -import net.pterodactylus.irc.event.DccSendReceived; import net.pterodactylus.irc.event.KickedFromChannel; -import net.pterodactylus.irc.event.MotdReceived; import net.pterodactylus.irc.event.NicknameChanged; import net.pterodactylus.irc.event.NicknameInUseReceived; import net.pterodactylus.irc.event.NoNicknameGivenReceived; -import net.pterodactylus.irc.event.PrivateMessageReceived; -import net.pterodactylus.irc.event.PrivateNoticeReceived; import net.pterodactylus.irc.event.ReplyReceived; import net.pterodactylus.irc.event.UnknownReplyReceived; import net.pterodactylus.irc.util.RandomNickname; @@ -72,13 +64,9 @@ import net.pterodactylus.xdcc.util.io.BandwidthCountingInputStream; import net.pterodactylus.xdcc.util.io.BandwidthCountingOutputStream; import com.google.common.base.Optional; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; import com.google.common.io.Closeables; -import com.google.common.primitives.Ints; -import com.google.common.primitives.Longs; import com.google.common.util.concurrent.AbstractExecutionThreadService; import com.google.common.util.concurrent.Service; import org.apache.log4j.Logger; @@ -374,19 +362,23 @@ public class Connection extends AbstractExecutionThreadService implements Servic /* now read replies and react. */ try { /* some status variables. */ - int oldConnectionStatus = 0; - int connectionStatus = 0; boolean connected = true; - StringBuilder motd = new StringBuilder(); - Set nicks = Sets.newHashSet(); - - /* server modes. */ - Map nickPrefixes = Maps.newHashMap(); - Set channelTypes = Sets.newHashSet(); + PrefixHandler prefixHandler = new PrefixHandler(); List handlers = asList( + new MessageHandler(eventBus, this, prefixHandler), + new CtcpHandler(eventBus, this), + new ChannelNickHandler(eventBus, this, prefixHandler), + new SimpleCommandHandler() + .addCommand("431", (s, p) -> eventBus.post( + new NoNicknameGivenReceived(this))) + .addCommand("NICK", (s, p) -> eventBus.post( + new NicknameChanged(this, s.get(), + p.get(0)))), + new MotdHandler(eventBus, this), + new ChannelNotJoinedHandler(eventBus, this), new ConnectionEstablishHandler(eventBus, this), - new ChannelNotJoinedHandler(eventBus, this) + prefixHandler ); while (connected) { @@ -403,46 +395,15 @@ public class Connection extends AbstractExecutionThreadService implements Servic } } - /* most common events. */ - if (command.equalsIgnoreCase("PRIVMSG")) { - String recipient = parameters.get(0); - String message = parameters.get(1); - if (message.startsWith("\u0001") && message.endsWith("\u0001")) { - /* CTCP! */ - handleCtcp(reply.source().get(), message); - } else if (!channelTypes.contains(recipient.charAt(0))) { - eventBus.post(new PrivateMessageReceived(this, reply.source().get(), message)); - } else { - eventBus.post(new ChannelMessageReceived(this, recipient, reply.source().get(), message)); - } - - } else if (command.equalsIgnoreCase("NOTICE")) { - String recipient = parameters.get(0); - String message = parameters.get(1); - if (message.startsWith("\u0001") && message.endsWith("\u0001")) { - /* CTCP! */ - handleCtcp(reply.source().get(), message); - } else if (!channelTypes.contains(recipient.charAt(0))) { - eventBus.post(new PrivateNoticeReceived(this, reply)); - } else { - eventBus.post(new ChannelNoticeReceived(this, reply.source().get(), recipient, message)); - } - /* 43x replies are for nick change errors. */ - } else if (command.equals("431")) { - eventBus.post(new NoNicknameGivenReceived(this, reply)); - } else if (command.equals("433")) { - if (connectionStatus == 0) { + if (command.equals("433")) { + if (!established.get()) { nickname = nicknameChooser.getNickname(); connectionHandler.sendCommand("NICK", nickname); } else { eventBus.post(new NicknameInUseReceived(this, reply)); } - /* client stuff. */ - } else if (command.equalsIgnoreCase("NICK")) { - eventBus.post(new NicknameChanged(this, reply.source().get(), parameters.get(0))); - /* channel stuff. */ } else if (command.equalsIgnoreCase("JOIN")) { eventBus.post(new ChannelJoined(this, parameters.get(0), reply.source().get())); @@ -450,17 +411,6 @@ public class Connection extends AbstractExecutionThreadService implements Servic /* no topic is set. */ } else if (command.equals("332")) { eventBus.post(new ChannelTopic(this, parameters.get(1), parameters.get(2))); - } else if (command.equals("353")) { - for (String nickname : parameters.get(3).split(" ")) { - if (nickPrefixes.containsKey(nickname.substring(0, 1))) { - nicks.add(new Nickname(nickname.substring(1), nickname.substring(0, 1))); - } else { - nicks.add(new Nickname(nickname, "")); - } - } - } else if (command.equals("366")) { - eventBus.post(new ChannelNicknames(this, parameters.get(1), nicks)); - nicks.clear(); } else if (command.equalsIgnoreCase("PART")) { eventBus.post(new ChannelLeft(this, parameters.get(0), reply.source().get(), getOptional(parameters, 1))); } else if (command.equalsIgnoreCase("QUIT")) { @@ -470,39 +420,6 @@ public class Connection extends AbstractExecutionThreadService implements Servic } else if (command.equalsIgnoreCase("PING")) { connectionHandler.sendCommand("PONG", getOptional(parameters, 0), getOptional(parameters, 1)); - /* 005 originally was a bounce message, now used to transmit useful information about the server. */ - } else if (command.equals("005")) { - for (String parameter : parameters) { - if (parameter.startsWith("PREFIX=")) { - int openParen = parameter.indexOf('('); - int closeParen = parameter.indexOf(')'); - if ((openParen != -1) && (closeParen != -1)) { - for (int modeCharacterIndex = 1; modeCharacterIndex < (closeParen - openParen); ++modeCharacterIndex) { - char modeCharacter = parameter.charAt(openParen + modeCharacterIndex); - char modeSymbol = parameter.charAt(closeParen + modeCharacterIndex); - nickPrefixes.put(String.valueOf(modeSymbol), String.valueOf(modeCharacter)); - } - logger.debug(String.format("Parsed Prefixes: %s", nickPrefixes)); - } - } else if (parameter.startsWith("CHANTYPES=")) { - for (int typeIndex = 10; typeIndex < parameter.length(); ++typeIndex) { - channelTypes.add(parameter.charAt(typeIndex)); - } - logger.debug(String.format("Parsed Channel Types: %s", channelTypes)); - } - } - - /* 375, 372, and 376 handle the server’s MOTD. */ - } else if (command.equals("375")) { - /* MOTD starts. */ - motd.append(parameters.get(1)).append('\n'); - } else if (command.equals("372")) { - motd.append(parameters.get(1)).append('\n'); - } else if (command.equals("376")) { - motd.append(parameters.get(1)).append('\n'); - eventBus.post(new MotdReceived(this, motd.toString())); - motd.setLength(0); - } else if (command.equalsIgnoreCase("KICK")) { eventBus.post(new KickedFromChannel(this, parameters.get(0), reply.source().get(), parameters.get(1), getOptional(parameters, 2))); @@ -543,39 +460,6 @@ public class Connection extends AbstractExecutionThreadService implements Servic // /** - * Handles a CTCP message. - * - * @param client - * The client sending the message - * @param message - * The message - */ - private void handleCtcp(Source client, String message) { - String[] messageWords = message.substring(1, message.length() - 1).split(" +"); - String ctcpCommand = messageWords[0]; - if (ctcpCommand.equalsIgnoreCase("DCC")) { - if (messageWords[1].equalsIgnoreCase("SEND")) { - Optional inetAddress = parseInetAddress(messageWords[3]); - Optional port = Optional.fromNullable(Ints.tryParse(messageWords[4])); - long fileSize = Optional.fromNullable(Longs.tryParse(messageWords[5])).or(-1L); - if (inetAddress.isPresent() && port.isPresent()) { - eventBus.post(new DccSendReceived(this, client, messageWords[2], inetAddress.get(), port.get(), fileSize)); - } else { - logger.warn(String.format("Received malformed DCC SEND: “%s”", message)); - } - } else if (messageWords[1].equalsIgnoreCase("ACCEPT")) { - Optional port = Optional.fromNullable(Ints.tryParse(messageWords[3])); - long position = (messageWords.length > 4) ? Optional.fromNullable(Longs.tryParse(messageWords[4])).or(-1L) : -1; - if (port.isPresent()) { - eventBus.post(new DccAcceptReceived(this, client, messageWords[2], port.get(), position)); - } else { - logger.warn(String.format("Received malformed DCC ACCEPT: “%s”", message)); - } - } - } - } - - /** * Returns an item from the list, or {@link Optional#absent()} if the list is * shorter than required for the given index. * @@ -595,32 +479,6 @@ public class Connection extends AbstractExecutionThreadService implements Servic return Optional.absent(); } - /** - * Parses the given {@code ip} and returns an {@link InetAddress} from it. - * - * @param ip - * The IP to parse - * @return The parsed inet address, or {@link Optional#absent()} if no inet - * address could be parsed - */ - private Optional parseInetAddress(String ip) { - Long ipNumber = Longs.tryParse(ip); - if (ipNumber == null) { - return Optional.absent(); - } - - StringBuilder hostname = new StringBuilder(15); - hostname.append((ipNumber >>> 24) & 0xff).append('.'); - hostname.append((ipNumber >>> 16) & 0xff).append('.'); - hostname.append((ipNumber >>> 8) & 0xff).append('.'); - hostname.append(ipNumber & 0xff); - try { - return Optional.of(InetAddress.getByName(hostname.toString())); - } catch (UnknownHostException uhe1) { - return Optional.absent(); - } - } - /** Handles input and output for the connection. */ private class ConnectionHandler implements Closeable {