From 46e79d36af6a3406cfbe48d6fc340bc3ce68fdd3 Mon Sep 17 00:00:00 2001 From: lukew3 Date: Tue, 1 Jun 2021 20:16:23 -0400 Subject: [PATCH] Fixed leaderboard and time not displaying correctly --- backend/models/user.js | 8 +-- backend/mongo-todo.md | 13 ++-- backend/server.js | 103 ++++++++++++++++++-------------- src/js/elements/leaderboards.js | 3 +- 4 files changed, 70 insertions(+), 57 deletions(-) diff --git a/backend/models/user.js b/backend/models/user.js index 6510fd255..18343b0db 100644 --- a/backend/models/user.js +++ b/backend/models/user.js @@ -28,12 +28,12 @@ const userSchema = new Schema( lbMemory: { //short for leaderboard memory time15: { - global: { type: Number, default: 0 }, //might not be an Number, I'm not sure - daily: { type: Number, default: 0 }, + global: { type: Number, default: -1 }, //might not be an Number, I'm not sure + daily: { type: Number, default: -1 }, }, time60: { - global: { type: Number, default: 0 }, - daily: { type: Number, default: 0 }, + global: { type: Number, default: -1 }, + daily: { type: Number, default: -1 }, }, }, globalStats: { diff --git a/backend/mongo-todo.md b/backend/mongo-todo.md index 11563ca52..e5eb586e1 100644 --- a/backend/mongo-todo.md +++ b/backend/mongo-todo.md @@ -6,18 +6,12 @@ ## Bugs -- Leaderboard doesn't show the time until the daily reset -- lbmemory is not edited by mongo/express so it leaderboard doesn't show change in placement like it's supposed to - Graph bugs out when new result is added but page is not refreshed - Graph loops back from earliest point to the new points - Results list isn't updated either -- Save config doesn't actually return data? -- Leaderboard says glb is undefined on first item -- Account button sometimes shows loading after new pr is set - - Can't navigate to user until page is refreshed - - After refresh, pr is not saved - Some methods in functions/index.js may be broken - I think bot commands like lbUpdate and such +- Leaderboard entries that should be hidden are not ### Minor/efficiency bugs @@ -28,6 +22,11 @@ - Name is not passed in user token/auth().currentUser - Firestore read operations seem high - Does this include index.html serving as well as user authentication or is there more? +- Account button sometimes shows loading infinitely after a test + - Can't navigate to user until page is refreshed + - After refresh, pr is not saved + - Can't induce this error and doesn't occur often so adding it as minor bug +- Does lbMemory work exactly like it did before ### Possibilities diff --git a/backend/server.js b/backend/server.js index 2ef794467..d66c94e94 100644 --- a/backend/server.js +++ b/backend/server.js @@ -33,11 +33,16 @@ function clearDailyLeaderboards() { var nextClear = new Date(); nextClear.setHours(24, 0, 0, 0); //next occurrence of 12am let currentTime = new Date(); + Leaderboard.find({ type: "daily" }, (err, lbs) => { + lbs.forEach((lb) => { + lb.resetTime = nextClear; + lb.save(); + }); + }); setTimeout(() => { Leaderboard.find({ type: "daily" }, (err, lbs) => { lbs.forEach((lb) => { lb.board = []; - lb.resetTime = nextClear; lb.save(); }); }); @@ -971,10 +976,10 @@ app.post("/api/saveConfig", authenticateToken, (req, res) => { try { if (req.uid === undefined || req.body.obj === undefined) { console.error(`error saving config for ${req.uid} - missing input`); - return { + res.send({ resultCode: -1, message: "Missing input", - }; + }); } let obj = req.body.obj; @@ -1013,10 +1018,10 @@ app.post("/api/saveConfig", authenticateToken, (req, res) => { request.obj )}` ); - return { + res.send({ resultCode: -1, message: "Bad input. " + errorMessage, - }; + }); } User.findOne({ uid: req.uid }, (err, user) => { @@ -1026,26 +1031,26 @@ app.post("/api/saveConfig", authenticateToken, (req, res) => { user.save(); }) .then(() => { - return { + res.send({ resultCode: 1, message: "Saved", - }; + }); }) .catch((e) => { console.error( `error saving config to DB for ${req.uid} - ${e.message}` ); - return { + res.send({ resultCode: -1, message: e.message, - }; + }); }); } catch (e) { console.error(`error saving config for ${req.uid} - ${e}`); - return { + res.send({ resultCode: -999, message: e, - }; + }); } }); @@ -1319,21 +1324,25 @@ app.post("/api/resetPersonalBests", authenticateToken, (req, res) => { }); function addToLeaderboard(lb, result, username) { - retData = {}; + //insertedAt is index of array inserted position, 1 is added after + retData = { insertedAt: -1 }; //check for duplicate user for (i = 0; i < lb.board.length; i++) { if (lb.board[i].name == username) { if (lb.board[i].wpm <= result.wpm) { //delete old entry if speed is faster this time lb.board.splice(i, 1); - retData.foundAt = i; + retData.foundAt = i + 1; + retData.newBest = true; } else { //don't add new entry if slower than last time - return lb, { insertedAt: -1 }; + return lb, { insertedAt: -1, foundAt: i + 1 }; } } } - if (!retData.foundAt) retData.foundAt = 0; + //when is newBest not true? + retData.newBest = true; + if (!retData.foundAt) retData.foundAt = -1; //determine if the entry should be hidden //add item to leaderboard @@ -1349,18 +1358,22 @@ function addToLeaderboard(lb, result, username) { hidden: false, }; if (lb.board.length == 0) { + console.log("adding to first position"); lb.board.push(lbitem); - retData.insertedAt = 1; + retData.insertedAt = 0; } else if (lbitem.wpm < lb.board.slice(-1)[0].wpm) { + console.log("adding to the end"); + console.log(lb.board.slice(-1)[0].wpm); lb.board.push(lbitem); - retData.insertedAt = lb.board.length + 1; + retData.insertedAt = lb.board.length - 1; } else { + console.log("searching for addition spot"); for (i = 0; i < lb.board.length; i++) { //start from top, if item wpm > lb item wpm, insert before it if (lbitem.wpm >= lb.board[i].wpm) { console.log("adding to daily lb position " + i); lb.board.splice(i, 0, lbitem); - retData.insertedAt = i + 1; + retData.insertedAt = i; break; } } @@ -1374,30 +1387,35 @@ function addToLeaderboard(lb, result, username) { app.post("/api/attemptAddToLeaderboards", authenticateToken, (req, res) => { const result = req.body.result; let retData = {}; - Leaderboard.find( - { - mode: result.mode, - mode2: result.mode2, - }, - (err, lbs) => { - //for all leaderboards queried, determine if it qualifies, and add if it does - lbs.forEach((lb) => { - if ( - lb.board.length == 0 || - lb.board.length < lb.size || - result.wpm > lb.board.slice(-1)[0].wpm - ) { - User.findOne({ uid: req.uid }, (err, user) => { - lb, (lbPosData = addToLeaderboard(lb, result, user.name)); //should uid be added instead of name + User.findOne({ uid: req.uid }, (err, user) => { + Leaderboard.find( + { + mode: result.mode, + mode2: result.mode2, + }, + (err, lbs) => { + //for all leaderboards queried, determine if it qualifies, and add if it does + lbs.forEach((lb) => { + if ( + lb.board.length == 0 || + lb.board.length < lb.size || + result.wpm > lb.board.slice(-1)[0].wpm + ) { + lb, (lbPosData = addToLeaderboard(lb, result, user.name)); //should uid be added instead of name? + console.log(user.lbMemory[lb.mode + lb.mode2][lb.type]); + //lbPosData.foundAt = user.lbMemory[lb.mode+lb.mode2][lb.type]; retData[lb.type] = lbPosData; lb.save(); - }); - } - }); - } - ).then((e) => { - retData.status = 2; - res.json(retData); + user.lbMemory[lb.mode + lb.mode2][lb.type] = + retData[lb.type].insertedAt; + } + }); + } + ).then((e) => { + retData.status = 2; + user.save(); + res.json(retData); + }); }); res.status(200); }); @@ -1406,11 +1424,6 @@ app.get("/api/getLeaderboard/:type/:mode/:mode2", (req, res) => { Leaderboard.findOne( { mode: req.params.mode, mode2: req.params.mode2, type: req.params.type }, (err, lb) => { - if (lb.type == "daily") { - date = new Date(); - date.setDate(date.getDate() + 1); - lb.resetTime = date; - } res.send(lb); } ); diff --git a/src/js/elements/leaderboards.js b/src/js/elements/leaderboards.js index 7e320c8eb..86c54feb7 100644 --- a/src/js/elements/leaderboards.js +++ b/src/js/elements/leaderboards.js @@ -43,7 +43,8 @@ function update() { let globalData = lbdata[1].data; //daily - let diffAsDate = new Date(dailyData.resetTime - Date.now()); + let nextReset = new Date(dailyData.resetTime); + let diffAsDate = new Date(nextReset - Date.now()); let diffHours = diffAsDate.getUTCHours(); let diffMinutes = diffAsDate.getUTCMinutes();