Add Ability to Logout #50

Merged
kske merged 7 commits from f/logout into develop 2020-09-27 15:48:13 +02:00
8 changed files with 48 additions and 11 deletions
Showing only changes of commit af219274f5 - Show all commits

View File

@ -1,11 +1,9 @@
package envoy.client.data; package envoy.client.data;
import java.io.Serializable; import java.io.Serializable;
import java.util.LinkedList; import java.util.*;
import java.util.Queue;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.logging.Level; import java.util.logging.*;
import java.util.logging.Logger;
import envoy.util.EnvoyLog; import envoy.util.EnvoyLog;
@ -62,4 +60,11 @@ public final class Cache<T> implements Consumer<T>, Serializable {
elements.forEach(processor::accept); elements.forEach(processor::accept);
elements.clear(); elements.clear();
} }
/**
* Clears this cache of all stored elements.
*
* @since Envoy Client v0.2-beta
*/
public void clear() { elements.clear(); }
} }

View File

@ -40,6 +40,10 @@ public final class LocalDB implements EventListener {
private CacheMap cacheMap = new CacheMap(); private CacheMap cacheMap = new CacheMap();
private String authToken; private String authToken;
// auto save Timer
Outdated
Review

This should be // Auto save time.

This should be `// Auto save time`.
Outdated
Review

you mean // Auto save timer?

you mean `// Auto save timer`?
private Timer autoSaver;
private boolean autoSaveRestart = true;
// State management // State management
private Instant lastSync = Instant.EPOCH; private Instant lastSync = Instant.EPOCH;
@ -167,7 +171,14 @@ public final class LocalDB implements EventListener {
* @since Envoy Client v0.2-beta * @since Envoy Client v0.2-beta
*/ */
public void initAutoSave() { public void initAutoSave() {
new Timer("LocalDB Autosave", true).schedule(new TimerTask() {
if (autoSaveRestart) {
// A logout happened so the timer should be restarted
delvh marked this conversation as resolved Outdated
Outdated
Review

Maybe move the comment above the if statement.

Maybe move the comment above the `if` statement.
autoSaver = new Timer("LocalDB Autosave", true);
autoSaveRestart = false;
}
autoSaver.schedule(new TimerTask() {
@Override @Override
public void run() { save(); } public void run() { save(); }
@ -219,12 +230,16 @@ public final class LocalDB implements EventListener {
*/ */
@Event(eventType = Logout.class, priority = 100) @Event(eventType = Logout.class, priority = 100)
public void onLogout() { public void onLogout() {
delvh marked this conversation as resolved Outdated
Outdated
Review

Why is this public?

Why is this public?
autoSaver.cancel();
autoSaveRestart = true;
lastLoginFile.delete(); lastLoginFile.delete();
userFile = null; userFile = null;
user = null; user = null;
authToken = null; authToken = null;
chats.clear(); chats.clear();
cacheMap = new CacheMap(); lastSync = Instant.EPOCH;
cacheMap.getMap().forEach((key, cache) -> cache.clear());
delvh marked this conversation as resolved Outdated
Outdated
Review

Please remove the comment and add a clearing method to CacheMap.

Please remove the comment and add a clearing method to `CacheMap`.
// cacheMap = new CacheMap();
} }
/** /**

View File

@ -8,7 +8,7 @@ import envoy.event.Event.Valueless;
* @author leon * @author leon
delvh marked this conversation as resolved Outdated
Outdated
Review

Fix your @author tag.

Fix your `@author` tag.
* @since Envoy Client v0.2-beta * @since Envoy Client v0.2-beta
*/ */
public class Logout extends Valueless { public final class Logout extends Valueless {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
} }

View File

@ -1,11 +1,14 @@
package envoy.client.helper; package envoy.client.helper;
import java.util.logging.Level;
import javafx.scene.control.Alert; import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType; import javafx.scene.control.Alert.AlertType;
import envoy.client.data.*; import envoy.client.data.*;
import envoy.client.event.*; import envoy.client.event.*;
import envoy.client.ui.SceneContext.SceneInfo; import envoy.client.ui.SceneContext.SceneInfo;
import envoy.util.EnvoyLog;
import dev.kske.eventbus.EventBus; import dev.kske.eventbus.EventBus;
@ -47,6 +50,7 @@ public class ShutdownHelper {
alert.setContentText("Are you sure you want to log out?"); alert.setContentText("Are you sure you want to log out?");
AlertHelper.confirmAction(alert, () -> { AlertHelper.confirmAction(alert, () -> {
EnvoyLog.getLogger(ShutdownHelper.class).log(Level.INFO, "A logout was requested");
EventBus.getInstance().dispatch(new EnvoyCloseEvent()); EventBus.getInstance().dispatch(new EnvoyCloseEvent());
EventBus.getInstance().dispatch(new Logout()); EventBus.getInstance().dispatch(new Logout());
Context.getInstance().getSceneContext().load(SceneInfo.LOGIN_SCENE); Context.getInstance().getSceneContext().load(SceneInfo.LOGIN_SCENE);

View File

@ -180,7 +180,7 @@ public final class Client implements EventListener, Closeable {
receiver.registerProcessor(GroupCreationResult.class, eventBus::dispatch); receiver.registerProcessor(GroupCreationResult.class, eventBus::dispatch);
// Request a generator if none is present or the existing one is consumed // Request a generator if none is present or the existing one is consumed
if (!localDB.hasIDGenerator() || !localDB.getIDGenerator().hasNext()) requestIdGenerator(); if (!localDB.hasIDGenerator() || !localDB.getIDGenerator().hasNext()) requestIDGenerator();
// Relay caches // Relay caches
cacheMap.getMap().values().forEach(Cache::relay); cacheMap.getMap().values().forEach(Cache::relay);
@ -204,6 +204,7 @@ public final class Client implements EventListener, Closeable {
* *
* @param evt the event to send * @param evt the event to send
* @throws IOException if the event did not reach the server * @throws IOException if the event did not reach the server
* @since Envoy Client v0.3-alpha
*/ */
public void sendEvent(Event<?> evt) throws IOException { if (online) writeObject(evt); } public void sendEvent(Event<?> evt) throws IOException { if (online) writeObject(evt); }
@ -213,7 +214,7 @@ public final class Client implements EventListener, Closeable {
* @throws IOException if the request does not reach the server * @throws IOException if the request does not reach the server
* @since Envoy Client v0.3-alpha * @since Envoy Client v0.3-alpha
*/ */
public void requestIdGenerator() throws IOException { public void requestIDGenerator() throws IOException {
logger.log(Level.INFO, "Requesting new id generator..."); logger.log(Level.INFO, "Requesting new id generator...");
writeObject(new IDGeneratorRequest()); writeObject(new IDGeneratorRequest());
} }
@ -271,6 +272,7 @@ public final class Client implements EventListener, Closeable {
/** /**
* @return the {@link Receiver} used by this {@link Client} * @return the {@link Receiver} used by this {@link Client}
* @since v0.2-alpha
*/ */
public Receiver getReceiver() { return receiver; } public Receiver getReceiver() { return receiver; }

View File

@ -37,6 +37,7 @@ public final class Receiver extends Thread {
public Receiver(InputStream in) { public Receiver(InputStream in) {
super("Receiver"); super("Receiver");
this.in = in; this.in = in;
setDaemon(true);
} }
/** /**

View File

@ -11,7 +11,7 @@ import javafx.scene.input.*;
import javafx.stage.Stage; import javafx.stage.Stage;
import envoy.client.data.Settings; import envoy.client.data.Settings;
import envoy.client.event.ThemeChangeEvent; import envoy.client.event.*;
import envoy.client.helper.ShutdownHelper; import envoy.client.helper.ShutdownHelper;
import envoy.util.EnvoyLog; import envoy.util.EnvoyLog;
@ -97,6 +97,7 @@ public final class SceneContext implements EventListener {
* @since Envoy Client v0.1-beta * @since Envoy Client v0.1-beta
*/ */
public void load(SceneInfo sceneInfo) { public void load(SceneInfo sceneInfo) {
EnvoyLog.getLogger(SceneContext.class).log(Level.FINER, "Loading scene " + sceneInfo);
loader.setRoot(null); loader.setRoot(null);
loader.setController(null); loader.setController(null);
@ -166,6 +167,12 @@ public final class SceneContext implements EventListener {
} }
} }
@Event(eventType = Logout.class, priority = 150)
private void onLogout() {
sceneStack.clear();
controllerStack.clear();
}
@Event(priority = 150, eventType = ThemeChangeEvent.class) @Event(priority = 150, eventType = ThemeChangeEvent.class)
private void onThemeChange() { applyCSS(); } private void onThemeChange() { applyCSS(); }

View File

@ -325,6 +325,9 @@ public final class ChatScene implements EventListener, Restorable {
else recipientProfilePic.setImage(IconUtil.loadIconThemeSensitive("group_icon", 43)); else recipientProfilePic.setImage(IconUtil.loadIconThemeSensitive("group_icon", 43));
} }
@Event(eventType = Logout.class, priority = 200)
private void onLogout() { eventBus.removeListener(this); }
/** /**
* Initializes all {@code SystemCommands} used in {@code ChatScene}. * Initializes all {@code SystemCommands} used in {@code ChatScene}.
* *
@ -711,7 +714,7 @@ public final class ChatScene implements EventListener, Restorable {
scrollToMessageListEnd(); scrollToMessageListEnd();
// Request a new ID generator if all IDs were used // Request a new ID generator if all IDs were used
if (!localDB.getIDGenerator().hasNext() && client.isOnline()) client.requestIdGenerator(); if (!localDB.getIDGenerator().hasNext() && client.isOnline()) client.requestIDGenerator();
} catch (final IOException e) { } catch (final IOException e) {
logger.log(Level.SEVERE, "Error while sending message: ", e); logger.log(Level.SEVERE, "Error while sending message: ", e);