Improved logout mechanism a bit, still pretty buggy
(and fixed some inconsistencies)
This commit is contained in:
parent
05d4917bb2
commit
af219274f5
@ -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(); }
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
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
|
||||||
|
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() {
|
||||||
|
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());
|
||||||
|
// cacheMap = new CacheMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -8,7 +8,7 @@ import envoy.event.Event.Valueless;
|
|||||||
* @author leon
|
* @author leon
|
||||||
* @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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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; }
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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(); }
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
Reference in New Issue
Block a user