diff --git a/models/game.model.js b/models/game.model.js index 363c3330e74ff83e7e0e702f17650b354f827f65..d3e483c7012fc23b2375ad1e1eac7c601c8d2c88 100644 --- a/models/game.model.js +++ b/models/game.model.js @@ -10,6 +10,7 @@ class Game { this.category = {}; this.usersAnswers = new Map(); this.pot = pot; + this.usersStatus = new Map(); } async setGameData() { @@ -25,7 +26,7 @@ class Game { 10, ); } - console.log(questions); + //console.log(questions); for (let i = 0; i < questions.length; i++) { const answers = await answerController.getAnswerForQuestion(questions[i]._id); this.gameData[i] = { @@ -37,16 +38,17 @@ class Game { this.usersAnswers.set(user, []); } - console.log(this.gameData); + //console.log(this.gameData); return this.gameData; } - addNewAnswer(user, answer) { - this.usersAnswers.get(user).push(answer); - return this.verifyAnswer(this.usersAnswers.get(user).length - 1, answer); + addNewAnswer(user, answer, index) { + this.usersAnswers.get(user)[index] = answer; + return this.verifyAnswer(index, answer); } verifyAnswer(questionNumber, answer) { + console.log(this.gameData[questionNumber]); return this.gameData[questionNumber].answers[answer].is_correct; } diff --git a/sockets/socketLogic.js b/sockets/socketLogic.js index ce9a4ddb3e43a892322e15f94fba28dd9c2efa48..3fb6f55d0996778a83600027bc9a436a31c4013c 100644 --- a/sockets/socketLogic.js +++ b/sockets/socketLogic.js @@ -11,6 +11,7 @@ const lobbies = []; const games = []; const map = new Map(); const lobbyTimers = new Map(); +const gameTimers = new Map(); /** * The number of connected users. * @type {number} @@ -64,9 +65,14 @@ async function convertLobbyToGame(lobbyId, socket) { lobby.price * lobby.users.length, ); await game.setGameData(); - console.log(game); - socket.to(lobbyId).emit("startGame", game); - socket.emit("startGame", game); + const reducedGame = { + id: game.id, + users: game.users, + category: game.category, + pot: game.pot, + }; + socket.to(lobbyId).emit("startGame", reducedGame); + socket.emit("startGame", reducedGame); const interval = setInterval(async () => { time--; socket.to(lobbyId).emit("timer", time); @@ -80,29 +86,50 @@ async function convertLobbyToGame(lobbyId, socket) { async function showQuestions(game, socket, questionNumber) { if (questionNumber === 10) return; - let time = 15; - const interval = setInterval(async () => { - time--; - socket.to(game.getGameId()).emit("timer", time); - socket.emit("timer", time); - if (time === 0) { - clearInterval(interval); - socket.to(game.getGameId()).emit("question", game.gameData[questionNumber]); - socket.emit("question", game.gameData[questionNumber]); - let waitTime = 10; - const wait = setInterval(async () => { - waitTime--; - socket.to(game.getGameId()).emit("timer", waitTime); - socket.emit("timer", waitTime); - if (waitTime === 0) { - clearInterval(wait); - showQuestions(game, socket, questionNumber + 1); - } - }, 1000); + + const showQuestion = async () => { + const question = game.gameData[questionNumber]; + const reducedAnswers = question.answers.map((answer) => ({ + text: answer.text, + })); + + const reducedQuestion = { + text: question.question.text, + fact: question.question.fact, + difficulty: question.question.difficulty, + answers: reducedAnswers, + number: questionNumber, + }; + + socket.to(game.getGameId()).emit("question", reducedQuestion); + socket.emit("question", reducedQuestion); + }; + + const wait = async (seconds, socket, roomId, setTimer) => { + for (let time = seconds; time > 0; time--) { + if (setTimer) { + gameTimers.set(roomId, time); + } + socket.to(roomId).emit("timer", time); + socket.emit("timer", time); + await new Promise((resolve) => setTimeout(resolve, 1000)); } - }, 1000); + gameTimers.delete(roomId); + }; + + while (questionNumber < 10) { + await showQuestion(); // Show the question + await wait(15, socket, game.id, true); // Wait for 15 seconds + //TODO: Send a new event to close the question + socket.to(game.getGameId()).emit("closeQuestion"); + socket.emit("closeQuestion"); + await wait(15, socket, game.id, false); // Wait for 15 more seconds + questionNumber++; // Move to the next question + } } +function showQuestionResult(game, socket) {} + function timer(lobbyId, socket) { let time = 30; const interval = setInterval(async () => { @@ -251,5 +278,44 @@ module.exports = (io) => { socket.to(data.id).emit("emoji", { emoji: data.emoji, username: data.username }); socket.emit("emoji", { emoji: data.emoji, username: data.username }); }); + + socket.on("answer", (data) => { + console.log(data); + if (!data.gameId) { + socket.emit("error", "Not gameId provided"); + return; + } + if (!data.username) { + socket.emit("error", "Not username provided"); + return; + } + if (data.questionNumber === undefined) { + socket.emit("error", "Not questionNumber provided"); + return; + } + if (data.answer === undefined) { + socket.emit("error", "Not answer provided"); + return; + } + const game = games.find((game) => game.id === data.gameId); + if (!game) { + socket.emit("error", "gameNotFound"); + return; + } + if (!gameTimers.get(game.id)) { + socket.emit("error", "notTimer"); + return; + } + if (gameTimers.get(game.id) === 0) { + socket.emit("error", "notTimer"); + return; + } + + const isCorrect = game.addNewAnswer(data.username, data.answer, data.questionNumber); + socket.emit("answerResponse", isCorrect); + if (!isCorrect) { + //TODO: ADD A FUNCTION TO BLOCK THE USER FROM A GAME + } + }); }); };