🎨 Use method reference instead of anonymous class
[xudocci.git] / src / main / java / net / pterodactylus / irc / DefaultConnection.java
index 8fe4c4b..39908ef 100644 (file)
@@ -30,11 +30,14 @@ import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.Socket;
+import java.time.Duration;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
 
 import javax.net.SocketFactory;
 
@@ -95,13 +98,7 @@ public class DefaultConnection extends AbstractExecutionThreadService implements
        private final int port;
 
        /** The nickname chooser. */
-       private NicknameChooser nicknameChooser = new NicknameChooser() {
-
-               @Override
-               public String getNickname() {
-                       return RandomNickname.get();
-               }
-       };
+       private NicknameChooser nicknameChooser = RandomNickname::get;
 
        /** The nickname. */
        private String nickname = null;
@@ -120,6 +117,7 @@ public class DefaultConnection extends AbstractExecutionThreadService implements
 
        /** Whether the connection has already been established. */
        private final AtomicBoolean established = new AtomicBoolean();
+       private final AtomicReference<Instant> connectionTime = new AtomicReference<>();
 
        /**
         * Creates a new connection.
@@ -230,6 +228,13 @@ public class DefaultConnection extends AbstractExecutionThreadService implements
                }
        }
 
+       @Override
+       public java.util.Optional<Duration> getUptime() {
+               return established.get() ?
+                               java.util.Optional.of(Duration.between(connectionTime.get(), Instant.now())) :
+                               java.util.Optional.<Duration>empty();
+       }
+
        //
        // ABSTRACTEXECUTIONTHREADSERVICE METHODS
        //
@@ -305,7 +310,7 @@ public class DefaultConnection extends AbstractExecutionThreadService implements
                        while (connected) {
                                Reply reply = connectionHandler.readReply();
                                eventBus.post(new ReplyReceived(this, reply));
-                               logger.trace(String.format("<< %s", reply));
+                               logger.trace(String.format("<< %s", addEscapeCharacters(reply.toString())));
                                String command = reply.command();
                                List<String> parameters = reply.parameters();
 
@@ -345,7 +350,7 @@ public class DefaultConnection extends AbstractExecutionThreadService implements
                } finally {
                        established.set(false);
                        eventBus.unregister(this);
-                       logger.info("Closing Connection.");
+                       logger.info(String.format("Closing Connection to %s:%d.", hostname, port));
                        try {
                                Closeables.close(connectionHandler, true);
                        } catch (IOException ioe1) {
@@ -358,6 +363,7 @@ public class DefaultConnection extends AbstractExecutionThreadService implements
        @Subscribe
        public void connectionEstablished(ConnectionEstablished connectionEstablished) {
                if (connectionEstablished.connection() == this) {
+                       connectionTime.set(Instant.now());
                        established.set(true);
                }
        }
@@ -366,6 +372,18 @@ public class DefaultConnection extends AbstractExecutionThreadService implements
        // PRIVATE METHODS
        //
 
+       private String addEscapeCharacters(String line) {
+               StringBuilder escaped = new StringBuilder();
+               for (char c : line.toCharArray()) {
+                       if (c < 32) {
+                               escaped.append("\\CTRL[").append((int) c).append("]");
+                       } else {
+                               escaped.append(c);
+                       }
+               }
+               return escaped.toString();
+       }
+
        /**
         * Returns an item from the list, or {@link Optional#empty()} if the list is
         * shorter than required for the given index.
@@ -386,6 +404,11 @@ public class DefaultConnection extends AbstractExecutionThreadService implements
                return Optional.empty();
        }
 
+       @Override
+       public String toString() {
+               return String.format("→ %s:%d", hostname, port);
+       }
+
        /** Handles input and output for the connection. */
        private class ConnectionHandler implements Closeable {