X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Frhynodge%2Ftriggers%2FNewEpisodeTrigger.java;h=4b1d2090817a89ec9315bafb9cd59d96229a3f1b;hb=5d962b76adef88663cfa4acc093836c71fe9dd82;hp=ea15c8757f8280ec52389df18d23691f796c36ca;hpb=6d8a3475d8e56cea63d53d456baef434318223a7;p=rhynodge.git diff --git a/src/main/java/net/pterodactylus/rhynodge/triggers/NewEpisodeTrigger.java b/src/main/java/net/pterodactylus/rhynodge/triggers/NewEpisodeTrigger.java index ea15c87..4b1d209 100644 --- a/src/main/java/net/pterodactylus/rhynodge/triggers/NewEpisodeTrigger.java +++ b/src/main/java/net/pterodactylus/rhynodge/triggers/NewEpisodeTrigger.java @@ -17,30 +17,20 @@ package net.pterodactylus.rhynodge.triggers; -import static com.google.common.base.Preconditions.checkState; - +import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.Map; -import java.util.Map.Entry; -import net.pterodactylus.rhynodge.Reaction; import net.pterodactylus.rhynodge.State; import net.pterodactylus.rhynodge.Trigger; -import net.pterodactylus.rhynodge.output.DefaultOutput; -import net.pterodactylus.rhynodge.output.Output; import net.pterodactylus.rhynodge.states.EpisodeState; import net.pterodactylus.rhynodge.states.EpisodeState.Episode; import net.pterodactylus.rhynodge.states.TorrentState.TorrentFile; -import org.apache.commons.lang3.StringEscapeUtils; - -import com.google.common.base.Function; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Ordering; -import com.google.common.collect.Sets; +import static com.google.common.base.Preconditions.checkState; +import static java.util.function.Function.identity; +import static java.util.stream.Collectors.toMap; /** * {@link Trigger} implementation that compares two {@link EpisodeState}s for @@ -50,21 +40,7 @@ import com.google.common.collect.Sets; */ public class NewEpisodeTrigger implements Trigger { - /** All episodes. */ - private final Collection allEpisodes = Sets.newHashSet(); - - /** All new episodes. */ - private final Collection newEpisodes = Sets.newHashSet(); - - /** All changed episodes. */ - private final Collection changedEpisodes = Sets.newHashSet(); - - /** All new torrent files. */ - private final Collection newTorrentFiles = Sets.newHashSet(); - - // - // TRIGGER METHODS - // + private boolean triggered = false; /** * {@inheritDoc} @@ -73,24 +49,19 @@ public class NewEpisodeTrigger implements Trigger { public State mergeStates(State previousState, State currentState) { checkState(currentState instanceof EpisodeState, "currentState is not a EpisodeState but a %s", currentState.getClass().getName()); checkState(previousState instanceof EpisodeState, "previousState is not a EpisodeState but a %s", currentState.getClass().getName()); - newEpisodes.clear(); - changedEpisodes.clear(); - this.allEpisodes.clear(); - newTorrentFiles.clear(); - Map allEpisodes = Maps.newHashMap(FluentIterable.from(((EpisodeState) previousState).episodes()).toMap(new Function() { - @Override - public Episode apply(Episode episode) { - return episode; - } - })); + Collection newEpisodes = new HashSet<>(); + Collection changedEpisodes = new HashSet<>(); + Collection newTorrentFiles = new HashSet<>(); + Map allEpisodes = ((EpisodeState) previousState).episodes().stream().collect(toMap(identity(), identity())); for (Episode episode : ((EpisodeState) currentState).episodes()) { if (!allEpisodes.containsKey(episode)) { allEpisodes.put(episode, episode); newEpisodes.add(episode); + triggered = true; } Episode existingEpisode = allEpisodes.get(episode); - for (TorrentFile torrentFile : Lists.newArrayList(episode.torrentFiles())) { + for (TorrentFile torrentFile : new ArrayList<>(episode.torrentFiles())) { int oldSize = existingEpisode.torrentFiles().size(); existingEpisode.addTorrentFile(torrentFile); int newSize = existingEpisode.torrentFiles().size(); @@ -102,8 +73,7 @@ public class NewEpisodeTrigger implements Trigger { } } } - this.allEpisodes.addAll(allEpisodes.values()); - return new EpisodeState(this.allEpisodes); + return new EpisodeState(allEpisodes.values(), newEpisodes, changedEpisodes, newTorrentFiles); } /** @@ -111,155 +81,7 @@ public class NewEpisodeTrigger implements Trigger { */ @Override public boolean triggers() { - return !newEpisodes.isEmpty() || !changedEpisodes.isEmpty(); - } - - /** - * {@inheritDoc} - */ - @Override - public Output output(Reaction reaction) { - String summary; - if (!newEpisodes.isEmpty()) { - if (!changedEpisodes.isEmpty()) { - summary = String.format("%d new and %d changed Torrent(s) for “%s!”", newEpisodes.size(), changedEpisodes.size(), reaction.name()); - } else { - summary = String.format("%d new Torrent(s) for “%s!”", newEpisodes.size(), reaction.name()); - } - } else { - summary = String.format("%d changed Torrent(s) for “%s!”", changedEpisodes.size(), reaction.name()); - } - DefaultOutput output = new DefaultOutput(summary); - output.addText("text/plain", generatePlainText(reaction)); - output.addText("text/html", generateHtmlText(reaction)); - return output; - } - - // - // PRIVATE METHODS - // - - /** - * Generates the plain text trigger output. - * - * @param reaction - * The reaction that was triggered - * @return The plain text output - */ - private String generatePlainText(Reaction reaction) { - StringBuilder stringBuilder = new StringBuilder(); - if (!newEpisodes.isEmpty()) { - stringBuilder.append(reaction.name()).append(" - New Episodes\n\n"); - for (Episode episode : newEpisodes) { - stringBuilder.append("- ").append(episode.identifier()).append("\n"); - for (TorrentFile torrentFile : episode) { - stringBuilder.append(" - ").append(torrentFile.name()).append(", ").append(torrentFile.size()).append("\n"); - if ((torrentFile.magnetUri() != null) && (torrentFile.magnetUri().length() > 0)) { - stringBuilder.append(" Magnet: ").append(torrentFile.magnetUri()).append("\n"); - } - if ((torrentFile.downloadUri() != null) && (torrentFile.downloadUri().length() > 0)) { - stringBuilder.append(" Download: ").append(torrentFile.downloadUri()).append("\n"); - } - } - } - } - if (!changedEpisodes.isEmpty()) { - stringBuilder.append(reaction.name()).append(" - Changed Episodes\n\n"); - for (Episode episode : changedEpisodes) { - stringBuilder.append("- ").append(episode.identifier()).append("\n"); - for (TorrentFile torrentFile : episode) { - stringBuilder.append(" - ").append(torrentFile.name()).append(", ").append(torrentFile.size()).append("\n"); - if ((torrentFile.magnetUri() != null) && (torrentFile.magnetUri().length() > 0)) { - stringBuilder.append(" Magnet: ").append(torrentFile.magnetUri()).append("\n"); - } - if ((torrentFile.downloadUri() != null) && (torrentFile.downloadUri().length() > 0)) { - stringBuilder.append(" Download: ").append(torrentFile.downloadUri()).append("\n"); - } - } - } - } - /* list all known episodes. */ - stringBuilder.append(reaction.name()).append(" - All Known Episodes\n\n"); - ImmutableMap> episodesBySeason = FluentIterable.from(allEpisodes).index(new Function() { - - @Override - public Integer apply(Episode episode) { - return episode.season(); - } - }).asMap(); - for (Entry> seasonEntry : episodesBySeason.entrySet()) { - stringBuilder.append(" Season ").append(seasonEntry.getKey()).append("\n\n"); - for (Episode episode : Ordering.natural().sortedCopy(seasonEntry.getValue())) { - stringBuilder.append(" Episode ").append(episode.episode()).append("\n"); - for (TorrentFile torrentFile : episode) { - stringBuilder.append(" Size: ").append(torrentFile.size()); - stringBuilder.append(" in ").append(torrentFile.fileCount()).append(" file(s): "); - stringBuilder.append(torrentFile.magnetUri()); - } - } - } - - return stringBuilder.toString(); - } - - /** - * Generates the HTML trigger output. - * - * @param reaction - * The reaction that was triggered - * @return The HTML output - */ - private String generateHtmlText(Reaction reaction) { - StringBuilder htmlBuilder = new StringBuilder(); - htmlBuilder.append("\n"); - /* show all known episodes. */ - htmlBuilder.append("\n\n"); - htmlBuilder.append("\n"); - htmlBuilder.append(""); - htmlBuilder.append(""); - htmlBuilder.append(""); - htmlBuilder.append(""); - htmlBuilder.append(""); - htmlBuilder.append(""); - htmlBuilder.append(""); - htmlBuilder.append(""); - htmlBuilder.append(""); - htmlBuilder.append(""); - htmlBuilder.append("\n"); - htmlBuilder.append("\n"); - htmlBuilder.append("\n"); - Episode lastEpisode = null; - for (Entry> seasonEntry : FluentIterable.from(Ordering.natural().reverse().sortedCopy(allEpisodes)).index(Episode.BY_SEASON).asMap().entrySet()) { - for (Episode episode : seasonEntry.getValue()) { - for (TorrentFile torrentFile : episode) { - if (newEpisodes.contains(episode)) { - htmlBuilder.append(""); - } else if (newTorrentFiles.contains(torrentFile)) { - htmlBuilder.append(""); - } else { - htmlBuilder.append(""); - } - if ((lastEpisode == null) || !lastEpisode.equals(episode)) { - htmlBuilder.append(""); - } else { - htmlBuilder.append(""); - } - htmlBuilder.append(""); - htmlBuilder.append(""); - htmlBuilder.append(""); - htmlBuilder.append(""); - htmlBuilder.append(""); - htmlBuilder.append(""); - htmlBuilder.append(""); - htmlBuilder.append("\n"); - lastEpisode = episode; - } - } - } - htmlBuilder.append("\n"); - htmlBuilder.append("
All Known Episodes
SeasonEpisodeFilenameSizeFile(s)SeedsLeechersMagnetDownload
").append(episode.season()).append("").append(episode.episode()).append("").append(StringEscapeUtils.escapeHtml4(torrentFile.name())).append("").append(StringEscapeUtils.escapeHtml4(torrentFile.size())).append("").append(torrentFile.fileCount()).append("").append(torrentFile.seedCount()).append("").append(torrentFile.leechCount()).append("LinkLink
\n"); - htmlBuilder.append("\n"); - return htmlBuilder.toString(); + return triggered; } }