X-Git-Url: https://git.pterodactylus.net/?p=xudocci.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Firc%2Fconnection%2FCtcpHandler.java;h=d5e07cf0b89f8b8243335885daa4fc979da849fa;hp=ff9757e426b1bcc5e58cac3d98ae077897e87f97;hb=329cfa999c0814d337900b5be19b5ff4f9ec8579;hpb=767b7be6c7e6f5a0d96895ab5019b7eca0982a59 diff --git a/src/main/java/net/pterodactylus/irc/connection/CtcpHandler.java b/src/main/java/net/pterodactylus/irc/connection/CtcpHandler.java index ff9757e..d5e07cf 100644 --- a/src/main/java/net/pterodactylus/irc/connection/CtcpHandler.java +++ b/src/main/java/net/pterodactylus/irc/connection/CtcpHandler.java @@ -66,26 +66,57 @@ public class CtcpHandler implements Handler { String ctcpCommand = messageWords[0]; if (ctcpCommand.equalsIgnoreCase("DCC")) { if (messageWords[1].equalsIgnoreCase("SEND")) { - Optional inetAddress = parseInetAddress(messageWords[3]); - Optional port = fromNullable(Ints.tryParse(messageWords[4])); - long fileSize = fromNullable(Longs.tryParse(messageWords[5])).or(-1L); - if (inetAddress.isPresent() && port.isPresent()) { - eventBus.post(new DccSendReceived(connection, client, messageWords[2], inetAddress.get(), port.get(), fileSize)); - } else { - logger.warn(format("Received malformed DCC SEND: “%s”", message)); - } + processDccSend(client, message, messageWords); } else if (messageWords[1].equalsIgnoreCase("ACCEPT")) { - Optional port = fromNullable(Ints.tryParse(messageWords[3])); - long position = (messageWords.length > 4) ? fromNullable(Longs.tryParse(messageWords[4])).or(-1L) : -1; - if (port.isPresent()) { - eventBus.post(new DccAcceptReceived(connection, client, messageWords[2], port.get(), position)); - } else { - logger.warn(format("Received malformed DCC ACCEPT: “%s”", message)); - } + processDccAccept(client, message, messageWords); } } } + private void processDccSend(Source client, String message, + String[] messageWords) { + Optional dccSendInformation = parseDccSendInformation(messageWords); + if (dccSendInformation.isPresent()) { + eventBus.post(new DccSendReceived(connection, client, + dccSendInformation.get().filename, + dccSendInformation.get().internetAddress, + dccSendInformation.get().port, + dccSendInformation.get().size)); + } else { + logger.warn(format("Received malformed DCC SEND: “%s”", message)); + } + } + + private Optional parseDccSendInformation(String[] messageWords) { + if (messageWords.length <5) { + return absent(); + } + Optional internetAddress = parseInetAddress(messageWords[3]); + Optional port = fromNullable(Ints.tryParse(messageWords[4])); + long fileSize = (messageWords.length > 5) ? fromNullable(Longs.tryParse(messageWords[5])).or(-1L) : -1; + if (!internetAddress.isPresent() || !port.isPresent()) { + return absent(); + } + return of(new DccSendInformation(messageWords[2], internetAddress.get(), port.get(), fileSize)); + } + + private static class DccSendInformation { + + private final String filename; + private final InetAddress internetAddress; + private final int port; + private final long size; + + private DccSendInformation(String filename, + InetAddress internetAddress, int port, long size) { + this.filename = filename; + this.internetAddress = internetAddress; + this.port = port; + this.size = size; + } + + } + private Optional parseInetAddress(String ip) { Long ipNumber = Longs.tryParse(ip); if (ipNumber == null) { @@ -104,4 +135,45 @@ public class CtcpHandler implements Handler { } } + private void processDccAccept(Source client, String message, + String[] messageWords) { + Optional dccAcceptInformation = parseDccAcceptInformation(messageWords); + if (dccAcceptInformation.isPresent()) { + eventBus.post(new DccAcceptReceived(connection, client, + dccAcceptInformation.get().filename, + dccAcceptInformation.get().port, + dccAcceptInformation.get().position)); + } else { + logger.warn(format("Received malformed DCC ACCEPT: “%s”", message)); + } + } + + private Optional parseDccAcceptInformation( + String[] messageWords) { + if (messageWords.length < 4) { + return absent(); + } + Optional port = fromNullable(Ints.tryParse(messageWords[3])); + long position = (messageWords.length > 4) ? fromNullable( + Longs.tryParse(messageWords[4])).or(-1L) : -1; + if (!port.isPresent()) { + return absent(); + } + return of(new DccAcceptInformation(messageWords[2], port.get(), position)); + } + + private static class DccAcceptInformation { + + private final String filename; + private final int port; + private final long position; + + private DccAcceptInformation(String filename, int port, long position) { + this.filename = filename; + this.port = port; + this.position = position; + } + + } + }