Skip to content

Commit 0a37f18

Browse files
committedOct 12, 2020
feat(server): rank users with only tiebreakEligible: false
1 parent 2ca9438 commit 0a37f18

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed
 

‎migrations/1597827385452_timezone.js

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
exports.up = function (pgm) {
2+
pgm.alterColumn('users', 'created_at', {
3+
type: 'timestamptz'
4+
})
5+
pgm.alterColumn('solves', 'createdat', {
6+
type: 'timestamptz'
7+
})
8+
}
9+
10+
exports.down = function (pgm) {
11+
pgm.alterColumn('solves', 'createdat', {
12+
type: 'timestamp'
13+
})
14+
pgm.alterColumn('users', 'created_at', {
15+
type: 'timestamp'
16+
})
17+
}

‎server/leaderboard/calculate.js

+18-4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ for (let i = 0; i < allChallenges.length; i++) {
2020
challengeTiebreakEligibles.set(challenge.id, challenge.tiebreakEligible)
2121
}
2222
const userSolves = new Map()
23+
const userTiebreakEligibleLastSolves = new Map()
2324
const userLastSolves = new Map()
2425
let lastIndex = 0
2526

@@ -42,8 +43,9 @@ const calculateScores = (sample) => {
4243
}
4344
solveAmount.set(challId, amt + 1)
4445

46+
userLastSolves.set(userId, createdAt)
4547
if (challengeTiebreakEligibles.get(challId) !== false) { // !== false because we default to true
46-
userLastSolves.set(userId, createdAt)
48+
userTiebreakEligibleLastSolves.set(userId, createdAt)
4749
}
4850
// Store which challenges each user solved for later
4951
if (!userSolves.has(userId)) {
@@ -74,6 +76,7 @@ const calculateScores = (sample) => {
7476
for (let i = 0; i < users.length; i++) {
7577
const user = users[i]
7678
let currScore = 0
79+
const lastTiebreakEligibleSolve = userTiebreakEligibleLastSolves.get(user.id)
7780
const lastSolve = userLastSolves.get(user.id)
7881
if (lastSolve === undefined) continue // If the user has not solved any challenges, do not add to leaderboard
7982
const solvedChalls = userSolves.get(user.id)
@@ -84,7 +87,14 @@ const calculateScores = (sample) => {
8487
currScore += value
8588
}
8689
}
87-
userScores.push([user.id, user.name, user.division, currScore, lastSolve])
90+
userScores.push([
91+
user.id,
92+
user.name,
93+
user.division,
94+
currScore,
95+
lastTiebreakEligibleSolve,
96+
lastSolve
97+
])
8898
}
8999

90100
return {
@@ -95,12 +105,16 @@ const calculateScores = (sample) => {
95105

96106
const userCompare = (a, b) => {
97107
// sort the users by score
98-
// if two user's scores are the same, sort by last solve time
108+
// if two user's scores are the same, sort by last tiebreakEligible solve time
109+
// if neither user has any tiebreakEligible solves, sort by last solve time
99110
const scoreCompare = b[3] - a[3]
100111
if (scoreCompare !== 0) {
101112
return scoreCompare
102113
}
103-
return a[4] - b[4]
114+
if (a[4] !== undefined || b[4] !== undefined) {
115+
return (a[4] ?? Infinity) - (b[4] ?? Infinity)
116+
}
117+
return a[5] - b[5]
104118
}
105119

106120
const leaderboardUpdate = Math.min(Date.now(), config.endTime)

0 commit comments

Comments
 (0)
Please sign in to comment.