From 905da933dc5bb89f61dafc16519d29daa4bebcde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20CHOMAZ?= Date: Fri, 23 Jan 2026 18:40:44 +0100 Subject: [PATCH] Modification du score-manager --- VNode/services/game/score-manager.js | 169 +++++++++++++++------------ 1 file changed, 97 insertions(+), 72 deletions(-) diff --git a/VNode/services/game/score-manager.js b/VNode/services/game/score-manager.js index af9564a6..c1317517 100644 --- a/VNode/services/game/score-manager.js +++ b/VNode/services/game/score-manager.js @@ -1,9 +1,9 @@ const args = process.argv; // Vérification si un paramètre est passé, si c'est le cas c'est qu'on fournis un fichier de score pour reprendre le jeu la ou il était -if (args[2] !== undefined){ +if (args[2] !== undefined) { global.ScoreFile = args[2] -}else{ +} else { global.ScoreFile = "XXX.json" } @@ -50,36 +50,36 @@ fs.access(filePath, fs.constants.F_OK, (err) => { const initialContent = { "TEAM": { "Red": { - "Name": "XXX", - "TotalScore": 0, - "RoundScore": 0, - "Penality": 0, - "MasterPoint": 0 + "Name": "XXX", + "TotalScore": 0, + "RoundScore": 0, + "Penality": 0, + "MasterPoint": 0 }, "Blue": { - "Name": "XXX", - "TotalScore": 0, - "RoundScore": 0, - "Penality": 0, - "MasterPoint": 0 + "Name": "XXX", + "TotalScore": 0, + "RoundScore": 0, + "Penality": 0, + "MasterPoint": 0 }, "Yellow": { - "Name": "XXX", - "TotalScore": 0, - "RoundScore": 0, - "Penality": 0, - "MasterPoint": 0 + "Name": "XXX", + "TotalScore": 0, + "RoundScore": 0, + "Penality": 0, + "MasterPoint": 0 }, "Green": { - "Name": "XXX", - "TotalScore": 0, - "RoundScore": 0, - "Penality": 0, - "MasterPoint": 0 + "Name": "XXX", + "TotalScore": 0, + "RoundScore": 0, + "Penality": 0, + "MasterPoint": 0 } } }; - + fs.writeFile(newFilePath, JSON.stringify(initialContent, null, 2), (err) => { if (err) { console.error("Erreur de création du fichier :", err); @@ -108,10 +108,10 @@ function updateTeamTotalScore(teamColor, points) { if (!jsonData.TEAM.hasOwnProperty(teamColor)) { console.error(`L'équipe ${teamColor} n'existe pas.`); return; - } - + } + const change = parseInt(points, 10); - + // Mettre à jour le score jsonData.TEAM[teamColor].TotalScore += points; console.log(`Le score total pour l'équipe ${teamColor} est de ${jsonData.TEAM[teamColor].TotalScore} points !`) @@ -132,11 +132,15 @@ function updateTeamTotalScore(teamColor, points) { // Lecture du fichier de configuration -const config = JSON.parse(fs.readFileSync(path.join('services','config','config_game.json'), 'utf8')); +const configPath = path.join(__dirname, '../config/config_game.json'); +const config = JSON.parse(fs.readFileSync(configPath, 'utf8')); // Extraction des informations de config -const { services: { mqttHost, score: { MQTTconfig: { mqttScoreTopic, mqttScoreChangeTopic } } } } = config; -console.log(mqttScoreChangeTopic) +const { services: { mqttHost, score: { MQTTconfig: { mqttScoreTopic, mqttScoreChangeTopic } } } } = config; +console.log("DEBUG: Config loaded from:", configPath); +console.log("DEBUG: MQTT Host:", mqttHost); +console.log("DEBUG: Topics:", mqttScoreTopic, mqttScoreChangeTopic); + // Connexion au broker MQTT const client = mqtt.connect(mqttHost); @@ -156,6 +160,8 @@ client.on('message', (topic, message) => { let process; let Team; let Action; + let TotalScore = null; + let RoundScore = null; try { // Analyse du message reçu @@ -168,63 +174,82 @@ client.on('message', (topic, message) => { if (payload && typeof payload === 'object') { // Extraire la clé (la couleur) et la valeur associée Team = Object.keys(payload)[0]; // La première (et unique) clé - Action = payload[Team]; // La valeur associée - //console.log(`Team: ${Team}, Action: ${Action}`); + let value = payload[Team]; // La valeur associée + + if (typeof value === 'object') { + // Mode SET (valeur absolue) + if (value.hasOwnProperty('Total')) TotalScore = parseInt(value.Total, 10); + if (value.hasOwnProperty('Round')) RoundScore = parseInt(value.Round, 10); + Action = "SET"; + } else { + // Mode ADD (relatif) + Action = value; + } + process = true; } else { console.error(typeof payload); process = false; } - if (process === true){ - let currentScore = 0; - let change = 0 ; - switch (Team){ - case "Red": - change = parseInt(Action, 10); // Convertit 'action' en entier - if (!isNaN(change)) { - updateTeamTotalScore("Red", change) - } else { - console.error(`Action invalide : ${action}`); - } - break; - case "Blue": - change = parseInt(Action, 10); // Convertit 'action' en entier - if (!isNaN(change)) { - updateTeamTotalScore("Blue", change) - } else { - console.error(`Action invalide : ${action}`); - } - break; - case "Green": - change = parseInt(Action, 10); // Convertit 'action' en entier - if (!isNaN(change)) { - updateTeamTotalScore("Green", change) - } else { - console.error(`Action invalide : ${action}`); - } - break; - case "Yellow": - change = parseInt(Action, 10); // Convertit 'action' en entier - if (!isNaN(change)) { - updateTeamTotalScore("Yellow", change) - } else { - console.error(`Action invalide : ${action}`); - } - break; + if (process === true) { + if (Action === "SET") { + // Mise à jour absolue + updateTeamScoreAbsolute(Team, TotalScore, RoundScore); + } else { + // Mise à jour relative (existant) + let change = parseInt(Action, 10); + if (!isNaN(change)) { + updateTeamTotalScore(Team, change); + } else { + console.error(`Action invalide : ${Action}`); + } } } }); +// Fonction pour mettre à jour le score d'une équipe (Absolu) +function updateTeamScoreAbsolute(teamColor, totalScore, roundScore) { + fs.readFile(filePath, 'utf8', (err, data) => { + if (err) { + console.error("Erreur de lecture du fichier :", err); + return; + } + try { + const jsonData = JSON.parse(data); + if (!jsonData.TEAM.hasOwnProperty(teamColor)) { + console.error(`L'équipe ${teamColor} n'existe pas.`); + return; + } + + if (totalScore !== null && !isNaN(totalScore)) { + jsonData.TEAM[teamColor].TotalScore = totalScore; + } + if (roundScore !== null && !isNaN(roundScore)) { + jsonData.TEAM[teamColor].RoundScore = roundScore; + } + + console.log(`Mise à jour absolue pour ${teamColor} -> Total: ${jsonData.TEAM[teamColor].TotalScore}, Round: ${jsonData.TEAM[teamColor].RoundScore}`); + + client.publish(mqttScoreTopic, JSON.stringify(jsonData)); + fs.writeFile(filePath, JSON.stringify(jsonData, null, 2), (err) => { + if (err) console.error("Erreur d'écriture :", err); + }); + } catch (parseErr) { + console.error("Erreur JSON :", parseErr); + } + }); +} + (async () => { while (true) { - console.log("Boucle en arrière-plan"); - - await new Promise((resolve) => setTimeout(resolve, 2000)); // Pause de 2 secondes - //client.publish(mqttScoreTopic, JSON.stringify(global.jsonData)); + console.log("Boucle en arrière-plan"); + + await new Promise((resolve) => setTimeout(resolve, 2000)); // Pause de 2 secondes + //client.publish(mqttScoreTopic, JSON.stringify(global.jsonData)); } - })(); +})(); client.on('error', (error) => { console.error('Erreur de connexion au broker MQTT:', error.message);