diff --git a/businesses/Room.js b/businesses/Room.js index b15e4ca..3231837 100644 --- a/businesses/Room.js +++ b/businesses/Room.js @@ -1,8 +1,7 @@ class Room { - constructor(room) { + constructor() { this.id = this.generateRoomId(); // change the id with something prettier this.players = []; - this.room = room; this.actualPlayer = ""; this.ennemy = ""; } @@ -28,14 +27,6 @@ class Room { return this.actualPlayer } - /* - endGame() { - this.room.players.forEach((player) => - io.to(player.socketId).emit("end game"), - ); - } - */ - move(move) { let ret = {isMove: false, player: this.actualPlayer} let playedCase = this.players.find((p) => p.id === this.ennemy).grid.cases[move.col][move.row]; @@ -43,12 +34,14 @@ class Room { if (playedCase.isPlayed === false) { this.players.find((p) => p.id === this.ennemy).grid.cases[move.col][move.row].isPlayed = true; + ret = {isMove: true, players: this.players, isHit: playedCase.isShip, + isWin: this.checkWin()} + let tmp = this.actualPlayer; this.actualPlayer = this.ennemy; this.ennemy = tmp; - ret = {isMove: true, players: this.players, isHit: playedCase.isShip, - isWin: this.checkWin(), player: this.actualPlayer} + ret.player = this.actualPlayer } return ret @@ -74,6 +67,7 @@ class Room { validBoards() { this.players.forEach((player) => { + // sometimes i get error here player.pieces.forEach((piece) => { for (let i = piece.startPos.x; i <= piece.endPos.x; i++) { for (let j = piece.startPos.y; j <= piece.endPos.y; j++) { diff --git a/index.js b/index.js index 6be7eff..ec46618 100644 --- a/index.js +++ b/index.js @@ -19,23 +19,26 @@ app.use(cookieParser()); const secretKey = process.env.COOKIE_SECRET_KEY; +// #region routing and cookies + app.get('/', (req, res) => { const token = req.cookies.authToken; if(token) { - res.sendFile(path.join(__dirname, '/public/pages/gameView.html')) + try { + jwt.verify(token, secretKey); + res.status(200) + res.sendFile(path.join(__dirname, '/public/pages/gameView.html')) + } catch (ex) { + res.status(401) + res.sendFile(path.join(__dirname, '/public/pages/connectionView.html')) + } } else { res.sendFile(path.join(__dirname, '/public/pages/connectionView.html')) } }) app.get('/game', (req, res) => { - const token = req.cookies.authToken; - - if (!token) { - res.sendFile(path.join(__dirname, '/public/pages/connectionView.html')) - } - res.sendFile(path.join(__dirname, '/public/pages/gameView.html')) }) @@ -43,7 +46,7 @@ app.post('/logIn', (req, res) => { const { pseudo, password } = req.body; if (!pseudo || !password) { - return res.status(400).send('Email and password are required.'); + return res.status(400).send('pseudo and password are required.'); } const query = 'SELECT * FROM users WHERE pseudo = ? AND password = ?'; @@ -120,6 +123,11 @@ app.get('/user-info', (req, res) => { } }); +// #endregion routing and cookies + + +// #region socket and game + let rooms = []; let players = []; @@ -128,8 +136,9 @@ io.on("connection", (socket) => { socket.on("disconnect", () => { const index = players.findIndex((p) => p.id === socket.id) + // if there is no room this line creates error const roomIndex = rooms.findIndex(room => - room.players.some(player => player.id === socket.id) + room.players.some((player) => player.id === socket.id) ); if (roomIndex !== -1) { @@ -154,6 +163,7 @@ io.on("connection", (socket) => { }) socket.on("first connection", (socketId) => { + // error my occurs if cookie is expired const cookies = socket.request.headers.cookie; const authToken = cookies.split('; ').find(cookie => cookie.startsWith('authToken=')).split('=')[1]; @@ -187,9 +197,20 @@ io.on("connection", (socket) => { }); }); - socket.on("ask for room", (roomId, id) => { + socket.on("ask for room", (roomId, id, callack) => { let room = rooms.find((r) => r.id === roomId); + if (room == null) { + callack({ + status: false + }) + return + } + + callack({ + status: true + }) + room.addPlayer(players.find((p) => p.id === id)); room.validBoards(); @@ -216,7 +237,7 @@ io.on("connection", (socket) => { let out = "" const room = rooms.find((r) => r.id === roomId) - if (room === undefined) { + if (room == null) { out = players.find((p) => p.id === id); } else { out = room.players.find((p) => p.id === id) @@ -245,6 +266,22 @@ io.on("connection", (socket) => { }); }); + socket.on("game ended", (roomId) => { + const room = rooms.find((r) => r.id === roomId) + const roomIndex = rooms.findIndex((r) => r.id === roomId) + + room.players.forEach(player => { + player.resetGrid() + io.to(player.id).emit("go to menu") + }); + + room.players = [] + rooms.slice(roomIndex, 1) + delete room + + console.log("rooms list : ", rooms) + }) + socket.on("reset grid", (roomId) => { const player = rooms.find((r) => r.id === roomId).players[0] player.resetGrid(); @@ -277,6 +314,9 @@ const sendMoveToPlayers = (moveData) => { askToPlay(moveData.player) }; +// #endregion socket and game + + http.listen(port, () => { console.log(`Listening on http://localhost:${port}`); }); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c294211..58afb2b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,9 +20,9 @@ } }, "node_modules/@socket.io/component-emitter": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.1.tgz", - "integrity": "sha512-dzJtaDAAoXx4GCOJpbB2eG/Qj8VDpdwkLsWGzGm+0L7E8/434RyMbAHmk9ubXWVAb9nXmc44jUf8GKqVDiKezg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" }, "node_modules/@types/cookie": { "version": "0.4.1", @@ -38,11 +38,11 @@ } }, "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", + "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.13.0" } }, "node_modules/accepts": { @@ -160,9 +160,9 @@ } }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", "engines": { "node": ">= 0.6" } @@ -179,14 +179,6 @@ "node": ">= 0.8.0" } }, - "node_modules/cookie-parser/node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -300,25 +292,17 @@ } }, "node_modules/engine.io-parser": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", - "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "engines": { "node": ">=10.0.0" } }, - "node_modules/engine.io/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/engine.io/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { "ms": "2.1.2" }, @@ -409,6 +393,14 @@ "node": ">= 0.10.0" } }, + "node_modules/express/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", @@ -822,9 +814,12 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -950,9 +945,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -1072,9 +1067,9 @@ } }, "node_modules/socket.io-adapter/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { "ms": "2.1.2" }, @@ -1105,9 +1100,9 @@ } }, "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { "ms": "2.1.2" }, @@ -1126,9 +1121,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/socket.io/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { "ms": "2.1.2" }, @@ -1196,9 +1191,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", + "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==" }, "node_modules/unpipe": { "version": "1.0.0", diff --git a/public/assets/style.css b/public/assets/style.css index 09b8cb0..7f6d109 100644 --- a/public/assets/style.css +++ b/public/assets/style.css @@ -8,7 +8,7 @@ display: none; } -#opponentLeftModal { +.modal { display: none; position: fixed; z-index: 1; @@ -21,20 +21,7 @@ background-color: rgba(0,0,0,0.4); } -#gameEndedModal { - display: none; - position: fixed; - z-index: 1; - left: 0; - top: 0; - width: 100%; - height: 100%; - overflow: auto; - background-color: rgb(0,0,0); - background-color: rgba(0,0,0,0.4); -} - -#opponentLeftModalContent { +.modalContent { background-color: #fefefe; margin: 15% auto; padding: 20px; @@ -49,4 +36,16 @@ padding: 15px 20px; border: none; cursor: pointer; +} + +.buttonChoice { + display: flex; + flex-direction: row; + justify-content: space-evenly; +} + + +#errorHandler { + margin-top: 3%; + color: red; } \ No newline at end of file diff --git a/public/pages/gameView.html b/public/pages/gameView.html index 4b5243f..0ffe48e 100644 --- a/public/pages/gameView.html +++ b/public/pages/gameView.html @@ -8,17 +8,20 @@
Your opponent has left the game.
We have a winner
- +