X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fweb%2FWebInterface.java;h=d3ec1eec243528675fa30ea0bf15fcda22f8e762;hb=0bbc9d8da7dfae93fe4e7b08dbb11a99332dc17f;hp=5e3756d21e65fa463b3aeaff18852201a0e0bcd5;hpb=40ef1d6811ccccb8e1c559ee3747f0f4405297c7;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 5e3756d..d3ec1ee 100644 --- a/src/main/java/net/pterodactylus/sone/web/WebInterface.java +++ b/src/main/java/net/pterodactylus/sone/web/WebInterface.java @@ -23,9 +23,13 @@ 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; import java.util.logging.Logger; @@ -85,7 +89,9 @@ import net.pterodactylus.util.template.TemplateProvider; import net.pterodactylus.util.template.XmlFilter; import net.pterodactylus.util.thread.Ticker; import freenet.clients.http.SessionManager; +import freenet.clients.http.SessionManager.Session; import freenet.clients.http.ToadletContainer; +import freenet.clients.http.ToadletContext; import freenet.l10n.BaseL10n; /** @@ -129,6 +135,12 @@ 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; + /** * Creates a new web interface. * @@ -174,6 +186,9 @@ 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); } // @@ -190,6 +205,102 @@ public class WebInterface implements CoreListener { } /** + * Returns the current session, creating a new session if there is no + * current session. + * + * @param toadletContenxt + * The toadlet context + * @return The current session, or {@code null} if there is no current + * session + */ + public Session getCurrentSession(ToadletContext toadletContenxt) { + return getCurrentSession(toadletContenxt, true); + } + + /** + * Returns the current session, creating a new session if there is no + * current session and {@code create} is {@code true}. + * + * @param toadletContenxt + * The toadlet context + * @param create + * {@code true} to create a new session if there is no current + * session, {@code false} otherwise + * @return The current session, or {@code null} if there is no current + * session + */ + public Session getCurrentSession(ToadletContext toadletContenxt, boolean create) { + Session session = getSessionManager().useSession(toadletContenxt); + if (create && (session == null)) { + session = getSessionManager().createSession(UUID.randomUUID().toString(), toadletContenxt); + } + return session; + } + + /** + * Returns the currently logged in Sone. + * + * @param toadletContext + * The toadlet context + * @return The currently logged in Sone, or {@code null} if no Sone is + * currently logged in + */ + public Sone getCurrentSone(ToadletContext 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)); + } + + /** + * Returns the currently logged in Sone. + * + * @param session + * The session + * @return The currently logged in Sone, or {@code null} if no Sone is + * currently logged in + */ + public Sone getCurrentSone(Session session) { + if (session == null) { + return null; + } + String soneId = (String) session.getAttribute("Sone.CurrentSone"); + if (soneId == null) { + return null; + } + return getCore().getLocalSone(soneId, false); + } + + /** + * Sets the currently logged in Sone. + * + * @param toadletContext + * The toadlet context + * @param sone + * The Sone to set as currently logged in + */ + public void setCurrentSone(ToadletContext toadletContext, Sone sone) { + Session session = getCurrentSession(toadletContext); + if (sone == null) { + session.removeAttribute("Sone.CurrentSone"); + } else { + session.setAttribute("Sone.CurrentSone", sone.getId()); + } + } + + /** * Returns the notification manager. * * @return The notification manager @@ -255,7 +366,7 @@ public class WebInterface implements CoreListener { */ public void setFirstStart(boolean firstStart) { if (firstStart) { - Template firstStartNotificationTemplate = new Template(createReader("/templates/notify/firstStartNotification.html")); + Template firstStartNotificationTemplate = templateFactory.createTemplate(createReader("/templates/notify/firstStartNotification.html")); Notification firstStartNotification = new TemplateNotification("first-start-notification", firstStartNotificationTemplate); notificationManager.addNotification(firstStartNotification); } @@ -269,8 +380,8 @@ public class WebInterface implements CoreListener { * {@code false} if the existing configuration could be read */ public void setNewConfig(boolean newConfig) { - if (newConfig && (notificationManager.getNotification("first-start-notification") == null)) { - Template configNotReadNotificationTemplate = new Template(createReader("/templates/notify/configNotReadNotification.html")); + if (newConfig && !hasFirstStartNotification()) { + Template configNotReadNotificationTemplate = templateFactory.createTemplate(createReader("/templates/notify/configNotReadNotification.html")); Notification configNotReadNotification = new TemplateNotification("config-not-read-notification", configNotReadNotificationTemplate); notificationManager.addNotification(configNotReadNotification); } @@ -488,7 +599,9 @@ public class WebInterface implements CoreListener { @Override public void newSoneFound(Sone sone) { newSoneNotification.add(sone); - notificationManager.addNotification(newSoneNotification); + if (!hasFirstStartNotification()) { + notificationManager.addNotification(newSoneNotification); + } } /** @@ -497,7 +610,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); + } } /** @@ -509,7 +626,11 @@ public class WebInterface implements CoreListener { return; } newReplyNotification.add(reply); - notificationManager.addNotification(newReplyNotification); + if (!hasFirstStartNotification()) { + notificationManager.addNotification(newReplyNotification); + } else { + getCore().markReplyKnown(reply); + } } /** @@ -541,7 +662,7 @@ public class WebInterface implements CoreListener { */ @Override public void postRemoved(Post post) { - /* TODO */ + newPostNotification.remove(post); } /** @@ -549,7 +670,34 @@ public class WebInterface implements CoreListener { */ @Override public void replyRemoved(Reply reply) { - /* TODO */ + 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)); } /**