From f341c9d8bb78bb6314dd6fa4a2058a78cf55e70f Mon Sep 17 00:00:00 2001 From: fiore Date: Wed, 12 Mar 2025 15:32:20 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A6=AC=EB=8D=94=EB=B3=B4=EB=93=9C=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 요청한 유저와 같은 급수의 유저에서 랭킹 불러옴 - 승수와 패수를 이용해 승률을 계산 - 승률이 높은 유저부터 정렬 --- routes/leaderboard.js | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/routes/leaderboard.js b/routes/leaderboard.js index 37cb595..610c36b 100644 --- a/routes/leaderboard.js +++ b/routes/leaderboard.js @@ -1,4 +1,5 @@ var express = require('express'); +const {ObjectId} = require("mongodb"); var router = express.Router(); // 랭킹 조회 @@ -11,20 +12,45 @@ router.get("/", async function (req, res, next) { var database = req.app.get('database'); var users = database.collection('users'); - var allUsers = await users - .find({ }, { projection: { username:1, nickname: 1, score: 1 } }) - .sort({ score: -1 }) // 점수가 높은 순으로 정렬 + + // 요청 유저 정보 확인 + var userId = req.session.userId; + const user = await users.findOne({_id: ObjectId.createFromHexString(userId) }); + var userRating = user.rating; + + // 동일한 rating을 가진 유저들만 필터링 + var sameRatingUsers = await users + .find({ rating: userRating }, { projection: { username: 1, nickname: 1, score: 1, win: 1, lose: 1, profileImageIndex:1, rating: 1 } }) .toArray(); - var result = allUsers.map((user) => ( - { + // 승률 계산 및 정렬 + var result = sameRatingUsers.map((user) => { + const totalGames = (user.win || 0) + (user.lose || 0); + const winRate = totalGames > 0 ? ((user.win || 0) / totalGames * 100) : 0; + + return { username: user.username, nickname: user.nickname, score: user.score || 0, - } - )) + win: user.win || 0, + lose: user.lose || 0, + winRate: parseFloat(winRate.toFixed(2)), // 소수점 2자리까지 표시 + totalGames: totalGames, + imageindex: user.profileImageIndex, + }; + }) + .sort((a, b) => { + // 승률이 같은 경우 총 게임 수가 많은 사람이 위에 오도록 정렬 + if (b.winRate === a.winRate) { + return b.totalGames - a.totalGames; + } + return b.winRate - a.winRate; // 승률 내림차순 정렬 + }); - res.json({ leaderboardDatas : result ?? [] }); + res.json({ + rating: userRating, + leaderboardDatas : result ?? [] + }); } catch(err) { console.error(err); res.status(500).send("서버 오류가 발생했습니다.");