X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fxdcc%2Fui%2Fstdin%2FCommandReader.java;h=37149562faa48c0c86c14df2dfe27f9cb774ce7f;hb=5a07d92f9e4b871f1e2b8beab56e52ed35d9d44c;hp=9cd2a12cc4b18d89ae07e6ee0da7cb14ddcfa80f;hpb=2d0f3614a96b0d8f7d5666c65ab80b3cbf5349ec;p=xudocci.git diff --git a/src/main/java/net/pterodactylus/xdcc/ui/stdin/CommandReader.java b/src/main/java/net/pterodactylus/xdcc/ui/stdin/CommandReader.java index 9cd2a12..3714956 100644 --- a/src/main/java/net/pterodactylus/xdcc/ui/stdin/CommandReader.java +++ b/src/main/java/net/pterodactylus/xdcc/ui/stdin/CommandReader.java @@ -17,6 +17,9 @@ package net.pterodactylus.xdcc.ui.stdin; +import static net.pterodactylus.xdcc.data.Download.BY_NAME; +import static net.pterodactylus.xdcc.data.Download.BY_RUNNING; + import java.io.BufferedReader; import java.io.IOException; import java.io.Reader; @@ -44,7 +47,9 @@ import net.pterodactylus.xdcc.data.Pack; import com.google.common.base.Predicate; import com.google.common.collect.ComparisonChain; +import com.google.common.collect.FluentIterable; import com.google.common.collect.Lists; +import com.google.common.collect.Ordering; import com.google.common.collect.Sets; import com.google.common.eventbus.Subscribe; import com.google.common.primitives.Ints; @@ -125,7 +130,7 @@ public class CommandReader extends AbstractExecutionThreadService { writeLine("End of Search."); } else if (words[0].equalsIgnoreCase("dcc")) { int counter = 0; - for (Download download : core.downloads()) { + for (Download download : FluentIterable.from(core.downloads()).toSortedList(Ordering.from(BY_NAME).compound(BY_RUNNING))) { DccReceiver dccReceiver = download.dccReceiver(); if (dccReceiver == null) { /* download has not even started. */ @@ -134,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")) { @@ -150,6 +155,11 @@ public class CommandReader extends AbstractExecutionThreadService { if ((index != null) && (index < lastResult.size())) { core.fetch(lastResult.get(index).bot(), lastResult.get(index).pack()); } + } else if (words[0].equalsIgnoreCase("cancel")) { + Integer index = Ints.tryParse(words[1]); + if ((index != null) && (index < lastResult.size())) { + core.cancelDownload(lastResult.get(index).bot(), lastResult.get(index).pack()); + } } else if (words[0].equalsIgnoreCase("stats")) { int configuredChannelsCount = core.channels().size(); int joinedChannelsCount = core.joinedChannels().size(); @@ -310,6 +320,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 {