X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Firc%2FConnection.java;h=530b0c7e8f2698e57d693627fa4f7b7c24394358;hb=99a4d802fbf7593c62c5cc36620e68cfc0b8c4b6;hp=88059ba2ab8b7ce8a56eca0a688cab278ddacc3e;hpb=aca69685f3104359aca1474d96d632b9ef09f2be;p=xudocci.git diff --git a/src/main/java/net/pterodactylus/irc/Connection.java b/src/main/java/net/pterodactylus/irc/Connection.java index 88059ba..530b0c7 100644 --- a/src/main/java/net/pterodactylus/irc/Connection.java +++ b/src/main/java/net/pterodactylus/irc/Connection.java @@ -44,6 +44,7 @@ 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; @@ -56,6 +57,7 @@ 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.UnknownReplyReceived; import net.pterodactylus.irc.util.RandomNickname; @@ -332,77 +334,25 @@ public class Connection extends AbstractExecutionThreadService implements Servic String message = parameters.get(1); if (message.startsWith("\u0001") && message.endsWith("\u0001")) { /* CTCP! */ - 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, reply.source().get(), messageWords[2], inetAddress.get(), port.get(), fileSize)); - } else { - logger.warning(String.format("Received malformed DCC SEND: “%s”", message)); - } - } else if (messageWords[1].equalsIgnoreCase("ACCEPT")) { - Optional port = Optional.fromNullable(Ints.tryParse(messageWords[3])); - long position = Optional.fromNullable(Longs.tryParse(messageWords[4])).or(-1L); - if (port.isPresent()) { - eventBus.post(new DccAcceptReceived(this, reply.source().get(), messageWords[2], port.get(), position)); - } else { - logger.warning(String.format("Received malformed DCC ACCEPT: “%s”", message)); - } - } - } + 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)); } - /* replies 001-004 don’t hold information but they have to be sent on a successful connection. */ - } else if (command.equals("001")) { - connectionStatus |= 0x01; - } else if (command.equals("002")) { - connectionStatus |= 0x02; - } else if (command.equals("003")) { - connectionStatus |= 0x04; - } else if (command.equals("004")) { - connectionStatus |= 0x08; - - /* 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.fine(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.fine(String.format("Parsed Channel Types: %s", channelTypes)); - } + } 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)); } - /* 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); - /* 43x replies are for nick change errors. */ } else if (command.equals("431")) { eventBus.post(new NoNicknameGivenReceived(this, reply)); @@ -453,6 +403,49 @@ public class Connection extends AbstractExecutionThreadService implements Servic } else if (command.equalsIgnoreCase("PING")) { connectionHandler.sendCommand("PONG", getOptional(parameters, 0), getOptional(parameters, 1)); + /* replies 001-004 don’t hold information but they have to be sent on a successful connection. */ + } else if (command.equals("001")) { + connectionStatus |= 0x01; + } else if (command.equals("002")) { + connectionStatus |= 0x02; + } else if (command.equals("003")) { + connectionStatus |= 0x04; + } else if (command.equals("004")) { + connectionStatus |= 0x08; + + /* 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.fine(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.fine(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); + /* okay, everything else. */ } else { eventBus.post(new UnknownReplyReceived(this, reply)); @@ -486,6 +479,39 @@ 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.warning(String.format("Received malformed DCC SEND: “%s”", message)); + } + } else if (messageWords[1].equalsIgnoreCase("ACCEPT")) { + Optional port = Optional.fromNullable(Ints.tryParse(messageWords[3])); + long position = Optional.fromNullable(Longs.tryParse(messageWords[4])).or(-1L); + if (port.isPresent()) { + eventBus.post(new DccAcceptReceived(this, client, messageWords[2], port.get(), position)); + } else { + logger.warning(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. *