import net.pterodactylus.irc.event.ChannelTopic;
import net.pterodactylus.irc.event.ConnectionEstablished;
import net.pterodactylus.irc.event.ConnectionFailed;
+import net.pterodactylus.irc.event.DccSendReceived;
import net.pterodactylus.irc.event.MotdReceived;
import net.pterodactylus.irc.event.NicknameInUseReceived;
import net.pterodactylus.irc.event.NoNicknameGivenReceived;
import com.google.common.collect.Sets;
import com.google.common.eventbus.EventBus;
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;
if (command.equalsIgnoreCase("PRIVMSG")) {
String recipient = parameters.get(0);
String message = parameters.get(1);
- if (!channelTypes.contains(recipient.charAt(0))) {
+ 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> inetAddress = parseInetAddress(messageWords[3]);
+ Optional<Integer> 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 (!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));