X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Firc%2FConnection.java;h=70ac0ebed6aebc1772b47fc09e85a1a171ea31d9;hb=bf5c410d06c7a354017ebcd321e365b9cd767081;hp=2feaec4b3f45b493245c68934eb0dd5c307b472b;hpb=380eca88742353dd1b2411c50e6bf1a964fe19c2;p=xudocci.git diff --git a/src/main/java/net/pterodactylus/irc/Connection.java b/src/main/java/net/pterodactylus/irc/Connection.java index 2feaec4..70ac0eb 100644 --- a/src/main/java/net/pterodactylus/irc/Connection.java +++ b/src/main/java/net/pterodactylus/irc/Connection.java @@ -35,8 +35,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; +import java.util.concurrent.TimeUnit; import javax.net.SocketFactory; import net.pterodactylus.irc.event.ChannelJoined; @@ -53,12 +52,14 @@ 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; import net.pterodactylus.xdcc.util.io.BandwidthCountingInputStream; @@ -73,6 +74,7 @@ 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; /** * A connection to an IRC server. @@ -148,6 +150,7 @@ public class Connection extends AbstractExecutionThreadService implements Servic /** * Returns the hostname of the remote end of the connection. + * * @return The remote’s hostname */ public String hostname() { @@ -156,6 +159,7 @@ public class Connection extends AbstractExecutionThreadService implements Servic /** * Returns the port number of the remote end of the connection. + * * @return The remote’s port number */ public int port() { @@ -322,7 +326,9 @@ public class Connection extends AbstractExecutionThreadService implements Servic * if an I/O error occurs */ public void close() throws IOException { - connectionHandler.close(); + if (connectionHandler != null) { + connectionHandler.close(); + } } // @@ -341,6 +347,7 @@ public class Connection extends AbstractExecutionThreadService implements Servic /* connect to remote socket. */ try { Socket socket = socketFactory.createSocket(hostname, port); + socket.setSoTimeout((int) TimeUnit.MINUTES.toMillis(3)); connectionHandler = new ConnectionHandler(socket.getInputStream(), socket.getOutputStream()); /* register connection. */ @@ -371,7 +378,8 @@ public class Connection extends AbstractExecutionThreadService implements Servic while (connected) { Reply reply = connectionHandler.readReply(); - logger.finest(String.format("<< %s", reply)); + eventBus.post(new ReplyReceived(this, reply)); + logger.trace(String.format("<< %s", reply)); String command = reply.command(); List parameters = reply.parameters(); @@ -472,13 +480,13 @@ public class Connection extends AbstractExecutionThreadService implements Servic char modeSymbol = parameter.charAt(closeParen + modeCharacterIndex); nickPrefixes.put(String.valueOf(modeSymbol), String.valueOf(modeCharacter)); } - logger.fine(String.format("Parsed Prefixes: %s", nickPrefixes)); + 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.fine(String.format("Parsed Channel Types: %s", channelTypes)); + logger.debug(String.format("Parsed Channel Types: %s", channelTypes)); } } @@ -493,6 +501,9 @@ public class Connection extends AbstractExecutionThreadService implements Servic eventBus.post(new MotdReceived(this, motd.toString())); motd.setLength(0); + } else if (command.equals("KICK")) { + eventBus.post(new KickedFromChannel(this, parameters.get(0), reply.source().get(), parameters.get(1), getOptional(parameters, 2))); + /* okay, everything else. */ } else { eventBus.post(new UnknownReplyReceived(this, reply)); @@ -507,8 +518,11 @@ public class Connection extends AbstractExecutionThreadService implements Servic } eventBus.post(new ConnectionClosed(this)); } catch (IOException ioe1) { - logger.log(Level.WARNING, "I/O error", ioe1); + logger.warn("I/O error", ioe1); eventBus.post(new ConnectionClosed(this, ioe1)); + } catch (RuntimeException re1) { + logger.error("Runtime error", re1); + eventBus.post(new ConnectionClosed(this, re1)); } finally { established = false; logger.info("Closing Connection."); @@ -544,15 +558,15 @@ public class Connection extends AbstractExecutionThreadService implements Servic 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)); + 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 = Optional.fromNullable(Longs.tryParse(messageWords[4])).or(-1L); + 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.warning(String.format("Received malformed DCC ACCEPT: “%s”", message)); + logger.warn(String.format("Received malformed DCC ACCEPT: “%s”", message)); } } } @@ -706,7 +720,7 @@ public class Connection extends AbstractExecutionThreadService implements Servic commandBuilder.append(parameter); } - logger.finest(String.format(">> %s", commandBuilder)); + logger.trace(String.format(">> %s", commandBuilder)); outputStream.write((commandBuilder.toString() + "\r\n").getBytes("UTF-8")); outputStream.flush(); } @@ -737,6 +751,7 @@ public class Connection extends AbstractExecutionThreadService implements Servic public void close() throws IOException { Closeables.close(outputStream, true); Closeables.close(inputStreamReader, true); + Closeables.close(inputStream, true); } }