const { getRoom, updateRoom } = require('../services/roomService'); const { colors } = require('../utils/constants'); module.exports = socket => { const req = socket.request; const handleLogin = async data => { const room = await getRoom(data.roomId); if (room.isFull()) return socket.emit('error:changeRoom'); if (room.started) return socket.emit('error:changeRoom'); if (room.private && room.password !== data.password) return socket.emit('error:wrongPassword'); addPlayerToExistingRoom(room, data); }; const handleReady = async () => { const room = await getRoom(req.session.roomId); room.getPlayer(req.session.playerId).changeReadyStatus(); if (room.canStartGame()) { room.startGame(); } await updateRoom(room); }; const addPlayerToExistingRoom = async (room, data) => { room.addPlayer(data.name); if (room.isFull()) { room.startGame(); } await updateRoom(room); reloadSession(room); }; // Since it is not bound to an HTTP request, the session must be manually reloaded and saved const reloadSession = room => { req.session.reload(err => { if (err) return socket.disconnect(); req.session.roomId = room._id.toString(); req.session.playerId = room.players[room.players.length - 1]._id.toString(); req.session.color = colors[room.players.length - 1]; req.session.save(); socket.join(room._id.toString()); socket.emit('player:data', JSON.stringify(req.session)); }); }; socket.on('player:login', handleLogin); socket.on('player:ready', handleReady); };