Implemented GroupMessageStatusChangeProcessor and a Cache for those
This commit is contained in:
parent
289f2b7032
commit
96fc06a8e5
@ -75,7 +75,8 @@ public class Client implements Closeable {
|
|||||||
* waiting for the handshake response
|
* waiting for the handshake response
|
||||||
*/
|
*/
|
||||||
public void performHandshake(LoginCredentials credentials, Cache<Message> receivedMessageCache, Cache<GroupMessage> receivedGroupMessageCache,
|
public void performHandshake(LoginCredentials credentials, Cache<Message> receivedMessageCache, Cache<GroupMessage> receivedGroupMessageCache,
|
||||||
Cache<MessageStatusChange> receivedMessageStatusChangeCache) throws TimeoutException, IOException, InterruptedException {
|
Cache<MessageStatusChange> receivedMessageStatusChangeCache, Cache<GroupMessageStatusChange> receivedGroupMessageStatusChangeCache)
|
||||||
|
throws TimeoutException, IOException, InterruptedException {
|
||||||
if (online) throw new IllegalStateException("Handshake has already been performed successfully");
|
if (online) throw new IllegalStateException("Handshake has already been performed successfully");
|
||||||
|
|
||||||
// Establish TCP connection
|
// Establish TCP connection
|
||||||
@ -91,6 +92,7 @@ public class Client implements Closeable {
|
|||||||
receiver.registerProcessor(Message.class, receivedMessageCache);
|
receiver.registerProcessor(Message.class, receivedMessageCache);
|
||||||
receiver.registerProcessor(GroupMessage.class, receivedGroupMessageCache);
|
receiver.registerProcessor(GroupMessage.class, receivedGroupMessageCache);
|
||||||
receiver.registerProcessor(MessageStatusChange.class, receivedMessageStatusChangeCache);
|
receiver.registerProcessor(MessageStatusChange.class, receivedMessageStatusChangeCache);
|
||||||
|
receiver.registerProcessor(GroupMessageStatusChange.class, receivedGroupMessageStatusChangeCache);
|
||||||
receiver.registerProcessor(HandshakeRejection.class, evt -> { rejected = true; eventBus.dispatch(evt); });
|
receiver.registerProcessor(HandshakeRejection.class, evt -> { rejected = true; eventBus.dispatch(evt); });
|
||||||
|
|
||||||
rejected = false;
|
rejected = false;
|
||||||
@ -152,27 +154,30 @@ public class Client implements Closeable {
|
|||||||
* @since Envoy Client v0.2-alpha
|
* @since Envoy Client v0.2-alpha
|
||||||
*/
|
*/
|
||||||
public void initReceiver(LocalDB localDB, Cache<Message> receivedMessageCache, Cache<GroupMessage> receivedGroupMessageCache,
|
public void initReceiver(LocalDB localDB, Cache<Message> receivedMessageCache, Cache<GroupMessage> receivedGroupMessageCache,
|
||||||
Cache<MessageStatusChange> receivedMessageStatusChangeCache)
|
Cache<MessageStatusChange> receivedMessageStatusChangeCache, Cache<GroupMessageStatusChange> receivedGroupMessageStatusChangeCache)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
checkOnline();
|
checkOnline();
|
||||||
|
|
||||||
// Process incoming messages
|
// Process incoming messages
|
||||||
final ReceivedMessageProcessor receivedMessageProcessor = new ReceivedMessageProcessor();
|
final ReceivedMessageProcessor receivedMessageProcessor = new ReceivedMessageProcessor();
|
||||||
final ReceivedGroupMessageProcessor receivedGroupMessageProcessor = new ReceivedGroupMessageProcessor();
|
final ReceivedGroupMessageProcessor receivedGroupMessageProcessor = new ReceivedGroupMessageProcessor();
|
||||||
final MessageStatusChangeProcessor messageStatusChangeEventProcessor = new MessageStatusChangeProcessor();
|
final MessageStatusChangeProcessor messageStatusChangeProcessor = new MessageStatusChangeProcessor();
|
||||||
|
final GroupMessageStatusChangeProcessor groupMessageStatusChangeProcessor = new GroupMessageStatusChangeProcessor();
|
||||||
|
|
||||||
// TODO: Define a cache
|
|
||||||
receiver.registerProcessor(GroupMessage.class, receivedGroupMessageProcessor);
|
receiver.registerProcessor(GroupMessage.class, receivedGroupMessageProcessor);
|
||||||
|
|
||||||
receiver.registerProcessor(Message.class, receivedMessageProcessor);
|
receiver.registerProcessor(Message.class, receivedMessageProcessor);
|
||||||
|
|
||||||
|
receiver.registerProcessor(MessageStatusChange.class, messageStatusChangeProcessor);
|
||||||
|
|
||||||
|
receiver.registerProcessor(GroupMessageStatusChange.class, groupMessageStatusChangeProcessor);
|
||||||
// Relay cached unread messages and unread groupMessages
|
// Relay cached unread messages and unread groupMessages
|
||||||
receivedMessageCache.setProcessor(receivedMessageProcessor);
|
receivedMessageCache.setProcessor(receivedMessageProcessor);
|
||||||
receivedGroupMessageCache.setProcessor(receivedGroupMessageProcessor);
|
receivedGroupMessageCache.setProcessor(receivedGroupMessageProcessor);
|
||||||
|
|
||||||
// Process message status changes
|
// Process message status changes
|
||||||
receiver.registerProcessor(MessageStatusChange.class, messageStatusChangeEventProcessor);
|
receivedMessageStatusChangeCache.setProcessor(messageStatusChangeProcessor);
|
||||||
receivedMessageStatusChangeCache.setProcessor(messageStatusChangeEventProcessor);
|
receivedGroupMessageStatusChangeCache.setProcessor(groupMessageStatusChangeProcessor);
|
||||||
|
|
||||||
// Process user status changes
|
// Process user status changes
|
||||||
receiver.registerProcessor(UserStatusChange.class, eventBus::dispatch);
|
receiver.registerProcessor(UserStatusChange.class, eventBus::dispatch);
|
||||||
|
@ -0,0 +1,29 @@
|
|||||||
|
package envoy.client.net;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import envoy.data.Message.MessageStatus;
|
||||||
|
import envoy.event.EventBus;
|
||||||
|
import envoy.event.GroupMessageStatusChange;
|
||||||
|
import envoy.util.EnvoyLog;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Project: <strong>envoy-client</strong><br>
|
||||||
|
* File: <strong>GroupMessageStatusChangePocessor.java</strong><br>
|
||||||
|
* Created: <strong>03.07.2020</strong><br>
|
||||||
|
*
|
||||||
|
* @author Maximilian Käfer
|
||||||
|
* @since Envoy Client v0.1-beta
|
||||||
|
*/
|
||||||
|
public class GroupMessageStatusChangeProcessor implements Consumer<GroupMessageStatusChange> {
|
||||||
|
|
||||||
|
private static final Logger logger = EnvoyLog.getLogger(GroupMessageStatusChangeProcessor.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void accept(GroupMessageStatusChange evt) {
|
||||||
|
if (evt.get().ordinal() < MessageStatus.RECEIVED.ordinal()) logger.warning("Received invalid group message status change " + evt);
|
||||||
|
else EventBus.getInstance().dispatch(evt);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -17,6 +17,7 @@ import envoy.client.ui.SceneContext.SceneInfo;
|
|||||||
import envoy.client.ui.controller.LoginScene;
|
import envoy.client.ui.controller.LoginScene;
|
||||||
import envoy.data.GroupMessage;
|
import envoy.data.GroupMessage;
|
||||||
import envoy.data.Message;
|
import envoy.data.Message;
|
||||||
|
import envoy.event.GroupMessageStatusChange;
|
||||||
import envoy.event.MessageStatusChange;
|
import envoy.event.MessageStatusChange;
|
||||||
import envoy.exception.EnvoyException;
|
import envoy.exception.EnvoyException;
|
||||||
import envoy.util.EnvoyLog;
|
import envoy.util.EnvoyLog;
|
||||||
@ -46,6 +47,7 @@ public final class Startup extends Application {
|
|||||||
private Cache<Message> messageCache;
|
private Cache<Message> messageCache;
|
||||||
private Cache<GroupMessage> groupMessageCache;
|
private Cache<GroupMessage> groupMessageCache;
|
||||||
private Cache<MessageStatusChange> messageStatusCache;
|
private Cache<MessageStatusChange> messageStatusCache;
|
||||||
|
private Cache<GroupMessageStatusChange> groupMessageStatusCache;
|
||||||
|
|
||||||
private static final ClientConfig config = ClientConfig.getInstance();
|
private static final ClientConfig config = ClientConfig.getInstance();
|
||||||
private static final Logger logger = EnvoyLog.getLogger(Startup.class);
|
private static final Logger logger = EnvoyLog.getLogger(Startup.class);
|
||||||
@ -103,13 +105,15 @@ public final class Startup extends Application {
|
|||||||
messageCache = new Cache<>();
|
messageCache = new Cache<>();
|
||||||
groupMessageCache = new Cache<>();
|
groupMessageCache = new Cache<>();
|
||||||
messageStatusCache = new Cache<>();
|
messageStatusCache = new Cache<>();
|
||||||
|
groupMessageStatusCache = new Cache<>();
|
||||||
|
|
||||||
stage.setTitle("Envoy");
|
stage.setTitle("Envoy");
|
||||||
stage.getIcons().add(IconUtil.load("/icons/envoy_logo.png"));
|
stage.getIcons().add(IconUtil.load("/icons/envoy_logo.png"));
|
||||||
|
|
||||||
final var sceneContext = new SceneContext(stage);
|
final var sceneContext = new SceneContext(stage);
|
||||||
sceneContext.load(SceneInfo.LOGIN_SCENE);
|
sceneContext.load(SceneInfo.LOGIN_SCENE);
|
||||||
sceneContext.<LoginScene>getController().initializeData(client, localDB, messageCache, groupMessageCache, messageStatusCache, sceneContext);
|
sceneContext.<LoginScene>getController()
|
||||||
|
.initializeData(client, localDB, messageCache, groupMessageCache, messageStatusCache, groupMessageStatusCache, sceneContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -26,9 +26,7 @@ import envoy.client.net.Client;
|
|||||||
import envoy.client.net.WriteProxy;
|
import envoy.client.net.WriteProxy;
|
||||||
import envoy.client.ui.*;
|
import envoy.client.ui.*;
|
||||||
import envoy.data.*;
|
import envoy.data.*;
|
||||||
import envoy.event.EventBus;
|
import envoy.event.*;
|
||||||
import envoy.event.MessageStatusChange;
|
|
||||||
import envoy.event.UserStatusChange;
|
|
||||||
import envoy.event.contact.ContactOperation;
|
import envoy.event.contact.ContactOperation;
|
||||||
import envoy.util.EnvoyLog;
|
import envoy.util.EnvoyLog;
|
||||||
|
|
||||||
@ -127,10 +125,16 @@ public final class ChatScene {
|
|||||||
// Listen to message status changes
|
// Listen to message status changes
|
||||||
eventBus.register(MessageStatusChange.class, e -> localDB.getMessage(e.getID()).ifPresent(message -> {
|
eventBus.register(MessageStatusChange.class, e -> localDB.getMessage(e.getID()).ifPresent(message -> {
|
||||||
message.setStatus(e.get());
|
message.setStatus(e.get());
|
||||||
|
|
||||||
// Update UI if in current chat
|
// Update UI if in current chat
|
||||||
if (currentChat != null && message.getSenderID() == currentChat.getRecipient().getID()) Platform.runLater(messageList::refresh);
|
if (currentChat != null && message.getSenderID() == currentChat.getRecipient().getID()) Platform.runLater(messageList::refresh);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
eventBus.register(GroupMessageStatusChange.class, e -> localDB.getMessage(e.getID()).ifPresent(groupMessage -> {
|
||||||
|
((GroupMessage) groupMessage).getMemberStatuses().replace(e.getMemberID(), e.get());
|
||||||
|
|
||||||
|
// Update UI id in current chat
|
||||||
|
if (currentChat != null && groupMessage.getRecipientID() == currentChat.getRecipient().getID()) Platform.runLater(messageList::refresh);
|
||||||
|
}));
|
||||||
|
|
||||||
// Listen to user status changes
|
// Listen to user status changes
|
||||||
eventBus.register(UserStatusChange.class,
|
eventBus.register(UserStatusChange.class,
|
||||||
|
@ -17,9 +17,7 @@ import envoy.client.ui.SceneContext;
|
|||||||
import envoy.client.ui.Startup;
|
import envoy.client.ui.Startup;
|
||||||
import envoy.data.*;
|
import envoy.data.*;
|
||||||
import envoy.data.User.UserStatus;
|
import envoy.data.User.UserStatus;
|
||||||
import envoy.event.EventBus;
|
import envoy.event.*;
|
||||||
import envoy.event.HandshakeRejection;
|
|
||||||
import envoy.event.MessageStatusChange;
|
|
||||||
import envoy.exception.EnvoyException;
|
import envoy.exception.EnvoyException;
|
||||||
import envoy.util.Bounds;
|
import envoy.util.Bounds;
|
||||||
import envoy.util.EnvoyLog;
|
import envoy.util.EnvoyLog;
|
||||||
@ -58,6 +56,7 @@ public final class LoginScene {
|
|||||||
private Cache<Message> receivedMessageCache;
|
private Cache<Message> receivedMessageCache;
|
||||||
private Cache<GroupMessage> receivedGroupMessageCache;
|
private Cache<GroupMessage> receivedGroupMessageCache;
|
||||||
private Cache<MessageStatusChange> receivedMessageStatusChangeCache;
|
private Cache<MessageStatusChange> receivedMessageStatusChangeCache;
|
||||||
|
private Cache<GroupMessageStatusChange> receivedGroupMessageStatusChangeCache;
|
||||||
private SceneContext sceneContext;
|
private SceneContext sceneContext;
|
||||||
|
|
||||||
private static final Logger logger = EnvoyLog.getLogger(LoginScene.class);
|
private static final Logger logger = EnvoyLog.getLogger(LoginScene.class);
|
||||||
@ -93,12 +92,14 @@ public final class LoginScene {
|
|||||||
* @since Envoy Client v0.1-beta
|
* @since Envoy Client v0.1-beta
|
||||||
*/
|
*/
|
||||||
public void initializeData(Client client, LocalDB localDB, Cache<Message> receivedMessageCache, Cache<GroupMessage> receivedGroupMessageCache,
|
public void initializeData(Client client, LocalDB localDB, Cache<Message> receivedMessageCache, Cache<GroupMessage> receivedGroupMessageCache,
|
||||||
Cache<MessageStatusChange> receivedMessageStatusChangeCache, SceneContext sceneContext) {
|
Cache<MessageStatusChange> receivedMessageStatusChangeCache, Cache<GroupMessageStatusChange> receivedGroupMessageStatusChangeCache,
|
||||||
|
SceneContext sceneContext) {
|
||||||
this.client = client;
|
this.client = client;
|
||||||
this.localDB = localDB;
|
this.localDB = localDB;
|
||||||
this.receivedMessageCache = receivedMessageCache;
|
this.receivedMessageCache = receivedMessageCache;
|
||||||
this.receivedGroupMessageCache = receivedGroupMessageCache;
|
this.receivedGroupMessageCache = receivedGroupMessageCache;
|
||||||
this.receivedMessageStatusChangeCache = receivedMessageStatusChangeCache;
|
this.receivedMessageStatusChangeCache = receivedMessageStatusChangeCache;
|
||||||
|
this.receivedGroupMessageStatusChangeCache = receivedGroupMessageStatusChangeCache;
|
||||||
this.sceneContext = sceneContext;
|
this.sceneContext = sceneContext;
|
||||||
|
|
||||||
// Prepare handshake
|
// Prepare handshake
|
||||||
@ -147,9 +148,17 @@ public final class LoginScene {
|
|||||||
|
|
||||||
private void performHandshake(LoginCredentials credentials) {
|
private void performHandshake(LoginCredentials credentials) {
|
||||||
try {
|
try {
|
||||||
client.performHandshake(credentials, receivedMessageCache, receivedGroupMessageCache, receivedMessageStatusChangeCache);
|
client.performHandshake(credentials,
|
||||||
|
receivedMessageCache,
|
||||||
|
receivedGroupMessageCache,
|
||||||
|
receivedMessageStatusChangeCache,
|
||||||
|
receivedGroupMessageStatusChangeCache);
|
||||||
if (client.isOnline()) {
|
if (client.isOnline()) {
|
||||||
client.initReceiver(localDB, receivedMessageCache, receivedGroupMessageCache, receivedMessageStatusChangeCache);
|
client.initReceiver(localDB,
|
||||||
|
receivedMessageCache,
|
||||||
|
receivedGroupMessageCache,
|
||||||
|
receivedMessageStatusChangeCache,
|
||||||
|
receivedGroupMessageStatusChangeCache);
|
||||||
loadChatScene();
|
loadChatScene();
|
||||||
}
|
}
|
||||||
} catch (IOException | InterruptedException | TimeoutException e) {
|
} catch (IOException | InterruptedException | TimeoutException e) {
|
||||||
@ -216,5 +225,6 @@ public final class LoginScene {
|
|||||||
if (receivedMessageCache != null && client.isOnline()) receivedMessageCache.relay();
|
if (receivedMessageCache != null && client.isOnline()) receivedMessageCache.relay();
|
||||||
if (receivedGroupMessageCache != null && client.isOnline()) receivedGroupMessageCache.relay();
|
if (receivedGroupMessageCache != null && client.isOnline()) receivedGroupMessageCache.relay();
|
||||||
if (receivedMessageStatusChangeCache != null && client.isOnline()) receivedMessageStatusChangeCache.relay();
|
if (receivedMessageStatusChangeCache != null && client.isOnline()) receivedMessageStatusChangeCache.relay();
|
||||||
|
if (receivedGroupMessageStatusChangeCache != null && client.isOnline()) receivedGroupMessageStatusChangeCache.relay();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user