diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/message/Message.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/message/Message.java new file mode 100644 index 0000000..7f72a44 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/message/Message.java @@ -0,0 +1,4 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.domain.message; + +/** Represents a message sent by someone */ +public record Message(String sender, String content) {} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/message/MessageManager.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/message/MessageManager.java new file mode 100644 index 0000000..b3ba0da --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/message/MessageManager.java @@ -0,0 +1,15 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.domain.message; + +import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.UserRegistry; + +public class MessageManager { + private final UserRegistry userRegistry; + + public MessageManager(UserRegistry userRegistry) { + this.userRegistry = userRegistry; + } + + public void broadcast(Message message) { + userRegistry.getAllUsers().forEach(user -> user.enqueueMessage(message)); + } +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/user/User.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/user/User.java index 904112b..dc42ac3 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/user/User.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/domain/user/User.java @@ -1,8 +1,13 @@ package ch.unibas.dmi.dbis.cs108.casono.server.domain.user; +import ch.unibas.dmi.dbis.cs108.casono.server.domain.message.Message; import ch.unibas.dmi.dbis.cs108.casono.server.network.sessions.SessionId; import java.time.Instant; +import java.util.ArrayDeque; +import java.util.List; import java.util.Optional; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; /** Represents an authenticated user on the server. */ public class User { @@ -10,6 +15,7 @@ public class User { private final String name; private SessionId sessionId; private Instant disconnectedAt; + private final Queue messages; /** * Creates a new User with the given ID, name and session. @@ -23,6 +29,7 @@ public class User { this.name = name; this.sessionId = sessionId; this.disconnectedAt = null; + this.messages = new ConcurrentLinkedQueue<>(); } /** @@ -76,4 +83,14 @@ public class User { this.sessionId = null; this.disconnectedAt = Instant.now(); } + + public synchronized void enqueueMessage(Message message) { + messages.add(message); + } + + public synchronized List dequeueAllMessages(Message message) { + List allMessages = new ArrayDeque<>(messages).stream().toList(); + messages.clear(); + return allMessages; + } }