From 9d6f8e136fb0d10e98a0a4ad426f10c9f6e08052 Mon Sep 17 00:00:00 2001 From: Quentin Roussel Date: Fri, 29 Mar 2024 11:38:21 +0000 Subject: [PATCH] backend du logout --- traque-back/game.js | 16 ++++++++-- traque-back/index.js | 75 ++++++++++++++++++++++++++------------------ 2 files changed, 57 insertions(+), 34 deletions(-) diff --git a/traque-back/game.js b/traque-back/game.js index be623be..f8e610f 100644 --- a/traque-back/game.js +++ b/traque-back/game.js @@ -17,6 +17,10 @@ export default class Game { if(Object.values(GameState).indexOf(newState) == -1) { return false; } + //The game has started + if(this.state == GameState.PLACEMENT && newState == GameState.PLAYING) { + this.initLastSentLocations(); + } this.state = newState; return true; } @@ -83,7 +87,6 @@ export default class Game { return t; } }) - console.log(this.teams) return true; } @@ -94,13 +97,20 @@ export default class Game { } team.currentLocation = location; //Update the team ready status if they are in their starting area - console.log(location, team.startingArea.center) - if(this.state == GameState.PLACEMENT && team.startingArea) { + if(this.state == GameState.PLACEMENT && team.startingArea && team.startingArea && location) { team.ready = isInCircle(location, [team.startingArea.center.lat, team.startingArea.center.lng], team.startingArea.radius) } return true; } + //Make it so that when a team requests the location of a team that has never sent their locaiton + //Their position at the begining of the game is sent + initLastSentLocations() { + for(let team of this.teams) { + team.lastSentLocation = team.currentLocation; + } + } + sendLocation(teamId) { let team = this.getTeam(teamId); if(team == undefined) { diff --git a/traque-back/index.js b/traque-back/index.js index 5bd5763..c3165c4 100644 --- a/traque-back/index.js +++ b/traque-back/index.js @@ -40,14 +40,20 @@ function secureBroadcast(event, data) { } function teamBroadcast(teamId, event, data) { - for(let socketId of game.getTeam(teamId).sockets) { - io.of("player").to(socketId).emit(event,data) + for (let socketId of game.getTeam(teamId).sockets) { + io.of("player").to(socketId).emit(event, data) } } -function playersBroadcast(event,data) { - for(let team of game.teams) { - teamBroadcast(team.id,event,data); +function playersBroadcast(event, data) { + for (let team of game.teams) { + teamBroadcast(team.id, event, data); + } +} + +function logoutPlayer(id) { + for (let team of game.teams) { + team.sockets = team.sockets.filter((sid) => sid != id); } } @@ -70,6 +76,10 @@ io.of("admin").on("connection", (socket) => { loggedInSockets = loggedInSockets.filter(s => s !== socket.id); }); + socket.on("logout", () => { + loggedInSockets = loggedInSockets.filter(s => s !== socket.id); + }) + //User is attempting to log in socket.on("login", (password) => { if (password === ADMIN_PASSWORD && !loggedIn) { @@ -87,40 +97,40 @@ io.of("admin").on("connection", (socket) => { //User is attempting to add a new team socket.on("add_team", (teamName) => { - if(!loggedIn) { + if (!loggedIn) { socket.emit("error", "Not logged in"); return; } - if(game.addTeam(teamName)) { + if (game.addTeam(teamName)) { secureBroadcast("teams", game.teams); - }else { + } else { socket.emit("error", "Error adding team"); } }); //User is attempting to remove a team socket.on("remove_team", (teamId) => { - if(!loggedIn) { + if (!loggedIn) { socket.emit("error", "Not logged in"); return; } - if(game.removeTeam(teamId)) { + if (game.removeTeam(teamId)) { secureBroadcast("teams", game.teams); - }else { + } else { socket.emit("error", "Error removing team"); } }); //User is attempting to change the game state socket.on("change_state", (state) => { - if(!loggedIn) { + if (!loggedIn) { socket.emit("error", "Not logged in"); return; } - if(game.setState(state)) { + if (game.setState(state)) { secureBroadcast("game_state", game.state); playersBroadcast("game_state", game.state) - }else { + } else { socket.emit("error", "Error setting state"); } }); @@ -129,11 +139,11 @@ io.of("admin").on("connection", (socket) => { //Note that we never check if the new order contains the same teams as the old order, so it behaves more like a setTeams function //But the frontend should always send the same teams in a different order socket.on("reorder_teams", (newOrder) => { - if(!loggedIn) { + if (!loggedIn) { socket.emit("error", "Not logged in"); return; } - if(game.reorderTeams(newOrder)) { + if (game.reorderTeams(newOrder)) { secureBroadcast("teams", game.teams); } else { socket.emit("error", "Error reordering teams"); @@ -141,11 +151,11 @@ io.of("admin").on("connection", (socket) => { }); socket.on("update_team", (teamId, newTeam) => { - if(!loggedIn) { + if (!loggedIn) { socket.emit("error", "Not logged in"); return; } - if(game.updateTeam(teamId, newTeam)) { + if (game.updateTeam(teamId, newTeam)) { secureBroadcast("teams", game.teams); sendUpdatedTeamInformations(teamId) } @@ -154,11 +164,11 @@ io.of("admin").on("connection", (socket) => { //Request an update of the team list //We only reply to the sender to prevent spam socket.on("get_teams", () => { - if(!loggedIn) { + if (!loggedIn) { socket.emit("error", "Not logged in"); return; } - socket.emit("teams", game.teams); + socket.emit("teams", game.teams); }); }); @@ -185,47 +195,50 @@ io.of("player").on("connection", (socket) => { socket.on("disconnect", () => { console.log("user disconnected"); - if(teamId !== null && game.getTeam(teamId) !== undefined){ - game.getTeam(teamId).sockets = game.getTeam(teamId).sockets.filter(s => s !== socket.id); - } + logoutPlayer(socket.id) }); socket.on("login", (loginTeamId) => { - if(game.getTeam(loginTeamId) === undefined) { + if (game.getTeam(loginTeamId) === undefined) { socket.emit("login_response", false); return; } + logoutPlayer(socket.id) teamId = loginTeamId; let team = game.getTeam(loginTeamId); team.sockets.push(socket.id); - socket.emit("login_response", true); sendUpdatedTeamInformations(loginTeamId); + socket.emit("login_response", true); socket.emit("game_state", game.state) }); + socket.on("logout", () => { + logoutPlayer(socket.id); + }) + socket.on("update_position", (position) => { // Only the first player to connect to the team socket can update the current position // This is done to prevent multiple clients from sending slightly different prosition back and forth // Making the point jitter on the map - if(!teamId) { + if (!teamId) { socket.emit("error", "not logged in yet"); return; } let team = game.getTeam(teamId) - if(team.sockets.indexOf(socket.id) == 0) { + if (team.sockets.indexOf(socket.id) == 0) { game.updateLocation(teamId, position); - teamBroadcast(teamId, "update_team", {currentLocation: team.currentLocation, ready:team.ready }); + teamBroadcast(teamId, "update_team", { currentLocation: team.currentLocation, ready: team.ready }); } }); - + socket.on("send_position", () => { game.sendLocation(teamId); let team = game.getTeam(teamId); - if(team === undefined) { + if (team === undefined) { socket.emit("error", "Team not found"); return; } game.updateTeamChasing(); - teamBroadcast(teamId, "update_team", {enemyLocation: team.enemyLocation}); + teamBroadcast(teamId, "update_team", { enemyLocation: team.enemyLocation }); }); });