Show estimated time left on running downloads.
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Thu, 8 Aug 2013 00:20:14 +0000 (02:20 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Thu, 8 Aug 2013 00:20:14 +0000 (02:20 +0200)
src/main/java/net/pterodactylus/xdcc/ui/stdin/CommandReader.java

index 5feabd7..26696f9 100644 (file)
@@ -139,15 +139,15 @@ public class CommandReader extends AbstractExecutionThreadService {
                                        }
                                        writer.write(String.format("[%d] %s from %s (%s, ", counter++, dccReceiver.filename(), download.bot().name(), f(dccReceiver.size())));
                                        if (dccReceiver.isRunning()) {
-                                               writer.write(String.format("%.1f%%, %s", dccReceiver.progress() * 100.0 / dccReceiver.size(), f(dccReceiver.currentRate())));
+                                               writer.write(String.format("%.1f%%, %s/s, %s", dccReceiver.progress() * 100.0 / dccReceiver.size(), f(dccReceiver.currentRate()), getTimeLeft(dccReceiver)));
                                        } else {
                                                if (dccReceiver.progress() >= dccReceiver.size()) {
-                                                       writer.write(String.format("complete, %s", f(dccReceiver.overallRate())));
+                                                       writer.write(String.format("complete, %s/s", f(dccReceiver.overallRate())));
                                                } else {
-                                                       writer.write(String.format("aborted at %.1f%%, %s", dccReceiver.progress() * 100.0 / dccReceiver.size(), f(dccReceiver.currentRate())));
+                                                       writer.write(String.format("aborted at %.1f%%, %s/s", dccReceiver.progress() * 100.0 / dccReceiver.size(), f(dccReceiver.currentRate())));
                                                }
                                        }
-                                       writer.write("/s)\n");
+                                       writer.write(")\n");
                                }
                                writeLine("End of DCCs.");
                        } else if (words[0].equalsIgnoreCase("get")) {
@@ -315,6 +315,25 @@ public class CommandReader extends AbstractExecutionThreadService {
                return String.format("%dB", number);
        }
 
+       /**
+        * Returns the estimated time left for the given transfer.
+        *
+        * @param dccReceiver
+        *              The DCC receiver to get the time left for
+        * @return The time left for the transfer, or “unknown” if the time can not be
+        *         estimated
+        */
+       private static String getTimeLeft(DccReceiver dccReceiver) {
+               if ((dccReceiver.size() == -1) || (dccReceiver.currentRate() == 0)) {
+                       return "unknown";
+               }
+               long secondsLeft = (dccReceiver.size() - dccReceiver.progress()) / dccReceiver.currentRate();
+               if (secondsLeft > 3600) {
+                       return String.format("%02d:%02d:%02d", secondsLeft / 3600, (secondsLeft / 60) % 60, secondsLeft % 60);
+               }
+               return String.format("%02d:%02d", (secondsLeft / 60) % 60, secondsLeft % 60);
+       }
+
        /** Container for result information. */
        private static class Result implements Comparable<Result> {