ludo-web-multiplayer/backend/handlers/playerHandler.js
2023-11-26 16:30:33 +01:00

58 lines
1.8 KiB
JavaScript

const { getRoom, updateRoom, getJoinableRoom, createNewRoom, findPlayer } = require('../controllers/roomController');
const { colors } = require('../utils/constants');
module.exports = socket => {
const req = socket.request;
const handleLogin = async data => {
if (await findPlayer(req.sessionID)) return;
const room = await getJoinableRoom();
if (room) {
addPlayerToExistingRoom(room, data);
} else {
addNewRoom(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 addNewRoom = async data => {
const room = createNewRoom();
room.addPlayer(data.name, req.sessionID);
await room.save();
reloadSession(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);
};