import java.util.Map;
import java.util.Set;
import java.util.UUID;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.pterodactylus.util.template.TemplateParser;
import net.pterodactylus.util.template.TemplateProvider;
import net.pterodactylus.util.template.XmlFilter;
-import net.pterodactylus.util.thread.Ticker;
import net.pterodactylus.util.web.RedirectPage;
import net.pterodactylus.util.web.StaticPage;
import net.pterodactylus.util.web.TemplatePage;
private final Map<Sone, TemplateNotification> soneInsertNotifications = new HashMap<Sone, TemplateNotification>();
/** Sone locked notification ticker objects. */
- private final Map<Sone, Object> lockedSonesTickerObjects = Collections.synchronizedMap(new HashMap<Sone, Object>());
+ private final Map<Sone, ScheduledFuture<?>> lockedSonesTickerObjects = Collections.synchronizedMap(new HashMap<Sone, ScheduledFuture<?>>());
/** The “Sone locked” notification. */
private final ListNotification<Sone> lockedSonesNotification;
/** The “image insert failed” notification. */
private final ListNotification<Image> imageInsertFailedNotification;
+ /** Scheduled executor for time-based notifications. */
+ private final ScheduledExecutorService ticker = Executors.newScheduledThreadPool(1);
+
/**
* Creates a new web interface.
*
final TemplateNotification startupNotification = new TemplateNotification("startup-notification", startupNotificationTemplate);
notificationManager.addNotification(startupNotification);
- Ticker.getInstance().registerEvent(System.currentTimeMillis() + (120 * 1000), new Runnable() {
+ ticker.schedule(new Runnable() {
@Override
public void run() {
startupNotification.dismiss();
}
- }, "Sone Startup Notification Remover");
+ }, 2, TimeUnit.MINUTES);
Template wotMissingNotificationTemplate = TemplateParser.parse(createReader("/templates/notify/wotMissingNotification.html"));
final TemplateNotification wotMissingNotification = new TemplateNotification("wot-missing-notification", wotMissingNotificationTemplate);
- Ticker.getInstance().registerEvent(System.currentTimeMillis() + (15 * 1000), new Runnable() {
+ ticker.scheduleAtFixedRate(new Runnable() {
@Override
@SuppressWarnings("synthetic-access")
} else {
notificationManager.addNotification(wotMissingNotification);
}
- Ticker.getInstance().registerEvent(System.currentTimeMillis() + (15 * 1000), this, "Sone WoT Connector Checker");
}
- }, "Sone WoT Connector Checker");
+ }, 15, 15, TimeUnit.SECONDS);
}
/**
*/
public void stop() {
unregisterToadlets();
- Ticker.getInstance().stop();
+ ticker.shutdownNow();
}
//
}
}
+ 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
//
}
if (!hasFirstStartNotification()) {
notificationManager.addNotification(isLocal ? localReplyNotification : newReplyNotification);
- if (!getMentionedSones(reply.getText()).isEmpty() && !isLocal && (reply.getPost().getSone() != null) && (reply.getTime() <= System.currentTimeMillis())) {
- mentionNotification.add(reply.getPost());
+ if (reply.getPost().isPresent() && localSoneMentionedInNewPostOrReply(reply.getPost().get())) {
+ mentionNotification.add(reply.getPost().get());
notificationManager.addNotification(mentionNotification);
}
} else {
public void markPostKnown(MarkPostKnownEvent markPostKnownEvent) {
newPostNotification.remove(markPostKnownEvent.post());
localPostNotification.remove(markPostKnownEvent.post());
- mentionNotification.remove(markPostKnownEvent.post());
+ if (!localSoneMentionedInNewPostOrReply(markPostKnownEvent.post())) {
+ mentionNotification.remove(markPostKnownEvent.post());
+ }
}
/**
*/
@Subscribe
public void markReplyKnown(MarkPostReplyKnownEvent markPostReplyKnownEvent) {
- newReplyNotification.remove(markPostReplyKnownEvent.postReply());
- localReplyNotification.remove(markPostReplyKnownEvent.postReply());
- mentionNotification.remove(markPostReplyKnownEvent.postReply().getPost());
+ PostReply postReply = markPostReplyKnownEvent.postReply();
+ newReplyNotification.remove(postReply);
+ localReplyNotification.remove(postReply);
+ if (postReply.getPost().isPresent() && !localSoneMentionedInNewPostOrReply(postReply.getPost().get())) {
+ mentionNotification.remove(postReply.getPost().get());
+ }
}
/**
public void postRemoved(PostRemovedEvent postRemovedEvent) {
newPostNotification.remove(postRemovedEvent.post());
localPostNotification.remove(postRemovedEvent.post());
- mentionNotification.remove(postRemovedEvent.post());
+ if (!localSoneMentionedInNewPostOrReply(postRemovedEvent.post())) {
+ mentionNotification.remove(postRemovedEvent.post());
+ }
}
/**
PostReply reply = postReplyRemovedEvent.postReply();
newReplyNotification.remove(reply);
localReplyNotification.remove(reply);
- if (!getMentionedSones(reply.getText()).isEmpty()) {
- boolean isMentioned = false;
- for (PostReply existingReply : getCore().getReplies(reply.getPost())) {
- isMentioned |= !reply.isKnown() && !getMentionedSones(existingReply.getText()).isEmpty();
- }
- if (!isMentioned) {
- mentionNotification.remove(reply.getPost());
- }
+ if (reply.getPost().isPresent() && !localSoneMentionedInNewPostOrReply(reply.getPost().get())) {
+ mentionNotification.remove(reply.getPost().get());
}
}
@Subscribe
public void soneLocked(SoneLockedEvent soneLockedEvent) {
final Sone sone = soneLockedEvent.sone();
- Object tickerObject = Ticker.getInstance().registerEvent(System.currentTimeMillis() + (5 * 60) * 1000, new Runnable() {
+ ScheduledFuture<?> tickerObject = ticker.schedule(new Runnable() {
@Override
@SuppressWarnings("synthetic-access")
public void run() {
lockedSonesNotification.add(sone);
- lockedSonesTickerObjects.remove(sone);
notificationManager.addNotification(lockedSonesNotification);
}
- }, "Sone Locked Notification");
+ }, 5, TimeUnit.MINUTES);
lockedSonesTickerObjects.put(sone, tickerObject);
}
@Subscribe
public void soneUnlocked(SoneUnlockedEvent soneUnlockedEvent) {
lockedSonesNotification.remove(soneUnlockedEvent.sone());
- Ticker.getInstance().deregisterEvent(lockedSonesTickerObjects.remove(soneUnlockedEvent.sone()));
+ lockedSonesTickerObjects.remove(soneUnlockedEvent.sone()).cancel(false);
}
/**