From b34ada0942ec01e2287b1328cb4b9f7de3bdd72b Mon Sep 17 00:00:00 2001 From: Emi Boucly Date: Wed, 15 Jan 2025 15:45:30 +0100 Subject: [PATCH] =?UTF-8?q?feat(Room):=20Traitement=20des=20requ=C3=AAtes?= =?UTF-8?q?=20JOIN,=20LSTP,=20POST=20et=20MESG=20li=C3=A9es=20aux=20salons?= =?UTF-8?q?=20textuels,=20fix=20des=20vues=20des=20messages=20client-side?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/rtgre/chat/ChatController.java | 78 ++++++++++++++++--- .../main/java/rtgre/chat/net/ChatClient.java | 1 + chat/src/main/java/rtgre/modeles/Contact.java | 5 ++ chat/src/main/java/rtgre/modeles/RoomMap.java | 2 +- .../main/java/rtgre/server/ChatServer.java | 73 +++++++++++++---- 5 files changed, 133 insertions(+), 26 deletions(-) diff --git a/chat/src/main/java/rtgre/chat/ChatController.java b/chat/src/main/java/rtgre/chat/ChatController.java index 4ceb26a..649be91 100644 --- a/chat/src/main/java/rtgre/chat/ChatController.java +++ b/chat/src/main/java/rtgre/chat/ChatController.java @@ -110,7 +110,7 @@ public class ChatController implements Initializable { contactsListView.getSelectionModel().selectedItemProperty().addListener( (observableValue, previous, selected) -> handleContactSelection((Contact) selected)); roomsListView.getSelectionModel().selectedItemProperty().addListener( - (observableValue, previous, selected) -> handleContactSelection((Contact) selected)); + (observableValue, previous, selected) -> handleRoomSelection((Room) selected)); validatorLogin.createCheck() .dependsOn("login", loginTextField.textProperty()) @@ -119,7 +119,11 @@ public class ChatController implements Initializable { .immediate(); ObservableValue canSendCondition = connectionButton.selectedProperty().not() - .or(contactsListView.getSelectionModel().selectedItemProperty().isNull()); + .or( + roomsListView.getSelectionModel().selectedItemProperty().isNull() + .and(contactsListView.getSelectionModel().selectedItemProperty().isNull()) + ); + sendButton.disableProperty().bind(canSendCondition); messageTextField.disableProperty().bind(canSendCondition); @@ -140,7 +144,12 @@ public class ChatController implements Initializable { } private void onActionSend(ActionEvent actionEvent) { - String login = getSelectedContactLogin(); + String login = null; + if (!(getSelectedContactLogin() == null)) { + login = getSelectedContactLogin(); + } else if (!(getSelectedRoomName() == null)) { + login = getSelectedRoomName(); + } if (login != null) { Message message = new Message(login, messageTextField.getText()); LOGGER.info("Sending " + message); @@ -212,8 +221,10 @@ public class ChatController implements Initializable { private void clearLists() { this.contactMap = new ContactMap(); this.postVector = new PostVector(); + this.roomMap = new RoomMap(); contactObservableList.clear(); postsObservableList.clear(); + roomObservableList.clear(); } private void checkLogin(Check.Context context) { @@ -281,6 +292,19 @@ public class ChatController implements Initializable { return login; } + public String getSelectedRoomName() { + Room room; + String roomName; + try { + room = (Room) roomsListView.getSelectionModel().getSelectedItem(); + roomName = room.getRoomName(); + } catch (Exception e) { + roomName = null; + } + LOGGER.info("Selected room: " + roomName); + return roomName; + } + public Contact getContact() { return contact; } @@ -289,10 +313,33 @@ public class ChatController implements Initializable { return contactMap; } + void handleRoomSelection(Room roomSelected) { + + if (roomSelected != null) { + LOGGER.info("Clic sur " + roomSelected); + } + + if (!contactsListView.getSelectionModel().isEmpty()) { + contactsListView.getSelectionModel().clearSelection(); + } + contact.setCurrentRoom(roomSelected.getRoomName()); + Post postSys = new Post("system", loginTextField.getText(), "Bienvenue dans le salon " + roomSelected); + postsObservableList.clear(); + postsObservableList.add(postSys); + client.sendEvent(new rtgre.modeles.Event("JOIN", new JSONObject().put("room", roomSelected.getRoomName()))); + client.sendListPostEvent(0, roomSelected.toString()); + postListView.refresh(); + } + void handleContactSelection(Contact contactSelected) { if (contactSelected != null) { LOGGER.info("Clic sur " + contactSelected); } + + if (!roomsListView.getSelectionModel().isEmpty()) { + roomsListView.getSelectionModel().clearSelection(); + } + Post postSys = new Post("system", loginTextField.getText(), "Bienvenue dans la discussion avec " + contactSelected.getLogin()); postsObservableList.clear(); postsObservableList.add(postSys); @@ -324,13 +371,24 @@ public class ChatController implements Initializable { } private void handlePostEvent(JSONObject content) { - System.out.println(content.getString("to").equals(((Contact) contactsListView.getSelectionModel().getSelectedItem()).getLogin())); - if (content.getString("to").equals(((Contact) contactsListView.getSelectionModel().getSelectedItem()).getLogin()) || - content.getString("from").equals(loginTextField.getText())) { - postVector.add(Post.fromJson(content)); - postsObservableList.add(Post.fromJson(content)); - postListView.refresh(); - + if (contactsListView.getSelectionModel().getSelectedItem() != null) { + System.out.println(contactsListView.getSelectionModel().getSelectedItem()); + if (content.getString("to").equals(contact.getLogin()) || + content.getString("from").equals(loginTextField.getText())) { + System.out.println("New message! to:dm"); + postVector.add(Post.fromJson(content)); + postsObservableList.add(Post.fromJson(content)); + postListView.refresh(); + } + } else if (roomsListView.getSelectionModel().getSelectedItem() != null) { + if (content.getString("to").contains("#")) { + if (this.contact.getCurrentRoom().contains(content.getString("to"))) { + System.out.println("New Message! to:room"); + postVector.add(Post.fromJson(content)); + postsObservableList.add(Post.fromJson(content)); + postListView.refresh(); + } + } } } diff --git a/chat/src/main/java/rtgre/chat/net/ChatClient.java b/chat/src/main/java/rtgre/chat/net/ChatClient.java index 6bcf39f..d094fa0 100644 --- a/chat/src/main/java/rtgre/chat/net/ChatClient.java +++ b/chat/src/main/java/rtgre/chat/net/ChatClient.java @@ -88,6 +88,7 @@ public class ChatClient extends ClientTCP { LOGGER.info(RED + "Réception: " + message + RST); LOGGER.info(RED + message + RST); if (listener != null) { + System.out.println(message); Platform.runLater(() -> listener.handleEvent(Event.fromJson(message))); } } diff --git a/chat/src/main/java/rtgre/modeles/Contact.java b/chat/src/main/java/rtgre/modeles/Contact.java index bb9ff5a..a0310e9 100644 --- a/chat/src/main/java/rtgre/modeles/Contact.java +++ b/chat/src/main/java/rtgre/modeles/Contact.java @@ -137,4 +137,9 @@ public class Contact { System.out.println("Erreur : " + e.getMessage()); } } + + public void setCurrentRoom(String currentRoom) { + this.currentRoom = currentRoom; + } + } diff --git a/chat/src/main/java/rtgre/modeles/RoomMap.java b/chat/src/main/java/rtgre/modeles/RoomMap.java index 039d986..eb37b3e 100644 --- a/chat/src/main/java/rtgre/modeles/RoomMap.java +++ b/chat/src/main/java/rtgre/modeles/RoomMap.java @@ -4,7 +4,7 @@ import java.util.TreeMap; public class RoomMap extends TreeMap { public void add(Room room) { - this.put(room.roomName, room); + this.put(room.getRoomName(), room); } public void loadDefaultRooms() { diff --git a/chat/src/main/java/rtgre/server/ChatServer.java b/chat/src/main/java/rtgre/server/ChatServer.java index 64e4ed6..0bb40ae 100644 --- a/chat/src/main/java/rtgre/server/ChatServer.java +++ b/chat/src/main/java/rtgre/server/ChatServer.java @@ -261,6 +261,10 @@ public class ChatServer { doListRoom(event.getContent()); LOGGER.info("Sending Rooms"); return true; + } else if (event.getType().equals(Event.JOIN)) { + doJoin(event.getContent()); + LOGGER.info("New user joining room!"); + return true; } else if (event.getType().equals(Event.QUIT)) { LOGGER.info("Déconnexion"); return false; @@ -270,16 +274,28 @@ public class ChatServer { } } + private void doJoin(JSONObject content) { + if (content.getString("room").isEmpty()) { + user.setCurrentRoom(null); + } + if (user.getLogin().isEmpty()) { + user.setCurrentRoom(null); + return; + } + if (roomMap.get(content.getString("room")).getLoginSet() == null) { + user.setCurrentRoom(content.getString("room")); + } + else if (roomMap.get(content.getString("room")).getLoginSet().contains(user.getLogin())) { + user.setCurrentRoom(content.getString("room")); + } + } + private void doListRoom(JSONObject content) { - System.out.println(contactMap.getContact(user.getLogin()).isConnected()); if (contactMap.getContact(user.getLogin()).isConnected()) { for (Room room: roomMap.values()) { - System.out.println(room); try { - System.out.println(new Event("ROOM", room.toJsonObject()).toJson()); send(new Event("ROOM", room.toJsonObject()).toJson()); } catch (IOException e) { - System.out.println(e.getMessage()); throw new IllegalStateException(); } } @@ -287,14 +303,22 @@ public class ChatServer { } private void doListPost(JSONObject content) throws JSONException, IllegalStateException { - if (contactMap.getContact(user.getLogin()).isConnected()) { - if (!contactMap.containsKey(content.getString("select"))) { + if (!contactMap.containsKey(content.getString("select")) && !roomMap.containsKey(content.getString("select"))) { + System.out.println("!select"); throw new IllegalStateException(); } - for (Post post: postVector.getPostsSince(content.getLong("since"))) { - if (post.getTo().equals(content.getString("select")) || - post.getFrom().equals(content.getString("select"))) { + if (!content.getString("select").contains("#")) { + System.out.println("!#"); + for (Post post : postVector.getPostsSince(content.getLong("since"))) { + if (post.getTo().equals(content.getString("select")) || + post.getFrom().equals(content.getString("select"))) { + sendEventToContact(contactMap.getContact(user.getLogin()), new Event(Event.POST, post.toJsonObject())); + } + } + } else if (user.getCurrentRoom().equals(content.getString("select"))) { + System.out.println("#"); + for (Post post: postVector.getPostsSince(content.getLong("since"))) { sendEventToContact(contactMap.getContact(user.getLogin()), new Event(Event.POST, post.toJsonObject())); } } @@ -303,9 +327,10 @@ public class ChatServer { private void doMessage(JSONObject content) throws JSONException, IllegalStateException { if (contactMap.getContact(user.getLogin()).isConnected()) { - if (content.getString("to").equals(user.getLogin()) || !contactMap.containsKey(content.getString("to"))) { - throw new IllegalStateException(); - } else { + if (content.getString("to").equals(user.getLogin()) || + (!contactMap.containsKey(content.getString("to"))) && !roomMap.containsKey(content.getString("to"))) { + throw new IllegalStateException("IllegalStateException! Cannot Post"); + } if(!content.getString("to").contains("#")) { Post post = new Post( user.getLogin(), Message.fromJson(content) @@ -316,7 +341,24 @@ public class ChatServer { sendEventToContact(contactMap.getContact(post.getTo()), postEvent); postVector.add(post); - LOGGER.info("Fin de doMessage"); + LOGGER.info("Fin de doMessage:dm"); + } else { + Post post = new Post( + user.getLogin(), + Message.fromJson(content) + ); + Event postEvent = new Event("POST", post.toJsonObject()); + + for (ChatClientHandler client: clientList) { + if (client.user.getCurrentRoom() != null) { + if (client.user.getCurrentRoom().equals(content.getString("to"))) { + sendEventToContact(client.user, postEvent); + } + } + } + postVector.add(post); + LOGGER.info("Fin de doMessage:room"); + } } } @@ -345,6 +387,7 @@ public class ChatServer { LOGGER.info("Connexion de " + login); contactMap.getContact(login).setConnected(true); this.user = contactMap.getContact(login); + System.out.println(user.isConnected()); sendAllOtherClients( findClient(contactMap.getContact(login)), new Event("CONT", user.toJsonObject()).toJson() @@ -366,11 +409,11 @@ public class ChatServer { public void sendAllOtherClients(ChatClientHandler fromClient, String message) { for (ChatClientHandler client : clientList) { - if (!client.equals(this)) { + if (!client.equals(fromClient)) { LOGGER.fine(clientList.toString()); LOGGER.fine("Envoi vers [%s] : %s".formatted(client.getIpPort(), message)); try { - client.send("[%s] %s".formatted(fromClient.getIpPort(), message)); + client.send(message); } catch (Exception e) { LOGGER.severe("[%s] %s".formatted(client.getIpPort(), e)); client.close();