diff --git a/ChatApp/src/server/Server.java b/ChatApp/src/server/Server.java index 5f7144a..e030cf8 100644 --- a/ChatApp/src/server/Server.java +++ b/ChatApp/src/server/Server.java @@ -32,6 +32,10 @@ public class Server implements PacketHandler { return rooms.keySet().stream().collect(ArrayList::new, ArrayList::add, ArrayList::addAll); } + public boolean isInRoom(ServerConnexion connexion) { + return getRoomName(connexion) != null; + } + public String getRoomName(ServerConnexion connexion) { for (Map.Entry> entry : rooms.entrySet()) { if (entry.getValue().contains(connexion)) { @@ -71,17 +75,24 @@ public class Server implements PacketHandler { return false; } - public boolean sendToRoom(ServerConnexion connexion, SendChatMessagePacket packet) { - String roomName = getRoomName(connexion); - ChatMessagePacket chatPacket = new ChatMessagePacket(Instant.now(), connexion.getChatterName(), - packet.getContent()); + public boolean sendToRoom(String roomName, ChatMessagePacket packet) { if (roomName != null && rooms.containsKey(roomName)) { - rooms.get(roomName).forEach(con -> con.sendPacket(chatPacket)); + rooms.get(roomName).forEach(con -> con.sendPacket(packet)); return true; } return false; } + public boolean sendToRoom(ServerConnexion connexion, ChatMessagePacket packet) { + String roomName = getRoomName(connexion); + return sendToRoom(roomName, packet); + } + + public boolean sendToRoom(ServerConnexion connexion, SendChatMessagePacket packet) { + return sendToRoom(connexion, + new ChatMessagePacket(Instant.now(), connexion.getChatterName(), packet.getContent())); + } + public void close() { this.reader.stop(); } diff --git a/ChatApp/src/server/ServerConnexion.java b/ChatApp/src/server/ServerConnexion.java index 7b80c91..331d41a 100644 --- a/ChatApp/src/server/ServerConnexion.java +++ b/ChatApp/src/server/ServerConnexion.java @@ -3,6 +3,7 @@ package server; import java.io.IOException; import java.net.DatagramSocket; import java.net.InetSocketAddress; +import java.time.Instant; import network.SocketWriter; import network.protocol.Packet; @@ -49,23 +50,30 @@ public class ServerConnexion implements PacketVisitor { public void visitPacket(CreateRoomPacket packet) { boolean created = server.createRoom(packet.getRoomName(), this); sendPacket(new ServerResponsePacket(created ? Response.RoomCreated : Response.RoomNotCreated)); + if (created) + onRoomJoin(); } @Override public void visitPacket(JoinRoomPacket packet) { boolean joined = server.joinRoom(packet.getRoomName(), this); sendPacket(new ServerResponsePacket(joined ? Response.RoomJoined : Response.RoomNotJoined)); + if (joined) + onRoomJoin(); } @Override public void visitPacket(LeaveRoomPacket packet) { + String roomName = this.server.getRoomName(this); boolean left = server.leaveRoom(this); sendPacket(new ServerResponsePacket(left ? Response.RoomLeft : Response.RoomNotLeft)); + if (left) + onRoomLeave(roomName); } @Override public void visitPacket(LoginPacket packet) { - if (server.hasChatterName(packet.getPseudo())) { + if (packet.getPseudo().isEmpty() || server.hasChatterName(packet.getPseudo())) { sendPacket(new ServerResponsePacket(Response.AuthError)); return; } @@ -92,10 +100,23 @@ public class ServerConnexion implements PacketVisitor { } private void onDisconnect() { + if (this.server.isInRoom(this)) { + this.onRoomLeave(this.server.getRoomName(this)); + } this.server.removeConnexion(this); System.out.println("[Server] Chatter " + chatterName + " disconnected !"); } + private void onRoomJoin() { + String joinMessage = "Chatter " + this.chatterName + " joined the room !"; + this.server.sendToRoom(this, new ChatMessagePacket(Instant.now(), "", joinMessage)); + } + + private void onRoomLeave(String roomName) { + String joinMessage = "Chatter " + this.chatterName + " left the room !"; + this.server.sendToRoom(roomName, new ChatMessagePacket(Instant.now(), "", joinMessage)); + } + @Override public void visitPacket(RoomListPacket packet) { // I'm never supposed to receive this from the client