leave/join room messages

This commit is contained in:
2025-03-01 13:26:09 +01:00
parent 0533c16cf2
commit 90f92281ef
2 changed files with 38 additions and 6 deletions

View File

@@ -32,6 +32,10 @@ public class Server implements PacketHandler {
return rooms.keySet().stream().collect(ArrayList::new, ArrayList::add, ArrayList::addAll); 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) { public String getRoomName(ServerConnexion connexion) {
for (Map.Entry<String, ArrayList<ServerConnexion>> entry : rooms.entrySet()) { for (Map.Entry<String, ArrayList<ServerConnexion>> entry : rooms.entrySet()) {
if (entry.getValue().contains(connexion)) { if (entry.getValue().contains(connexion)) {
@@ -71,17 +75,24 @@ public class Server implements PacketHandler {
return false; return false;
} }
public boolean sendToRoom(ServerConnexion connexion, SendChatMessagePacket packet) { public boolean sendToRoom(String roomName, ChatMessagePacket packet) {
String roomName = getRoomName(connexion);
ChatMessagePacket chatPacket = new ChatMessagePacket(Instant.now(), connexion.getChatterName(),
packet.getContent());
if (roomName != null && rooms.containsKey(roomName)) { 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 true;
} }
return false; 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() { public void close() {
this.reader.stop(); this.reader.stop();
} }

View File

@@ -3,6 +3,7 @@ package server;
import java.io.IOException; import java.io.IOException;
import java.net.DatagramSocket; import java.net.DatagramSocket;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.time.Instant;
import network.SocketWriter; import network.SocketWriter;
import network.protocol.Packet; import network.protocol.Packet;
@@ -49,23 +50,30 @@ public class ServerConnexion implements PacketVisitor {
public void visitPacket(CreateRoomPacket packet) { public void visitPacket(CreateRoomPacket packet) {
boolean created = server.createRoom(packet.getRoomName(), this); boolean created = server.createRoom(packet.getRoomName(), this);
sendPacket(new ServerResponsePacket(created ? Response.RoomCreated : Response.RoomNotCreated)); sendPacket(new ServerResponsePacket(created ? Response.RoomCreated : Response.RoomNotCreated));
if (created)
onRoomJoin();
} }
@Override @Override
public void visitPacket(JoinRoomPacket packet) { public void visitPacket(JoinRoomPacket packet) {
boolean joined = server.joinRoom(packet.getRoomName(), this); boolean joined = server.joinRoom(packet.getRoomName(), this);
sendPacket(new ServerResponsePacket(joined ? Response.RoomJoined : Response.RoomNotJoined)); sendPacket(new ServerResponsePacket(joined ? Response.RoomJoined : Response.RoomNotJoined));
if (joined)
onRoomJoin();
} }
@Override @Override
public void visitPacket(LeaveRoomPacket packet) { public void visitPacket(LeaveRoomPacket packet) {
String roomName = this.server.getRoomName(this);
boolean left = server.leaveRoom(this); boolean left = server.leaveRoom(this);
sendPacket(new ServerResponsePacket(left ? Response.RoomLeft : Response.RoomNotLeft)); sendPacket(new ServerResponsePacket(left ? Response.RoomLeft : Response.RoomNotLeft));
if (left)
onRoomLeave(roomName);
} }
@Override @Override
public void visitPacket(LoginPacket packet) { public void visitPacket(LoginPacket packet) {
if (server.hasChatterName(packet.getPseudo())) { if (packet.getPseudo().isEmpty() || server.hasChatterName(packet.getPseudo())) {
sendPacket(new ServerResponsePacket(Response.AuthError)); sendPacket(new ServerResponsePacket(Response.AuthError));
return; return;
} }
@@ -92,10 +100,23 @@ public class ServerConnexion implements PacketVisitor {
} }
private void onDisconnect() { private void onDisconnect() {
if (this.server.isInRoom(this)) {
this.onRoomLeave(this.server.getRoomName(this));
}
this.server.removeConnexion(this); this.server.removeConnexion(this);
System.out.println("[Server] Chatter " + chatterName + " disconnected !"); 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 @Override
public void visitPacket(RoomListPacket packet) { public void visitPacket(RoomListPacket packet) {
// I'm never supposed to receive this from the client // I'm never supposed to receive this from the client