This repository has been archived on 2021-12-05. You can view files and clone it, but cannot push or open issues or pull requests.
envoy/server/src/main/java/envoy/server/processors/UserStatusChangeProcessor.java

70 lines
2.3 KiB
Java
Raw Normal View History

package envoy.server.processors;
import java.util.logging.Logger;
import envoy.data.User.UserStatus;
import envoy.event.UserStatusChange;
import envoy.util.EnvoyLog;
import envoy.server.data.*;
import envoy.server.net.ObjectWriteProxy;
/**
2020-07-06 11:40:13 +02:00
* This processor handles incoming {@link UserStatusChange}.
*
* @author Leon Hofmeister
* @since Envoy Server Standalone v0.1-alpha
*/
public final class UserStatusChangeProcessor implements ObjectProcessor<UserStatusChange> {
2020-07-06 11:40:13 +02:00
private static ObjectWriteProxy writeProxy;
2020-07-06 11:40:13 +02:00
private static final PersistenceManager persistenceManager = PersistenceManager.getInstance();
private static final Logger logger =
EnvoyLog.getLogger(UserStatusChangeProcessor.class);
@Override
2020-07-06 11:40:13 +02:00
public void process(UserStatusChange input, long socketID, ObjectWriteProxy writeProxy) {
// new status should not equal old status
if (input.get().equals(persistenceManager.getUserByID(input.getID()).getStatus())) {
logger.warning("Received an unnecessary UserStatusChange");
return;
}
2020-10-07 23:43:30 +02:00
updateUserStatus(persistenceManager.getUserByID(input.getID()), input.get());
}
/**
* Sets the {@link UserStatus} for a given user. Both offline contacts and currently online
* contacts are notified.
*
2020-10-07 23:43:30 +02:00
* @param user the user whose status has changed
* @param newStatus the new status of that user
* @since Envoy Server Standalone v0.1-alpha
*/
2020-10-07 23:43:30 +02:00
public static void updateUserStatus(User user, UserStatus newStatus) {
user.setStatus(newStatus);
// Handling for newly logged in clients
persistenceManager.updateContact(user);
// Handling for contacts that are already online
writeProxy.writeToOnlineContacts(user.getContacts(),
new UserStatusChange(user.getID(), user.getStatus()));
}
/**
* This method is only called by the LoginCredentialProcessor because every user needs to login
* (open a socket) before changing his status. Needed to ensure propagation of events because an
* uninitialized writeProxy would cause problems.
*
* @param writeProxy the writeProxy that is used to send objects back to clients
* @since Envoy Server Standalone v0.1-alpha
*/
public static void setWriteProxy(ObjectWriteProxy writeProxy) {
UserStatusChangeProcessor.writeProxy = writeProxy;
}
// TODO may cause an problem if two clients log in at the same time.
// Change Needed.
}