Show bandwidth in DCC information.
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Wed, 10 Apr 2013 20:35:49 +0000 (22:35 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Wed, 10 Apr 2013 20:35:49 +0000 (22:35 +0200)
src/main/java/net/pterodactylus/xdcc/ui/stdin/CommandReader.java

index ad6cde1..5221456 100644 (file)
@@ -110,7 +110,17 @@ public class CommandReader extends AbstractExecutionThreadService {
                        } else if (words[0].equalsIgnoreCase("dcc")) {
                                int counter = 0;
                                for (DccReceiver dccReceiver : core.dccReceivers()) {
-                                       writer.write(String.format("[%d] %s (%s, %d%%%s)\n", counter++, dccReceiver.filename(), dccReceiver.size(), dccReceiver.progress() * 100 / dccReceiver.size(), dccReceiver.isRunning() ? "" : ", finished"));
+                                       writer.write(String.format("[%d] %s (%s, ", counter++, dccReceiver.filename(), dccReceiver.size()));
+                                       if (dccReceiver.isRunning()) {
+                                               writer.write(String.format("%.1f%%, %s", dccReceiver.progress() * 100.0 / dccReceiver.size(), f(dccReceiver.getCurrentRate())));
+                                       } else {
+                                               if (dccReceiver.progress() >= dccReceiver.size()) {
+                                                       writer.write(String.format("complete, %s", f(dccReceiver.getOverallRate())));
+                                               } else {
+                                                       writer.write(String.format("aborted at %.1f%%, %s", dccReceiver.progress() * 100.0 / dccReceiver.size(), f(dccReceiver.getCurrentRate())));
+                                               }
+                                       }
+                                       writer.write("/s)\n");
                                }
                                writer.write("End of DCCs.\n");
                        } else if (words[0].equalsIgnoreCase("get")) {
@@ -140,6 +150,31 @@ public class CommandReader extends AbstractExecutionThreadService {
                }
        }
 
+       //
+       // PRIVATE METHODS
+       //
+
+       /**
+        * Converts large numbers into a human-friendly format, by showing SI prefixes
+        * for ×1024 (K), ×1048576 (M), and ×1073741824 (G).
+        *
+        * @param number
+        *              The number to convert
+        * @return The converted number
+        */
+       private static String f(long number) {
+               if (number >= (1 << 30)) {
+                       return String.format("%.1fG", number / (double) (1 << 30));
+               }
+               if (number >= (1 << 20)) {
+                       return String.format("%.1fM", number / (double) (1 << 20));
+               }
+               if (number >= (1 << 10)) {
+                       return String.format("%.1fK", number / (double) (1 << 10));
+               }
+               return String.format("%dB", number);
+       }
+
        /** Container for result information. */
        private static class Result implements Comparable<Result> {