import net.pterodactylus.irc.DccReceiver;
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
import com.google.common.base.Predicate;
/**
}
};
+ /**
+ * Converts a download into the number of seconds left in the transfer at the
+ * current rate.
+ */
+ public static final Function<Download, Optional<Long>> SECONDS_LEFT = new Function<Download, Optional<Long>>() {
+ @Override
+ public Optional<Long> apply(Download download) {
+ DccReceiver dccReceiver = download.dccReceiver();
+ if ((dccReceiver == null) || (dccReceiver.size() == -1) || (dccReceiver.currentRate() == 0)) {
+ return Optional.absent();
+ }
+ long secondsLeft = (dccReceiver.size() - dccReceiver.progress()) / dccReceiver.currentRate();
+ return Optional.of(secondsLeft);
+ }
+ };
+
/** The bot that is being downloaded from. */
private final Bot bot;
import net.pterodactylus.xdcc.data.Download;
import com.google.common.base.Joiner;
+import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.eventbus.Subscribe;
return String.format("%dB", number);
}
+ /**
+ * Formats the given number of seconds into a more easily readable string.
+ *
+ * @param seconds
+ * The number of seconds
+ * @return The formatted time, or “unknown” if the time is unknown
+ */
+ static String t(Optional<Long> seconds) {
+ if (!seconds.isPresent()) {
+ return "unknown";
+ }
+ if (seconds.get() > 3600) {
+ return String.format("%02d:%02d:%02d", seconds.get() / 3600, (seconds.get() / 60) % 60, seconds.get() % 60);
+ }
+ return String.format("%02d:%02d", (seconds.get() / 60) % 60, seconds.get() % 60);
+ }
+
}
import static java.util.Arrays.asList;
import static net.pterodactylus.xdcc.data.Download.BY_NAME;
import static net.pterodactylus.xdcc.data.Download.BY_RUNNING;
+import static net.pterodactylus.xdcc.data.Download.SECONDS_LEFT;
import static net.pterodactylus.xdcc.ui.stdin.CommandReader.f;
+import static net.pterodactylus.xdcc.ui.stdin.CommandReader.t;
import java.io.IOException;
import java.io.Writer;
}
outputWriter.write(String.format("[%d] %s from %s (%s, ", counter++, dccReceiver.filename(), download.bot().name(), f(dccReceiver.size())));
if (dccReceiver.isRunning()) {
- outputWriter.write(String.format("%.1f%%, %s/s, %s", dccReceiver.progress() * 100.0 / dccReceiver.size(), f(dccReceiver.currentRate()), getTimeLeft(dccReceiver)));
+ outputWriter.write(String.format("%.1f%%, %s/s, %s", dccReceiver.progress() * 100.0 / dccReceiver.size(), f(dccReceiver.currentRate()), t(SECONDS_LEFT.apply(download))));
} else {
if (dccReceiver.progress() >= dccReceiver.size()) {
outputWriter.write(String.format("complete, %s/s", f(dccReceiver.overallRate())));
return state.setLastDownloads(downloads);
}
- //
- // PRIVATE METHODS
- //
-
- /**
- * 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);
- }
-
}