package net.pterodactylus.xdcc.ui.stdin;
+import static com.google.common.collect.Lists.newArrayList;
import static net.pterodactylus.xdcc.data.Download.BY_NAME;
import static net.pterodactylus.xdcc.data.Download.BY_RUNNING;
protected void run() throws Exception {
String lastLine = "";
String line;
- final List<Result> lastResult = Lists.newArrayList();
- final List<Download> downloads = Lists.newArrayList();
- final List<Connection> lastConnections = Lists.newArrayList();
+ State state = new State();
while ((line = reader.readLine()) != null) {
if (line.equals("")) {
line = lastLine;
}
String[] words = line.split(" +");
if (words[0].equalsIgnoreCase("search")) {
- lastResult.clear();
- for (Bot bot : Lists.newArrayList(core.bots())) {
- for (Pack pack : Lists.newArrayList(bot)) {
+ List<Result> lastResult = newArrayList();
+ for (Bot bot : newArrayList(core.bots())) {
+ for (Pack pack : newArrayList(bot)) {
boolean found = true;
for (int wordIndex = 1; wordIndex < words.length; ++wordIndex) {
if (words[wordIndex].startsWith("-") && pack.name().toLowerCase().contains(words[wordIndex].toLowerCase().substring(1))) {
writeLine(String.format("[%d] %s (%s) from %s (#%s) on %s", counter++, result.pack().name(), result.pack().size(), result.bot().name(), result.pack().id(), result.bot().network().name()));
}
writeLine("End of Search.");
+ state = state.setLastResults(lastResult);
} else if (words[0].equalsIgnoreCase("dcc")) {
int counter = 0;
- downloads.clear();
- downloads.addAll(FluentIterable.from(core.downloads()).toSortedList(Ordering.from(BY_NAME).compound(BY_RUNNING)));
+ List<Download> downloads = newArrayList(FluentIterable.from(core.downloads()).toSortedList(Ordering.from(BY_NAME).compound(BY_RUNNING)));
for (Download download : downloads) {
DccReceiver dccReceiver = download.dccReceiver();
if (dccReceiver == null) {
writer.write(")\n");
}
writeLine("End of DCCs.");
+ state = state.setLastDownloads(downloads);
} else if (words[0].equalsIgnoreCase("get")) {
Integer index = Ints.tryParse(words[1]);
- if ((index != null) && (index < lastResult.size())) {
- core.fetch(lastResult.get(index).bot(), lastResult.get(index).pack());
+ if ((index != null) && (index < state.getLastResults().size())) {
+ core.fetch(state.getLastResults().get(index).bot(), state.getLastResults().get(index).pack());
}
} else if (words[0].equalsIgnoreCase("cancel")) {
Integer index = Ints.tryParse(words[1]);
- if ((index != null) && (index < downloads.size())) {
- core.cancelDownload(downloads.get(index).bot(), downloads.get(index).pack());
+ if ((index != null) && (index < state.getLastDownloads().size())) {
+ core.cancelDownload(state.getLastDownloads().get(index).bot(), state.getLastDownloads().get(index).pack());
}
} else if (words[0].equalsIgnoreCase("stats")) {
int configuredChannelsCount = core.channels().size();
writeLine(String.format("%d channels (%d joined, %d extra), %d bots offering %d packs (%d unique).", configuredChannelsCount, joinedChannelsCount, extraChannelsCount, bots.size(), packsCount, packNames.size()));
} else if (words[0].equalsIgnoreCase("connections")) {
- lastConnections.clear();
+ List<Connection> lastConnections = newArrayList();
int counter = 0;
for (Connection connection : core.connections()) {
lastConnections.add(connection);
writer.write(String.format("[%d] %s:%d, %s/s\n", counter++, connection.hostname(), connection.port(), f(connection.getInputRate())));
}
writeLine("End of connections.");
+ state = state.setLastConnections(lastConnections);
} else if (words[0].equalsIgnoreCase("disconnect")) {
if ((words.length == 1) || ("all".equals(words[1]))) {
- for (Connection connection : lastConnections) {
+ for (Connection connection : state.getLastConnections()) {
core.closeConnection(connection);
}
} else {
Integer index = Ints.tryParse(words[1]);
- if ((index != null) && (index < lastConnections.size())) {
- core.closeConnection(lastConnections.get(index));
+ if ((index != null) && (index < state.getLastConnections().size())) {
+ core.closeConnection(state.getLastConnections().get(index));
}
}
}
}
+ /**
+ * Container for the current state of the command reader.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+ private static class State {
+
+ /** The last connections displayed. */
+ private final List<Connection> lastConnections;
+
+ /** The last results displayed. */
+ private final List<Result> lastResults;
+
+ /** The last downloads displayed. */
+ private final List<Download> lastDownloads;
+
+ public State() {
+ this(Lists.<Connection>newArrayList(), Lists.<Result>newArrayList(), Lists.<Download>newArrayList());
+ }
+
+ /**
+ * Creates a new state.
+ *
+ * @param lastConnections
+ * The last connections
+ * @param lastResults
+ * The last results
+ * @param lastDownloads
+ * The last downloads
+ */
+ private State(List<Connection> lastConnections, List<Result> lastResults, List<Download> lastDownloads) {
+ this.lastConnections = lastConnections;
+ this.lastResults = lastResults;
+ this.lastDownloads = lastDownloads;
+ }
+
+ //
+ // ACCESSORS
+ //
+
+ /**
+ * Returns the last connections displayed.
+ *
+ * @return The last connections displayed
+ */
+ public List<Connection> getLastConnections() {
+ return lastConnections;
+ }
+
+ /**
+ * Returns the last results displayed.
+ *
+ * @return The last results displayed
+ */
+ public List<Result> getLastResults() {
+ return lastResults;
+ }
+
+ /**
+ * Returns the last downloads displayed.
+ *
+ * @return The last downloads displayed
+ */
+ public List<Download> getLastDownloads() {
+ return lastDownloads;
+ }
+
+ //
+ // MUTATORS
+ //
+
+ /**
+ * Returns a new state with the given last connections and the last downloads
+ * and results of this state.
+ *
+ * @param lastConnections
+ * The new last connections displayed
+ * @return The new state
+ */
+ public State setLastConnections(List<Connection> lastConnections) {
+ return new State(lastConnections, lastResults, lastDownloads);
+ }
+
+ /**
+ * Returns a new state with the given last results and the last downloads and
+ * connections of this state.
+ *
+ * @param lastResults
+ * The new last results displayed
+ * @return The new state
+ */
+ public State setLastResults(List<Result> lastResults) {
+ return new State(lastConnections, lastResults, lastDownloads);
+ }
+
+ /**
+ * Returns a new state with the given last downloads and the last connections
+ * and results of this state.
+ *
+ * @param lastDownloads
+ * The new last downloads displayed
+ * @return The new state
+ */
+ public State setLastDownloads(List<Download> lastDownloads) {
+ return new State(lastConnections, lastResults, lastDownloads);
+ }
+
+ }
+
}