Print escape characters to logger
[xudocci.git] / src / main / java / net / pterodactylus / irc / DefaultConnection.java
index cca6aed..194caf7 100644 (file)
@@ -30,10 +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;
 
@@ -63,7 +67,6 @@ import net.pterodactylus.irc.util.RandomNickname;
 import net.pterodactylus.xdcc.util.io.BandwidthCountingInputStream;
 import net.pterodactylus.xdcc.util.io.BandwidthCountingOutputStream;
 
-import com.google.common.base.Optional;
 import com.google.common.eventbus.EventBus;
 import com.google.common.eventbus.Subscribe;
 import com.google.common.io.Closeables;
@@ -107,19 +110,20 @@ public class DefaultConnection extends AbstractExecutionThreadService implements
        private String nickname = null;
 
        /** The username. */
-       private Optional<String> username = Optional.absent();
+       private Optional<String> username = Optional.empty();
 
        /** The real name. */
-       private Optional<String> realName = Optional.absent();
+       private Optional<String> realName = Optional.empty();
 
        /** The optional password for the connection. */
-       private Optional<String> password = Optional.absent();
+       private Optional<String> password = Optional.empty();
 
        /** The connection handler. */
        private ConnectionHandler connectionHandler;
 
        /** Whether the connection has already been established. */
        private final AtomicBoolean established = new AtomicBoolean();
+       private final AtomicReference<Instant> connectionTime = new AtomicReference<>();
 
        /**
         * Creates a new connection.
@@ -167,19 +171,19 @@ public class DefaultConnection extends AbstractExecutionThreadService implements
 
        @Override
        public Connection username(String username) {
-               this.username = Optional.fromNullable(username);
+               this.username = Optional.ofNullable(username);
                return this;
        }
 
        @Override
        public Connection realName(String realName) {
-               this.realName = Optional.fromNullable(realName);
+               this.realName = Optional.ofNullable(realName);
                return this;
        }
 
        @Override
        public Connection password(String password) {
-               this.password = Optional.fromNullable(password);
+               this.password = Optional.ofNullable(password);
                return this;
        }
 
@@ -230,6 +234,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
        //
@@ -358,6 +369,7 @@ public class DefaultConnection extends AbstractExecutionThreadService implements
        @Subscribe
        public void connectionEstablished(ConnectionEstablished connectionEstablished) {
                if (connectionEstablished.connection() == this) {
+                       connectionTime.set(Instant.now());
                        established.set(true);
                }
        }
@@ -367,7 +379,7 @@ public class DefaultConnection extends AbstractExecutionThreadService implements
        //
 
        /**
-        * Returns an item from the list, or {@link Optional#absent()} if the list is
+        * Returns an item from the list, or {@link Optional#empty()} if the list is
         * shorter than required for the given index.
         *
         * @param list
@@ -377,13 +389,13 @@ public class DefaultConnection extends AbstractExecutionThreadService implements
         * @param <T>
         *              The type of the list items
         * @return This list item wrapped in an {@link Optional}, or {@link
-        *         Optional#absent()} if the list is not long enough
+        *         Optional#empty()} if the list is not long enough
         */
        private static <T> Optional<T> getOptional(List<T> list, int index) {
                if (index < list.size()) {
-                       return Optional.fromNullable(list.get(index));
+                       return Optional.ofNullable(list.get(index));
                }
-               return Optional.absent();
+               return Optional.empty();
        }
 
        /** Handles input and output for the connection. */
@@ -488,11 +500,23 @@ public class DefaultConnection extends AbstractExecutionThreadService implements
                                commandBuilder.append(parameter);
                        }
 
-                       logger.trace(String.format(">> %s", commandBuilder));
+                       logger.trace(String.format(">> %s", addEscapeCharacters(commandBuilder)));
                        outputStream.write((commandBuilder.toString() + "\r\n").getBytes("UTF-8"));
                        outputStream.flush();
                }
 
+               private String addEscapeCharacters(StringBuilder commandBuilder) {
+                       StringBuilder escaped = new StringBuilder();
+                       for (char c : commandBuilder.toString().toCharArray()) {
+                               if (c < 32) {
+                                       escaped.append("\\CTRL[").append((int) c).append("]");
+                               } else {
+                                       escaped.append(c);
+                               }
+                       }
+                       return escaped.toString();
+               }
+
                /**
                 * Reads a line of reply from the connection.
                 *