import java.util.Collection;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
import net.pterodactylus.sone.template.ParserFilter;
import net.pterodactylus.sone.template.RenderFilter;
import net.pterodactylus.sone.template.ShortenFilter;
-import net.pterodactylus.sone.text.Part;
-import net.pterodactylus.sone.text.SonePart;
-import net.pterodactylus.sone.text.SoneTextParser;
import net.pterodactylus.sone.text.TimeTextConverter;
import net.pterodactylus.sone.web.ajax.BookmarkAjaxPage;
import net.pterodactylus.sone.web.ajax.CreatePostAjaxPage;
import com.codahale.metrics.*;
import com.google.common.base.Optional;
-import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableSet;
import com.google.common.eventbus.Subscribe;
import com.google.inject.Inject;
private final TemplateContextFactory templateContextFactory;
private final TemplateRenderer templateRenderer;
- /** The Sone text parser. */
- private final SoneTextParser soneTextParser;
-
/** The parser filter. */
private final ParserFilter parserFilter;
private final ShortenFilter shortenFilter;
/** The invisible “local reply” notification. */
private final ListNotification<PostReply> localReplyNotification;
- /** The “you have been mentioned” notification. */
- private final ListNotification<Post> mentionNotification;
-
/** Notifications for sone inserts. */
private final Map<Sone, TemplateNotification> soneInsertNotifications = new HashMap<>();
LinkedElementRenderFilter linkedElementRenderFilter,
PageToadletRegistry pageToadletRegistry, MetricRegistry metricRegistry, Translation translation, L10nFilter l10nFilter,
NotificationManager notificationManager, @Named("newRemotePost") ListNotification<Post> newPostNotification,
- @Named("localPost") ListNotification<Post> localPostNotification) {
+ @Named("newRemotePostReply") ListNotification<PostReply> newReplyNotification,
+ @Named("localPost") ListNotification<Post> localPostNotification,
+ @Named("localReply") ListNotification<PostReply> localReplyNotification) {
this.sonePlugin = sonePlugin;
this.loaders = loaders;
this.listNotificationFilter = listNotificationFilter;
this.translation = translation;
this.notificationManager = notificationManager;
this.newPostNotification = newPostNotification;
+ this.newReplyNotification = newReplyNotification;
this.localPostNotification = localPostNotification;
+ this.localReplyNotification = localReplyNotification;
formPassword = sonePlugin.pluginRespirator().getToadletContainer().getFormPassword();
- soneTextParser = new SoneTextParser(getCore(), getCore());
this.templateContextFactory = templateContextFactory;
templateContextFactory.addTemplateObject("webInterface", this);
templateContextFactory.addTemplateObject("formPassword", formPassword);
-
- /* create notifications. */
- Template newReplyNotificationTemplate = loaders.loadTemplate("/templates/notify/newReplyNotification.html");
- newReplyNotification = new ListNotification<>("new-reply-notification", "replies", newReplyNotificationTemplate, false);
-
- Template localReplyNotificationTemplate = loaders.loadTemplate("/templates/notify/newReplyNotification.html");
- localReplyNotification = new ListNotification<>("local-reply-notification", "replies", localReplyNotificationTemplate, false);
-
- Template mentionNotificationTemplate = loaders.loadTemplate("/templates/notify/mentionNotification.html");
- mentionNotification = new ListNotification<>("mention-notification", "posts", mentionNotificationTemplate, false);
}
//
}
/**
- * Returns all {@link Sone#isLocal() local Sone}s that are referenced by
- * {@link SonePart}s in the given text (after parsing it using
- * {@link SoneTextParser}).
- *
- * @param text
- * The text to parse
- * @return All mentioned local Sones
- */
- private Collection<Sone> getMentionedSones(String text) {
- /* we need no context to find mentioned Sones. */
- Set<Sone> mentionedSones = new HashSet<>();
- for (Part part : soneTextParser.parse(text, null)) {
- if (part instanceof SonePart) {
- mentionedSones.add(((SonePart) part).getSone());
- }
- }
- return Collections2.filter(mentionedSones, Sone.LOCAL_SONE_FILTER);
- }
-
- /**
* Returns the Sone insert notification for the given Sone. If no
* notification for the given Sone exists, a new notification is created and
* cached.
}
}
- private boolean localSoneMentionedInNewPostOrReply(Post post) {
- if (!post.getSone().isLocal()) {
- if (!getMentionedSones(post.getText()).isEmpty() && !post.isKnown()) {
- return true;
- }
- }
- for (PostReply postReply : getCore().getReplies(post.getId())) {
- if (postReply.getSone().isLocal()) {
- continue;
- }
- if (!getMentionedSones(postReply.getText()).isEmpty() && !postReply.isKnown()) {
- return true;
- }
- }
- return false;
- }
-
//
// EVENT HANDLERS
//
- /**
- * Notifies the web interface that a new {@link Post} was found.
- *
- * @param newPostFoundEvent
- * The event
- */
- @Subscribe
- public void newPostFound(NewPostFoundEvent newPostFoundEvent) {
- Post post = newPostFoundEvent.getPost();
- boolean isLocal = post.getSone().isLocal();
- if (!hasFirstStartNotification()) {
- if (!getMentionedSones(post.getText()).isEmpty() && !isLocal) {
- mentionNotification.add(post);
- notificationManager.addNotification(mentionNotification);
- }
- }
- }
-
- /**
- * Notifies the web interface that a new {@link PostReply} was found.
- *
- * @param newPostReplyFoundEvent
- * The event
- */
- @Subscribe
- public void newReplyFound(NewPostReplyFoundEvent newPostReplyFoundEvent) {
- PostReply reply = newPostReplyFoundEvent.getPostReply();
- boolean isLocal = reply.getSone().isLocal();
- if (isLocal) {
- localReplyNotification.add(reply);
- } else {
- newReplyNotification.add(reply);
- }
- if (!hasFirstStartNotification()) {
- notificationManager.addNotification(isLocal ? localReplyNotification : newReplyNotification);
- if (reply.getPost().isPresent() && localSoneMentionedInNewPostOrReply(reply.getPost().get())) {
- mentionNotification.add(reply.getPost().get());
- notificationManager.addNotification(mentionNotification);
- }
- } else {
- getCore().markReplyKnown(reply);
- }
- }
-
@Subscribe
public void markPostKnown(MarkPostKnownEvent markPostKnownEvent) {
removePost(markPostKnownEvent.getPost());
}
@Subscribe
- public void markReplyKnown(MarkPostReplyKnownEvent markPostReplyKnownEvent) {
- removeReply(markPostReplyKnownEvent.getPostReply());
- }
-
- @Subscribe
public void postRemoved(PostRemovedEvent postRemovedEvent) {
removePost(postRemovedEvent.getPost());
}
private void removePost(Post post) {
newPostNotification.remove(post);
- if (!localSoneMentionedInNewPostOrReply(post)) {
- mentionNotification.remove(post);
- }
- }
-
- @Subscribe
- public void replyRemoved(PostReplyRemovedEvent postReplyRemovedEvent) {
- removeReply(postReplyRemovedEvent.getPostReply());
- }
-
- private void removeReply(PostReply reply) {
- newReplyNotification.remove(reply);
- localReplyNotification.remove(reply);
- if (reply.getPost().isPresent() && !localSoneMentionedInNewPostOrReply(reply.getPost().get())) {
- mentionNotification.remove(reply.getPost().get());
- }
}
/**