diff --git a/server.js b/server.js index 9d7540e423e40d7ad81a9f8e801bffc7d69e4f92..743ac83a5414c8945a3fa324152cdb7edaccf7f1 100644 --- a/server.js +++ b/server.js @@ -15,7 +15,6 @@ app.use(express.static('public')); io.on('connection', (socket) => { console.log('A user connected:', socket.id); - // Create a room socket.on('createRoom', (playerName) => { const roomCode = Math.random().toString(36).substring(2, 7).toUpperCase(); rooms[roomCode] = { @@ -31,7 +30,6 @@ io.on('connection', (socket) => { console.log(`Room created with code ${roomCode} by ${playerName}`); }); - // Join a room socket.on('joinRoom', ({ roomCode, playerName, playerId }) => { const room = rooms[roomCode]; @@ -53,8 +51,6 @@ socket.on('joinRoom', ({ roomCode, playerName, playerId }) => { } }); - - socket.on('gameSettings', ({ roomCode, category, difficulty, numQuestions }) => { if (rooms[roomCode]) { rooms[roomCode].settings = { category, difficulty, numQuestions }; @@ -88,20 +84,50 @@ socket.on('joinRoom', ({ roomCode, playerName, playerId }) => { }); socket.on('nextQuestion', (roomCode) => { - sendNextQuestion(roomCode); - }); + const room = rooms[roomCode]; + if (!room) return; + + if (room.timer) { + clearInterval(room.timer); + room.timer = null; + } + + sendNextQuestion(roomCode); +}); function sendNextQuestion(roomCode) { - const room = rooms[roomCode]; - if (room && room.questions.length > 0) { - room.questions.shift(); - if (room.questions.length > 0) { - io.to(roomCode).emit('newQuestion', room.questions[0]); - } else { + const room = rooms[roomCode]; + if (!room) return; + + if (room.questions.length > 0) { + const currentQuestion = room.questions.shift(); + io.to(roomCode).emit('newQuestion', currentQuestion); + + if (room.timer) { + clearInterval(room.timer); + room.timer = null; + } + + room.timeRemaining = 60; + room.timer = setInterval(() => { + room.timeRemaining -= 1; + io.to(roomCode).emit('timerUpdate', room.timeRemaining); + + if (room.timeRemaining <= 0) { + clearInterval(room.timer); + room.timer = null; + sendNextQuestion(roomCode); + } + }, 1000); + } else { determineWinner(roomCode); - } + + if (room.timer) { + clearInterval(room.timer); + room.timer = null; + } } - } +} function determineWinner(roomCode) { const room = rooms[roomCode]; @@ -109,29 +135,40 @@ socket.on('joinRoom', ({ roomCode, playerName, playerId }) => { const players = Object.entries(room.players); const winner = players.reduce((topPlayer, [id, player]) => { - return player.score > topPlayer.score ? player : topPlayer; + return player.score > topPlayer.score ? player : topPlayer; }, { name: 'No one', score: 0 }); io.to(roomCode).emit('gameOver', { - winner: { name: winner.name, score: winner.score }, - scores: Object.values(room.players).map(player => ({ - name: player.name, - score: player.score - })) + winner: { name: winner.name, score: winner.score }, + scores: Object.values(room.players).map(player => ({ + name: player.name, + score: player.score + })) }); - delete rooms[roomCode]; - } + if (room.timer) { + clearInterval(room.timer); + room.timer = null; + } + + delete rooms[roomCode]; +} socket.on('disconnect', () => { - console.log('User disconnected:', socket.id); - for (const roomCode of Object.keys(rooms)) { - if (rooms[roomCode].players[socket.id]) { - delete rooms[roomCode].players[socket.id]; - console.log(`User ${socket.id} removed from room ${roomCode}`); + console.log('User disconnected:', socket.id); + for (const roomCode of Object.keys(rooms)) { + if (rooms[roomCode].players[socket.id]) { + delete rooms[roomCode].players[socket.id]; + console.log(`User ${socket.id} removed from room ${roomCode}`); + if (Object.keys(rooms[roomCode].players).length === 0) { + if (rooms[roomCode].timer) { + clearInterval(rooms[roomCode].timer); + } + delete rooms[roomCode]; } } - }); + } + }); }); function fetchQuestions(category, difficulty, numQuestions) { @@ -169,4 +206,3 @@ function shuffleArray(array) { } server.listen(PORT, () => console.log(`Server is running on http://localhost:${PORT}`)); -