From d43fa3768c5e9eee06c0af3b093c84aa38aedbf8 Mon Sep 17 00:00:00 2001 From: MikunoNaka Date: Sat, 31 Jul 2021 20:06:30 +0530 Subject: Added basic rooms support --- src/server/index.js | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'src/server') diff --git a/src/server/index.js b/src/server/index.js index 2799805..c770e15 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -37,6 +37,8 @@ const getScore = (winner, scoreX, scoreO, board) => ({ scoreO: winner === 0 ? scoreO + 1 : scoreO }) +// old WORKING code +/* io.on('connection', (socket) => { socket.on('update-remote-data', (data) => { if (data.board.includes(0) || data.board.includes(1)) { @@ -57,6 +59,43 @@ io.on('connection', (socket) => { }; }); }); +*/ + +const getID = () => Math.floor(1000 + Math.random() * 9000); + +io.on('connection', (socket) => { + socket.on('host', () => { + const id = (`${getID()}`); + socket.join(id); + io.to(id).emit('set-host-id', id) + }); + + socket.on('join', (id) => { + socket.join(id) + // TODO: send confirmation + }); + + socket.on('update-remote-data', (data) => { + const room = Array.from(socket.rooms)[1] + + if (data.board.includes(0) || data.board.includes(1)) { + const rows = getRows(data.board); + const winner = (rows.some((i) => allEqual(i)) + || getCols(rows).some((i) => allEqual(i)) + || [getLeftDiagonal(data.board), getRightDiagonal(data.board)].some((i) => allEqual(i)) + ) ? data.turn : 2; + + const score = getScore(winner, data.scoreX, data.scoreO, data.board) + io.to(room).emit('update-client-data', { + board: data.board, + turn: score.winner ? data.turn : (data.turn === 0 ? 1 : 0), + score: score + }); + + score.winner && io.to(room).emit('update-winner', score) + }; + }); +}); // serve static front end app.use(express.static(path.join(__dirname, '../../build'))); -- cgit v1.2.3 From 4766a5d0caac22453ab99f386d80c6c132407904 Mon Sep 17 00:00:00 2001 From: MikunoNaka Date: Sun, 1 Aug 2021 01:52:33 +0530 Subject: Added protection against duplicate room codes --- src/server/index.js | 52 ++++++++++++++++++++-------------------------------- 1 file changed, 20 insertions(+), 32 deletions(-) (limited to 'src/server') diff --git a/src/server/index.js b/src/server/index.js index c770e15..a4c9c5c 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -12,6 +12,20 @@ const io = require("socket.io")(http, { } }); +// also checks for duplicates +const getCode = () => { + const code = `${Math.floor(1000 + Math.random() * 9000)}`; + + const connectedSockets = []; + io.sockets.sockets.forEach( + (i) => connectedSockets.push(i) + ); + + return connectedSockets.some( + (i) => Array.from(i.rooms)[1] === code + ) ? getCode() : code; +} + const allEqual = (arr) => arr.includes(2) ? false : arr.every(i => i === arr[0]) @@ -37,42 +51,16 @@ const getScore = (winner, scoreX, scoreO, board) => ({ scoreO: winner === 0 ? scoreO + 1 : scoreO }) -// old WORKING code -/* -io.on('connection', (socket) => { - socket.on('update-remote-data', (data) => { - if (data.board.includes(0) || data.board.includes(1)) { - const rows = getRows(data.board); - const winner = (rows.some((i) => allEqual(i)) - || getCols(rows).some((i) => allEqual(i)) - || [getLeftDiagonal(data.board), getRightDiagonal(data.board)].some((i) => allEqual(i)) - ) ? data.turn : 2; - - const score = getScore(winner, data.scoreX, data.scoreO, data.board) - io.emit('update-client-data', { - board: data.board, - turn: score.winner ? data.turn : (data.turn === 0 ? 1 : 0), - score: score - }); - - score.winner && io.emit('update-winner', score) - }; - }); -}); -*/ - -const getID = () => Math.floor(1000 + Math.random() * 9000); - io.on('connection', (socket) => { socket.on('host', () => { - const id = (`${getID()}`); - socket.join(id); - io.to(id).emit('set-host-id', id) + const code = getCode(); + socket.join(code); + io.to(code).emit('broadcast code', code); }); - socket.on('join', (id) => { - socket.join(id) - // TODO: send confirmation + socket.on('join', (code) => { + socket.join(code); + io.to(code).emit('user joined'); }); socket.on('update-remote-data', (data) => { -- cgit v1.2.3 From 1a40b90e29dc61ed28ad251b49e9175a2215c3d0 Mon Sep 17 00:00:00 2001 From: MikunoNaka Date: Sun, 1 Aug 2021 02:09:41 +0530 Subject: added functionality to detect incorrect room code --- src/server/index.js | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'src/server') diff --git a/src/server/index.js b/src/server/index.js index a4c9c5c..5eeff99 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -12,20 +12,24 @@ const io = require("socket.io")(http, { } }); -// also checks for duplicates -const getCode = () => { - const code = `${Math.floor(1000 + Math.random() * 9000)}`; - +// check if room exists +const checkCode = (code) => { const connectedSockets = []; io.sockets.sockets.forEach( (i) => connectedSockets.push(i) ); + // returns true if room exists return connectedSockets.some( (i) => Array.from(i.rooms)[1] === code - ) ? getCode() : code; + ); } +// generate new room code +// also checks for duplicates +const getCode = (code = `${Math.floor(1000 + Math.random() * 9000)}`) => + checkCode(code) ? getCode : code; + const allEqual = (arr) => arr.includes(2) ? false : arr.every(i => i === arr[0]) @@ -59,8 +63,13 @@ io.on('connection', (socket) => { }); socket.on('join', (code) => { - socket.join(code); - io.to(code).emit('user joined'); + if (checkCode(code)) { + socket.join(code); + io.to(code).emit('player joined'); + } else { + // error if room doesn't exist + socket.emit('join failed') + } }); socket.on('update-remote-data', (data) => { -- cgit v1.2.3 From b8babd592b60b1a2cfedac3956184207a3d4bb8d Mon Sep 17 00:00:00 2001 From: MikunoNaka Date: Sun, 1 Aug 2021 02:34:59 +0530 Subject: created menu entry to enter join code --- src/server/index.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src/server') diff --git a/src/server/index.js b/src/server/index.js index 5eeff99..a5aa97f 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -3,10 +3,14 @@ const app = express(); const http = require('http').Server(app); const path = require('path'); -// const io = require('socket.io')(http); const io = require("socket.io")(http, { cors: { - origin: ["http://localhost:5000", "http://localhost:3000"], + origin: [ + "http://localhost:5000", + "http://localhost:3000", + "https://mikunonaka-tic-tac-toe.herokuapp.com", + "http://mikunonaka-tic-tac-toe.herokuapp.com" + ], "Access-Control-Allow-Origin": "*", methods: ["GET", "POST"] } -- cgit v1.2.3