From a0e5de2c2f77ea8b73dc17c1326331f5b4dd7f34 Mon Sep 17 00:00:00 2001 From: "narindra.rajohnso" <narindra-hasimanjaka-david.rajohnson@etu.hesge.ch> Date: Fri, 9 Jun 2023 15:31:59 +0200 Subject: [PATCH] add begin game and send random question --- API/src/socket.io/ServerIO.ts | 78 ++++++++++++++++++++++++++++++++--- 1 file changed, 73 insertions(+), 5 deletions(-) diff --git a/API/src/socket.io/ServerIO.ts b/API/src/socket.io/ServerIO.ts index 9ec2874..62c9d21 100644 --- a/API/src/socket.io/ServerIO.ts +++ b/API/src/socket.io/ServerIO.ts @@ -3,6 +3,8 @@ import logger from '../logging/WinstonLogger'; import http from 'http'; import Server, {SocketIoInfo} from "../express/Server"; import {UserInfo} from "./UserInfo" +import {Database} from "../database/Database"; +import {Question} from "../database/models/Question"; //TODO: In this file you can add/edit all things about socket.io @@ -11,6 +13,11 @@ import {UserInfo} from "./UserInfo" class ServerIO extends IO.Server { players: { [key: string]: UserInfo } = {}; + playersReady: { [key: string]: boolean }={}; + questions!:Question[]; + currentQuestion: Question; + nbGamer=0; + constructor(server: http.Server) { super(server, { cors: { @@ -19,9 +26,10 @@ class ServerIO extends IO.Server { }); + this.on('connection', (socket: SocketIoInfo) => { - logger.info(`Nouveau socket vers ${ socket.client.conn.remoteAddress }`) ; - console.log(`Socket info: ${ socket.user.username } // ${ socket.user.firstname } // ${socket.user.lastname}`); + logger.info(`Nouveau socket vers ${socket.client.conn.remoteAddress}`); + console.log(`Socket info: ${socket.user.username} // ${socket.user.firstname} // ${socket.user.lastname}`); const playerKey = socket.user.username; // Vérifiez si le joueur existe déjà dans le dictionnaire if (this.players[playerKey]) { @@ -34,12 +42,11 @@ class ServerIO extends IO.Server { socket.user.firstname, socket.user.lastname ); + this.playersReady[playerKey] = false; console.log(`Player ${playerKey} is connected.`); } this.testNumberofPlayer(); - - this.registerEventsOnSocket(socket); }); @@ -47,6 +54,33 @@ class ServerIO extends IO.Server { } private registerEventsOnSocket(socket: SocketIoInfo) { + const playerKey = socket.user.username; + socket.on("player-ready", ()=>{ + if(this.playersReady[playerKey] === true){ + console.log(`player ${ playerKey } already ready`) + }else{ + logger.info(`player ${playerKey} ready`); + this.playersReady[playerKey]=true; + this.emit("ready-player", playerKey); + } + this.testNumberOfReady(); + }); + socket.on("player-not-ready", ()=>{ + if(this.playersReady[playerKey] === false){ + console.log(`player ${ playerKey } already not ready`) + }else{ + logger.info(`player ${playerKey} not ready`); + this.playersReady[playerKey]=false; + this.emit("not-ready-player", playerKey); + } + }) + socket.on("on-game", async () => { + this.nbGamer++; + if (this.nbGamer === 3) { + let randomQuestion = await this.getRandomQuestion(); + this.emit("question", randomQuestion); + } + }) socket.on('disconnect', () => { logger.info(`Deconnexion du socket ${ socket.client.conn.remoteAddress }`) ; @@ -58,6 +92,7 @@ class ServerIO extends IO.Server { if (this.players[playerKey]) { // Le joueur est connecté, retirez-le du dictionnaire delete this.players[playerKey]; + delete this.playersReady[playerKey]; console.log(`Player ${playerKey} is disconnected.`); } else { // Le joueur n'est pas trouvé dans le dictionnaire, cela peut être un cas anormal @@ -69,9 +104,12 @@ class ServerIO extends IO.Server { } private testNumberofPlayer(){ + + this.emit("players", Object.values(this.players)); + if(Object.keys(this.players).length < 3){ this.emit("players-left", 3 - Object.keys(this.players).length) - console.log(Object.keys(this.players).length) + console.log(Object.keys(this.players).length); } if (Object.keys(this.players).length === 3) { @@ -79,6 +117,36 @@ class ServerIO extends IO.Server { this.emit('start-game'); } } + + +// Méthode pour récupérer une question aléatoire + async getRandomQuestion() { + if (!this.questions || this.questions.length === 0) { + this.questions = await Database.getAllQuestions(); + this.questions.forEach(q => { + q.possibleResponse = JSON.parse(q.possibleResponse); + q.correctResponse = parseInt(String(q.correctResponse)); + }); + } + + const randomIndex = Math.floor(Math.random() * this.questions.length); + this.currentQuestion = this.questions[randomIndex]; + this.questions.splice(randomIndex, 1); + return this.currentQuestion; + } + + private testNumberOfReady() { + let allPlayerReady = true; + Object.values(this.playersReady).forEach(playerReady => { + if (!playerReady) { + allPlayerReady = false; + } + }); + if (allPlayerReady) { + this.emit("game-ready-start"); + } + + } } -- GitLab