X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fweb%2FWebInterface.java;h=6085ff82c99ac6e2d2d562c5b4e44f1334695bed;hb=3abc078471d7e7516599eda01de011a23c328d63;hp=1612e285907f726530e14be5da29ff2067e7cdbb;hpb=85e6bdee8e9376766c131e85629b37a1dc0942e6;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/web/WebInterface.java b/src/main/java/net/pterodactylus/sone/web/WebInterface.java index 1612e28..6085ff8 100644 --- a/src/main/java/net/pterodactylus/sone/web/WebInterface.java +++ b/src/main/java/net/pterodactylus/sone/web/WebInterface.java @@ -23,8 +23,11 @@ import java.io.Reader; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.UUID; import java.util.logging.Level; @@ -71,6 +74,7 @@ import net.pterodactylus.sone.web.page.PageToadlet; import net.pterodactylus.sone.web.page.PageToadletFactory; import net.pterodactylus.sone.web.page.StaticPage; import net.pterodactylus.util.logging.Logging; +import net.pterodactylus.util.notify.Notification; import net.pterodactylus.util.notify.NotificationManager; import net.pterodactylus.util.notify.TemplateNotification; import net.pterodactylus.util.template.DateFilter; @@ -84,6 +88,7 @@ import net.pterodactylus.util.template.TemplateFactory; import net.pterodactylus.util.template.TemplateProvider; import net.pterodactylus.util.template.XmlFilter; import net.pterodactylus.util.thread.Ticker; +import net.pterodactylus.util.version.Version; import freenet.clients.http.SessionManager; import freenet.clients.http.SessionManager.Session; import freenet.clients.http.ToadletContainer; @@ -131,6 +136,15 @@ public class WebInterface implements CoreListener { /** The “Sone rescued” notification. */ private final ListNotification sonesRescuedNotification; + /** Sone locked notification ticker objects. */ + private final Map lockedSonesTickerObjects = Collections.synchronizedMap(new HashMap()); + + /** The “Sone locked” notification. */ + private final ListNotification lockedSonesNotification; + + /** The “new version” notification. */ + private final TemplateNotification newVersionNotification; + /** * Creates a new web interface. * @@ -176,6 +190,12 @@ public class WebInterface implements CoreListener { Template sonesRescuedTemplate = templateFactory.createTemplate(createReader("/templates/notify/sonesRescuedNotification.html")); sonesRescuedNotification = new ListNotification("sones-rescued-notification", "sones", sonesRescuedTemplate); + + Template lockedSonesTemplate = templateFactory.createTemplate(createReader("/templates/notify/lockedSonesNotification.html")); + lockedSonesNotification = new ListNotification("sones-locked-notification", "sones", lockedSonesTemplate); + + Template newVersionTemplate = templateFactory.createTemplate(createReader("/templates/notify/newVersionNotification.html")); + newVersionNotification = new TemplateNotification("new-version-notification", newVersionTemplate); } // @@ -233,7 +253,22 @@ public class WebInterface implements CoreListener { * currently logged in */ public Sone getCurrentSone(ToadletContext toadletContext) { - return getCurrentSone(getCurrentSession(toadletContext)); + return getCurrentSone(toadletContext, true); + } + + /** + * Returns the currently logged in Sone. + * + * @param toadletContext + * The toadlet context + * @param create + * {@code true} to create a new session if no session exists, + * {@code false} to not create a new session + * @return The currently logged in Sone, or {@code null} if no Sone is + * currently logged in + */ + public Sone getCurrentSone(ToadletContext toadletContext, boolean create) { + return getCurrentSone(getCurrentSession(toadletContext, create)); } /** @@ -328,6 +363,51 @@ public class WebInterface implements CoreListener { return new HashSet(newReplyNotification.getElements()); } + /** + * Sets whether the current start of the plugin is the first start. It is + * considered a first start if the configuration file does not exist. + * + * @param firstStart + * {@code true} if no configuration file existed when Sone was + * loaded, {@code false} otherwise + */ + public void setFirstStart(boolean firstStart) { + if (firstStart) { + Template firstStartNotificationTemplate = templateFactory.createTemplate(createReader("/templates/notify/firstStartNotification.html")); + Notification firstStartNotification = new TemplateNotification("first-start-notification", firstStartNotificationTemplate); + notificationManager.addNotification(firstStartNotification); + } + } + + /** + * Sets whether Sone was started with a fresh configuration file. + * + * @param newConfig + * {@code true} if Sone was started with a fresh configuration, + * {@code false} if the existing configuration could be read + */ + public void setNewConfig(boolean newConfig) { + if (newConfig && !hasFirstStartNotification()) { + Template configNotReadNotificationTemplate = templateFactory.createTemplate(createReader("/templates/notify/configNotReadNotification.html")); + Notification configNotReadNotification = new TemplateNotification("config-not-read-notification", configNotReadNotificationTemplate); + notificationManager.addNotification(configNotReadNotification); + } + } + + // + // PRIVATE ACCESSORS + // + + /** + * Returns whether the first start notification is currently displayed. + * + * @return {@code true} if the first-start notification is currently + * displayed, {@code false} otherwise + */ + private boolean hasFirstStartNotification() { + return notificationManager.getNotification("first-start-notification") != null; + } + // // ACTIONS // @@ -526,7 +606,9 @@ public class WebInterface implements CoreListener { @Override public void newSoneFound(Sone sone) { newSoneNotification.add(sone); - notificationManager.addNotification(newSoneNotification); + if (!hasFirstStartNotification()) { + notificationManager.addNotification(newSoneNotification); + } } /** @@ -535,7 +617,11 @@ public class WebInterface implements CoreListener { @Override public void newPostFound(Post post) { newPostNotification.add(post); - notificationManager.addNotification(newPostNotification); + if (!hasFirstStartNotification()) { + notificationManager.addNotification(newPostNotification); + } else { + getCore().markPostKnown(post); + } } /** @@ -547,7 +633,11 @@ public class WebInterface implements CoreListener { return; } newReplyNotification.add(reply); - notificationManager.addNotification(newReplyNotification); + if (!hasFirstStartNotification()) { + notificationManager.addNotification(newReplyNotification); + } else { + getCore().markReplyKnown(reply); + } } /** @@ -575,6 +665,59 @@ public class WebInterface implements CoreListener { } /** + * {@inheritDoc} + */ + @Override + public void postRemoved(Post post) { + newPostNotification.remove(post); + } + + /** + * {@inheritDoc} + */ + @Override + public void replyRemoved(Reply reply) { + newReplyNotification.remove(reply); + } + + /** + * {@inheritDoc} + */ + @Override + public void soneLocked(final Sone sone) { + Object tickerObject = Ticker.getInstance().registerEvent(System.currentTimeMillis() + (5 * 60) * 1000, new Runnable() { + + @Override + @SuppressWarnings("synthetic-access") + public void run() { + lockedSonesNotification.add(sone); + lockedSonesTickerObjects.remove(sone); + notificationManager.addNotification(lockedSonesNotification); + } + }, "Sone Locked Notification"); + lockedSonesTickerObjects.put(sone, tickerObject); + } + + /** + * {@inheritDoc} + */ + @Override + public void soneUnlocked(Sone sone) { + lockedSonesNotification.remove(sone); + Ticker.getInstance().deregisterEvent(lockedSonesTickerObjects.remove(sone)); + } + + /** + * {@inheritDoc} + */ + @Override + public void updateFound(Version version, long releaseTime) { + newVersionNotification.set("version", version); + newVersionNotification.set("releaseTime", releaseTime); + notificationManager.addNotification(newVersionNotification); + } + + /** * Template provider implementation that uses * {@link WebInterface#createReader(String)} to load templates for * inclusion.