X-Git-Url: https://git.pterodactylus.net/?p=rhynodge.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Frhynodge%2Ftriggers%2FNewTorrentTrigger.java;h=12c7f8cc7f181cf4aa2fd5c525d078b6f8c55155;hp=2803bb5c653782788b58ab5077075013a7dae086;hb=9c01d55d3969a1b3df6529df0c64d4feb146fe4d;hpb=9871b8a902d59f6e8eade050d18c77026b6ecc60 diff --git a/src/main/java/net/pterodactylus/rhynodge/triggers/NewTorrentTrigger.java b/src/main/java/net/pterodactylus/rhynodge/triggers/NewTorrentTrigger.java index 2803bb5..12c7f8c 100644 --- a/src/main/java/net/pterodactylus/rhynodge/triggers/NewTorrentTrigger.java +++ b/src/main/java/net/pterodactylus/rhynodge/triggers/NewTorrentTrigger.java @@ -20,6 +20,7 @@ package net.pterodactylus.rhynodge.triggers; import static com.google.common.base.Preconditions.checkState; import java.util.List; +import java.util.Set; import net.pterodactylus.rhynodge.Reaction; import net.pterodactylus.rhynodge.State; @@ -32,6 +33,7 @@ import net.pterodactylus.rhynodge.states.TorrentState.TorrentFile; import org.apache.commons.lang3.StringEscapeUtils; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; /** * {@link Trigger} implementation that is triggered by {@link TorrentFile}s that @@ -41,30 +43,44 @@ import com.google.common.collect.Lists; */ public class NewTorrentTrigger implements Trigger { + /** All known torrents. */ + private final Set allTorrentFiles = Sets.newHashSet(); + /** The newly detected torrent files. */ - private List torrentFiles = Lists.newArrayList(); + private final List newTorrentFiles = Lists.newArrayList(); // // TRIGGER METHODS // /** - * {@inheritDoc} + * {@inheritDocs} */ @Override - public boolean triggers(State currentState, State previousState) { + public State mergeStates(State previousState, State currentState) { checkState(currentState instanceof TorrentState, "currentState is not a TorrentState but a %s", currentState.getClass().getName()); checkState(previousState instanceof TorrentState, "previousState is not a TorrentState but a %s", currentState.getClass().getName()); TorrentState currentTorrentState = (TorrentState) currentState; TorrentState previousTorrentState = (TorrentState) previousState; - torrentFiles.clear(); + + allTorrentFiles.clear(); + newTorrentFiles.clear(); + allTorrentFiles.addAll(previousTorrentState.torrentFiles()); for (TorrentFile torrentFile : currentTorrentState) { - torrentFiles.add(torrentFile); - } - for (TorrentFile torrentFile : previousTorrentState) { - torrentFiles.remove(torrentFile); + if (allTorrentFiles.add(torrentFile)) { + newTorrentFiles.add(torrentFile); + } } - return !torrentFiles.isEmpty(); + + return new TorrentState(allTorrentFiles); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean triggers() { + return !newTorrentFiles.isEmpty(); } /** @@ -72,9 +88,9 @@ public class NewTorrentTrigger implements Trigger { */ @Override public Output output(Reaction reaction) { - DefaultOutput output = new DefaultOutput(String.format("Found %d new Torrent(s) for “%s!”", torrentFiles.size(), reaction.name())); - output.addText("text/plain", getPlainTextList(torrentFiles)); - output.addText("text/html", getHtmlTextList(torrentFiles)); + DefaultOutput output = new DefaultOutput(String.format("Found %d new Torrent(s) for “%s!”", newTorrentFiles.size(), reaction.name())); + output.addText("text/plain", getPlainTextList(newTorrentFiles)); + output.addText("text/html", getHtmlTextList(newTorrentFiles)); return output; }