From b9f1f99e0b11e2f05fe94ead14d409df84f89527 Mon Sep 17 00:00:00 2001 From: Baptiste Marcel Date: Wed, 6 Dec 2023 12:59:48 +0100 Subject: [PATCH] =?UTF-8?q?Correctif=20apport=C3=A9=20pour=20le=20fonction?= =?UTF-8?q?nement=20du=20temps=20lors=20d'une=20partie?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/controllers/ScoreboardController.js | 46 ++++++++++++-- .../server/api/routes/AuthRoutes.js | 3 + .../server/api/services/DatabaseService.js | 41 ++++++++++++ .../src/Components/GraphContainer.tsx | 32 +++++++--- .../src/Components/ScoreBoard.tsx | 63 ++++++++++++++++--- .../src/services/ScoreboardService.tsx | 46 ++++++++++++++ 6 files changed, 210 insertions(+), 21 deletions(-) diff --git a/cryptide_project/server/api/controllers/ScoreboardController.js b/cryptide_project/server/api/controllers/ScoreboardController.js index 6010beb..4854986 100644 --- a/cryptide_project/server/api/controllers/ScoreboardController.js +++ b/cryptide_project/server/api/controllers/ScoreboardController.js @@ -22,7 +22,26 @@ class SessionController { } catch(error){ console.error(error); - res.status(500).json({ error: 'Erreur lors de la récupération du scoreboard.' }); + res.status(500).json({ error: 'Erreur lors de la récupération des stats dailyMastermind.' }); + } + finally{ + await db.disconnect(); + } + } + + static async getDailyEasyEnigma(req, res){ + const db = new DatabaseService(); + + try{ + await db.connect(); + + const dailyEasyEnigmaStats = await db.getDailyEnigmaStats(ENIGME_FACILE); + + res.status(200).json({ tab : dailyEasyEnigmaStats }); + } + catch(error){ + console.error(error); + res.status(500).json({ error: 'Erreur lors de la récupération des stats dailyEasyEnigma.' }); } finally{ await db.disconnect(); @@ -41,7 +60,7 @@ class SessionController { } catch(error){ console.error(error); - res.status(500).json({ error: 'Erreur lors de la récupération du scoreboard.' }); + res.status(500).json({ error: 'Erreur lors de la récupération des stats dailyOnline' }); } finally{ await db.disconnect(); @@ -64,7 +83,26 @@ class SessionController { } catch(error){ console.error(error); - res.status(500).json({ error: 'Erreur lors de la récupération du scoreboard.' }); + res.status(500).json({ error: 'Erreur lors de la récupération des stats weeklyMastermind.' }); + } + finally{ + await db.disconnect(); + } + } + + static async getWeeklyEasyEnigma(req, res){ + const db = new DatabaseService(); + + try{ + await db.connect(); + + const weeklyEasyEnigmaStats = await db.getWeeklyEnigmaStats(ENIGME_FACILE); + + res.status(200).json({ tab : weeklyEasyEnigmaStats }); + } + catch(error){ + console.error(error); + res.status(500).json({ error: 'Erreur lors de la récupération des stats weeklyEasyEnigma.' }); } finally{ await db.disconnect(); @@ -83,7 +121,7 @@ class SessionController { } catch(error){ console.error(error); - res.status(500).json({ error: 'Erreur lors de la récupération du scoreboard.' }); + res.status(500).json({ error: 'Erreur lors de la récupération des stats weeklyOnline' }); } finally{ await db.disconnect(); diff --git a/cryptide_project/server/api/routes/AuthRoutes.js b/cryptide_project/server/api/routes/AuthRoutes.js index 9622c3b..5d0ad78 100644 --- a/cryptide_project/server/api/routes/AuthRoutes.js +++ b/cryptide_project/server/api/routes/AuthRoutes.js @@ -23,9 +23,12 @@ router.put('/session/updatePseudo', SessionController.UpdatePseudo); // Routes pour le daily scoreboard router.get('/scoreboard/getDailyMastermind', ScoreboardController.getDailyMastermind); +router.get('/scoreboard/getDailyEasyEnigma', ScoreboardController.getDailyEasyEnigma); router.get('/scoreboard/getDailyOnline', ScoreboardController.getDailyOnline); + // Routes pour le weekly scoreboard router.get('/scoreboard/getWeeklyMastermind', ScoreboardController.getWeeklyMastermind); +router.get('/scoreboard/getWeeklyEasyEnigma', ScoreboardController.getWeeklyEasyEnigma); router.get('/scoreboard/getWeeklyOnline', ScoreboardController.getWeeklyOnline); diff --git a/cryptide_project/server/api/services/DatabaseService.js b/cryptide_project/server/api/services/DatabaseService.js index 7c8e9c2..7074dee 100644 --- a/cryptide_project/server/api/services/DatabaseService.js +++ b/cryptide_project/server/api/services/DatabaseService.js @@ -152,6 +152,25 @@ class DatabaseService { }); } + async getDailyEnigmaStats(enigmaLevel) { + return new Promise((resolve, reject) => { + const currentDate = new Date().toISOString().slice(0, 10); + + this.client.all( + 'SELECT pseudo, time FROM users INNER JOIN games ON users.idUser = games.idUser WHERE gameType = ? AND SUBSTR(playedDate, 1, 10) = ? ORDER BY time DESC LIMIT 10', + enigmaLevel, + currentDate, + (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + } + ); + }); + } + async getDailyOnlineStats() { return new Promise((resolve, reject) => { const currentDate = new Date().toISOString().slice(0, 10); @@ -197,6 +216,28 @@ class DatabaseService { }); } + async getWeeklyEnigmaStats(enigmaLevel) { + return new Promise((resolve, reject) => { + const currentDate = new Date().toISOString().slice(0, 10); + const currentDay = new Date().getDay(); + const firstDayOfWeek = new Date(new Date().setDate(new Date().getDate() - currentDay)).toISOString().slice(0, 10); + + this.client.all( + 'SELECT pseudo, time FROM users INNER JOIN games ON users.idUser = games.idUser WHERE gameType = ? AND SUBSTR(playedDate, 1, 10) BETWEEN ? AND ? ORDER BY time DESC LIMIT 10', + enigmaLevel, + firstDayOfWeek, + currentDate, + (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + } + ); + }); + } + async getWeeklyOnlineStats() { return new Promise((resolve, reject) => { const currentDate = new Date().toISOString().slice(0, 10); diff --git a/cryptide_project/src/Components/GraphContainer.tsx b/cryptide_project/src/Components/GraphContainer.tsx index c823c92..78b3cb5 100644 --- a/cryptide_project/src/Components/GraphContainer.tsx +++ b/cryptide_project/src/Components/GraphContainer.tsx @@ -66,6 +66,8 @@ let firstPlayer = 0 let cptBug = 0 let cptUseEffect = 0 let testPlayers: Player[] = [] +let testTemps = 0 +let testFirst = false const MyGraphComponent: React.FC = ({onNodeClick, handleShowTurnBar, handleTurnBarTextChange, playerTouched, setPlayerTouched, changecptTour, solo, isDaily, isEasy, addToHistory, showLast, setNetwork, setNetworkEnigme, setPlayerIndex, askedWrong, setAskedWrong, importToPdf, setImportToPdf}) => { @@ -75,7 +77,7 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS let initMtn = 0 const {isLoggedIn, user, manager} = useAuth(); - const { indices, indice, person, personNetwork, setNodeIdData, players, setPlayersData, askedPersons, setActualPlayerIndexData, room, actualPlayerIndex, turnPlayerIndex, setTurnPlayerIndexData, setWinnerData, dailyEnigme, setNbCoupData, settempsData, setNetworkDataData, setSeedData, nodesC} = useGame(); + const { indices, indice, person, personNetwork, setNodeIdData, players, setPlayersData, askedPersons, setActualPlayerIndexData, room, actualPlayerIndex, turnPlayerIndex, setTurnPlayerIndexData, setWinnerData, dailyEnigme, setNbCoupData, settempsData, setNetworkDataData, setSeedData, nodesC, temps} = useGame(); const params = new URLSearchParams(window.location.search); const navigate = useNavigate(); @@ -84,10 +86,16 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS const [elapsedTime, setElapsedTime] = useState(0); useEffect(() => { + if (testFirst){ + testTemps = 0 + endgame = false + testFirst = false + } // Démarrez le timer au montage du composant const intervalId = setInterval(() => { setElapsedTime((prevElapsedTime) => prevElapsedTime + 0.5); settempsData(elapsedTime) + testTemps += 0.5 cptBug ++ if (cptBug > 10){ @@ -99,6 +107,7 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS // Vérifiez si la durée est écoulée, puis arrêtez le timer if (endgame) { clearInterval(intervalId); + testTemps = 0 } }, 500); @@ -762,7 +771,7 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS setLastIndex(-1) setPlayerTouched(-1) setWinnerData(winner) - setElapsedTime(0) + first = true cptHistory = 0 @@ -779,10 +788,10 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS // console.log("nbGames: " + user.onlineStats.nbGames + " nbWins: " + user.onlineStats.nbWins); if(winner.id === currentPlayer.id){ // Ajouter une victoire - manager.userService.addOnlineStats(user.pseudo, 1, elapsedTime); + manager.userService.addOnlineStats(user.pseudo, 1, testTemps - 0.5); } else{ - manager.userService.addOnlineStats(user.pseudo, 0, elapsedTime); + manager.userService.addOnlineStats(user.pseudo, 0, testTemps - 0.5); } } else{ @@ -795,6 +804,7 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS console.log(e); } finally{ + setElapsedTime(0) socket.off("end game") socket.off("asked all") socket.off("opacity activated") @@ -970,6 +980,7 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS if (person != undefined){ let index =0 let works = true + const statsTime = elapsedTime; for (const i of indices){ const tester = IndiceTesterFactory.Create(i) const test = tester.Works(person) @@ -990,26 +1001,25 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS } cptTour ++; setNbCoupData(cptTour) - setElapsedTime(0) - endgame = true try{ + console.log("time: " + testTemps) if(user && isLoggedIn){ if(solo){ if(isDaily){ // TODO: verif difficulté et add les stats // TODO: verif pour facile et difficile, si réussi en one shot ou non if(isEasy){ - manager.userService.addEasyEnigmaStats(user.pseudo, 1, elapsedTime); + manager.userService.addEasyEnigmaStats(user.pseudo, 1, testTemps - 0.5); } else{ - manager.userService.addHardEnigmaStats(user.pseudo, 1, elapsedTime); + manager.userService.addHardEnigmaStats(user.pseudo, 1, testTemps - 0.5); } } else{ // add stats mastermind if(user && user.mastermindStats){ - manager.userService.addMastermindStats(user.pseudo, cptTour, elapsedTime); + manager.userService.addMastermindStats(user.pseudo, cptTour, testTemps - 0.5); } } } @@ -1018,7 +1028,9 @@ const MyGraphComponent: React.FC = ({onNodeClick, handleS catch(error){ console.log(error); } - + testFirst = true + setElapsedTime(0) + endgame = true navigate("/endgame?solo=true&daily=" + isDaily) } diff --git a/cryptide_project/src/Components/ScoreBoard.tsx b/cryptide_project/src/Components/ScoreBoard.tsx index 9d504e6..e3ad3d4 100644 --- a/cryptide_project/src/Components/ScoreBoard.tsx +++ b/cryptide_project/src/Components/ScoreBoard.tsx @@ -49,10 +49,13 @@ const ScoreBoard: React.FC<{ Player: User }> = ({ Player }) => { try { const resultMM = await ScoreboardService.getDailyMastermindStats(); const resultOL = await ScoreboardService.getDailyOnlineStats(); - console.log(resultMM); - console.log(resultOL); + const resultEF = await ScoreboardService.getDailyEasyEnigmaStats(); + + console.log(resultEF); + setDailyMastermindStats(resultMM); setDailyOnlineStats(resultOL); + setDailyEasyEnigmaStats(resultEF); } catch (error) { console.error(error); } @@ -60,12 +63,15 @@ const ScoreBoard: React.FC<{ Player: User }> = ({ Player }) => { async function fetchWeeklyStats() { try{ - const resultWMM = await ScoreboardService.getWeeklyMastermindStats(); + const resultMM = await ScoreboardService.getWeeklyMastermindStats(); const resultOL = await ScoreboardService.getWeeklyOnlineStats(); - console.log(resultWMM); - console.log(resultOL); - setWeeklyMastermindStats(resultWMM); + const resultEF = await ScoreboardService.getWeeklyEasyEnigmaStats(); + + console.log(resultEF); + + setWeeklyMastermindStats(resultMM); setWeeklyOnlineStats(resultOL); + setWeeklyEasyEnigmaStats(resultEF); } catch (error) { console.error(error); } @@ -193,7 +199,9 @@ const ScoreBoard: React.FC<{ Player: User }> = ({ Player }) => { No data )} +
+ Multijoueur : {dailyOnlineStats !== null ? (dailyOnlineStats.tab.length !== 0 ? dailyOnlineStats.tab.map((stats: any, index: number) => ( @@ -209,6 +217,27 @@ const ScoreBoard: React.FC<{ Player: User }> = ({ Player }) => { No data )} + +
+ + Enigme facile : + {dailyEasyEnigmaStats !== null ? (dailyEasyEnigmaStats.tab.length !== 0 ? dailyEasyEnigmaStats.tab.map((stats: any, index: number) => ( + + {stats.pseudo} + {stats.time} + + )) : ( + + No data + + )) : ( + + No data + + )} + +
+ @@ -248,6 +277,26 @@ const ScoreBoard: React.FC<{ Player: User }> = ({ Player }) => { No data )} + +
+ + Enigme facile : + {weeklyEasyEnigmaStats !== null ? (weeklyEasyEnigmaStats.tab.length !== 0 ? weeklyEasyEnigmaStats.tab.map((stats: any, index: number) => ( + + {stats.pseudo} + {stats.time} + + )) : ( + + No data + + )) : ( + + No data + + )} + +
@@ -258,4 +307,4 @@ const ScoreBoard: React.FC<{ Player: User }> = ({ Player }) => { ); } -export default ScoreBoard; +export default ScoreBoard; \ No newline at end of file diff --git a/cryptide_project/src/services/ScoreboardService.tsx b/cryptide_project/src/services/ScoreboardService.tsx index cf7f72d..3251182 100644 --- a/cryptide_project/src/services/ScoreboardService.tsx +++ b/cryptide_project/src/services/ScoreboardService.tsx @@ -29,6 +29,29 @@ class ScoreboardService { } } + static async getDailyEasyEnigmaStats() { + try { + const response = await fetch(ADRESSE_DBSERVER + '/scoreboard/getDailyEasyEnigma', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include', + }); + + if (response.ok) { + const result = await response.json(); + return result; + } else { + const errorResponse = await response.json(); + throw new Error(errorResponse.error); + } + } catch (error) { + console.error(error); + throw error; + } + } + static async getDailyOnlineStats() { try { const response = await fetch(ADRESSE_DBSERVER + '/scoreboard/getDailyOnline', { @@ -79,6 +102,29 @@ class ScoreboardService { } } + static async getWeeklyEasyEnigmaStats() { + try { + const response = await fetch(ADRESSE_DBSERVER + '/scoreboard/getWeeklyEasyEnigma', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include', + }); + + if (response.ok) { + const result = await response.json(); + return result; + } else { + const errorResponse = await response.json(); + throw new Error(errorResponse.error); + } + } catch (error) { + console.error(error); + throw error; + } + } + static async getWeeklyOnlineStats() { try { const response = await fetch(ADRESSE_DBSERVER + '/scoreboard/getWeeklyOnline', {