diff --git a/S2/DevWeb/Projet/pom.xml b/S2/DevWeb/Projet/pom.xml index 5d5e03b..50e0cb9 100644 --- a/S2/DevWeb/Projet/pom.xml +++ b/S2/DevWeb/Projet/pom.xml @@ -91,7 +91,7 @@ org.apache.maven.plugins maven-war-plugin 3.3.2 - + org.apache.maven.pluginsmaven-compiler-plugin1616 diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/json/websocket/Message.java b/S2/DevWeb/Projet/src/main/java/uppa/project/json/websocket/Message.java index 6c7b6fa..6ecfcd6 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/json/websocket/Message.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/json/websocket/Message.java @@ -1,6 +1,10 @@ package uppa.project.json.websocket; +import com.google.gson.Gson; + public class Message { + private final static Gson gson = new Gson(); + private final String type; private final String data; @@ -17,6 +21,10 @@ public class Message { return data; } + public String toJson() { + return gson.toJson(this); + } + @Override public String toString() { return "Message{" + "type=" + type + ", data=" + data + '}'; diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/web/websocket/ConnectedUsersWS.java b/S2/DevWeb/Projet/src/main/java/uppa/project/web/websocket/ConnectedUsersWS.java index 311cb0f..af394cd 100644 --- a/S2/DevWeb/Projet/src/main/java/uppa/project/web/websocket/ConnectedUsersWS.java +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/web/websocket/ConnectedUsersWS.java @@ -5,45 +5,50 @@ import jakarta.websocket.OnClose; import jakarta.websocket.OnError; import jakarta.websocket.OnMessage; import jakarta.websocket.OnOpen; -import jakarta.websocket.RemoteEndpoint; import jakarta.websocket.Session; +import jakarta.websocket.server.PathParam; import jakarta.websocket.server.ServerEndpoint; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; +import uppa.project.database.dao.DAO; +import uppa.project.database.dao.DAOException; +import uppa.project.database.dao.jpa.Game_JPA_DAO_Factory; import uppa.project.database.pojo.User; import uppa.project.json.websocket.Message; -@ServerEndpoint(value = "/ws/connected-users") +@ServerEndpoint(value = "/ws/users/{user_id}") public class ConnectedUsersWS { - public static final HashMap connections = new HashMap<>(); + public static final HashMap users = new HashMap<>(); + private static final Gson gson = new Gson(); @OnOpen - public void onOpen(Session session) {} + public void onOpen(Session session, @PathParam("user_id") String userId) throws DAOException { + Message message; + final DAO userDAO = new Game_JPA_DAO_Factory().getDAOUser(); - private void broadcastConnectedUsers() { - Gson gson = new Gson(); - User[] connectedUsers = connections.values().toArray(new User[0]); + int id = Integer.parseInt(userId); + User user = userDAO.findById(id); - Message websocketObject = new Message("userList", gson.toJson(connectedUsers)); - String message = gson.toJson(websocketObject); + // Send the new user to all connected users + message = new Message("addUser", gson.toJson(new SimpleUser(user))); + broadcast(message.toJson()); - for (Session session : connections.keySet()) { - RemoteEndpoint.Basic remote = session.getBasicRemote(); - try { - remote.sendText(message); - } catch (IOException e) { - e.printStackTrace(); - } - } + // Send all connected users to the new user + users.put(session, user); + ArrayList connectedUsers = new ArrayList<>(); + for (User u : users.values()) connectedUsers.add(new SimpleUser(u)); + message = new Message("init", gson.toJson(connectedUsers)); + session.getAsyncRemote().sendText(message.toJson()); } @OnClose public void onClose(Session session) { - connections.remove(session); + users.remove(session); - // Update connected users list - broadcastConnectedUsers(); + Message message = new Message("removeUser", gson.toJson(new SimpleUser(users.get(session)))); + broadcast(message.toJson()); } @OnError @@ -53,13 +58,26 @@ public class ConnectedUsersWS { @OnMessage public void onMessage(String message, Session session) { - Gson gson = new Gson(); - Message websocketMessage = gson.fromJson(message, Message.class); + // Do nothing + } - if (websocketMessage.getType().equals("linkUserSession")) { - User user = gson.fromJson(websocketMessage.getData(), User.class); - connections.put(session, user); - broadcastConnectedUsers(); + private static void broadcast(String message) { + for (Session session : users.keySet()) { + try { + session.getBasicRemote().sendText(message); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private static class SimpleUser { + public int id; + public String username; + + public SimpleUser(User user) { + this.id = user.getId().intValue(); + this.username = user.getUsername(); } } } diff --git a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/components/connected-user-list.tag b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/components/connected-user-list.tag index b87e06f..5890710 100644 --- a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/components/connected-user-list.tag +++ b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/components/connected-user-list.tag @@ -1,95 +1,63 @@ + <%@tag description="component/connected-user-list" pageEncoding="UTF-8" %> <%@tag import="com.google.gson.Gson" %> -<%@tag import="uppa.project.database.pojo.User" %> <%@taglib prefix="component" tagdir="/WEB-INF/tags/components" %> +<%@attribute name="anonymous"%> + -<%-- --%> -<%-- --%> -<%-- --%> -<%-- --%> -<%-- --%>
UtilisateurNombre de partiesVictoires (%)Clics corrects (%)Clics rapides (%)Action
diff --git a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/components/navbar.tag b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/components/navbar.tag index 7effc30..d140130 100644 --- a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/components/navbar.tag +++ b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/components/navbar.tag @@ -6,13 +6,13 @@ <% if (session.getAttribute("user") != null) { %> - + Logo <% } else { %> - + Logo <% } %> diff --git a/S2/DevWeb/Projet/src/main/webapp/static/js/Message.js b/S2/DevWeb/Projet/src/main/webapp/static/js/Message.js new file mode 100644 index 0000000..805fe18 --- /dev/null +++ b/S2/DevWeb/Projet/src/main/webapp/static/js/Message.js @@ -0,0 +1,13 @@ +export default class Message { + constructor(rawMessage) { + // Parse the message + const message = JSON.parse(rawMessage); + message.data = JSON.parse(message.data); + + console.log(message); + + // Set the message properties + this.type = message.type; + this.data = message.data; + } +} diff --git a/S2/DevWeb/Projet/src/main/webapp/static/js/WebsocketToolkit.js b/S2/DevWeb/Projet/src/main/webapp/static/js/WebsocketToolkit.js new file mode 100644 index 0000000..fc57175 --- /dev/null +++ b/S2/DevWeb/Projet/src/main/webapp/static/js/WebsocketToolkit.js @@ -0,0 +1,31 @@ +import Message from "./Message.js"; + +export default class WebsocketToolkit { + + action = {} + + constructor(url) { + this.url = url; + this.ws = new WebSocket(url); + } + + onOpen(callback) { + this.ws.onopen = callback; + } + + onMessage(type, callback) { + this.action[type] = callback; + this.ws.onmessage = (event) => { + const message = new Message(event.data); + this.action[message.type](message.data) + }; + } + + onClose(callback) { + this.ws.onclose = callback; + } + + onError(callback) { + this.ws.onerror = callback; + } +} \ No newline at end of file diff --git a/S2/DevWeb/Projet/src/main/webapp/static/js/new-game.js b/S2/DevWeb/Projet/src/main/webapp/static/js/new-game.js deleted file mode 100644 index 25e1bbb..0000000 --- a/S2/DevWeb/Projet/src/main/webapp/static/js/new-game.js +++ /dev/null @@ -1,19 +0,0 @@ -const nbColorsElement = document.getElementById("nbColors"); -const nbValuesElement = document.getElementById("nbValues"); -const nbRoundsElement = document.getElementById("nbRounds") - -/** - * Mise à jour du nombre de rounds max en fonction du nombre de couleurs et de valeurs séléctionnés - */ -function updateOnChange() { - nbRoundsElement.max = nbColorsElement.value * nbValuesElement.value; - - nbRoundsElement.value = - (nbRoundsElement.value > nbRoundsElement.max) - ? nbRoundsElement.max - : nbRoundsElement.value - ; -} - -nbColorsElement.addEventListener("change", updateOnChange); -nbValuesElement.addEventListener("change", updateOnChange);