package envoy.server.processors; import static envoy.data.Message.MessageStatus.READ; import java.time.Instant; import java.util.Collections; import java.util.logging.*; import envoy.data.Message.MessageStatus; import envoy.event.*; import envoy.util.EnvoyLog; import envoy.server.data.*; import envoy.server.net.*; import envoy.server.util.UserAuthenticationUtil; /** * @author Maximilian Käfer * @since Envoy Server Standalone v0.1-beta */ public final class GroupMessageStatusChangeProcessor implements ObjectProcessor { private static final ConnectionManager connectionManager = ConnectionManager.getInstance(); private static final PersistenceManager persistenceManager = PersistenceManager.getInstance(); private static final Logger logger = EnvoyLog.getLogger(MessageStatusChangeProcessor.class); @Override public void process(GroupMessageStatusChange statusChange, long socketID, ObjectWriteProxy writeProxy) { // Check whether the message has the expected parameters if (!UserAuthenticationUtil.isExpectedUser(statusChange.getMemberID(), socketID)) { logger.log(Level.INFO, "Received a group message with invalid parameters"); return; } GroupMessage gmsg = (GroupMessage) persistenceManager.getMessageByID(statusChange.getID()); if (gmsg == null) return; // Any other status than READ is not supposed to be sent to the server if (statusChange.get() != MessageStatus.READ) { logger.log(Level.WARNING, "Invalid " + statusChange); return; } // Apply the status change gmsg.getMemberMessageStatus().replace(statusChange.getMemberID(), statusChange.get()); gmsg.setLastStatusChangeDate(Instant.now()); // Notifying the other members about the status change final var userID = connectionManager.getUserIDBySocketID(socketID); gmsg.getMemberMessageStatus() .keySet() .stream() .filter(k -> userID != k) .filter(connectionManager::isOnline) .forEach(k -> writeProxy.write(connectionManager.getSocketID(k), statusChange)); // Increment overall status to READ if necessary if (Collections.min(gmsg.getMemberMessageStatus().values()) == READ) { gmsg.read(); // Notify online members about the status change writeProxy.writeToOnlineContacts(gmsg.getRecipient().getContacts(), new MessageStatusChange(gmsg.getID(), gmsg.getStatus(), Instant.now())); } persistenceManager.updateMessage(gmsg); } }