Skip to content

Commit 1835ab5

Browse files
committed
Fix leaderboard roles
This won't actually work for current foil people who need aren't updated. but it will work for any future ones
1 parent d5fa8a2 commit 1835ab5

File tree

2 files changed

+51
-9
lines changed

2 files changed

+51
-9
lines changed

src/utils/algorithms/calculateMMR.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
getUsersNeedingRoleUpdates,
44
updatePlayerMmrAll,
55
countPlayerGames,
6+
getLeaderboardPosition,
67
} from '../queryDB'
78
import type { Queues, teamResults } from 'psqlDB'
89
import { setUserQueueRole } from 'utils/queueHelpers'
@@ -147,6 +148,8 @@ export async function calculateNewMMR(
147148
user_id: string
148149
oldMMR: number
149150
newMMR: number
151+
oldRank: number
152+
newRank: number
150153
}> = []
151154
const updatePromises: Promise<void>[] = []
152155
let roleUpdateUsers: string[] = []
@@ -157,17 +160,12 @@ export async function calculateNewMMR(
157160

158161
for (const player of ts.team.players) {
159162
const oldMMR = player.elo ?? queueSettings.default_elo
163+
const oldRank = await getLeaderboardPosition(queueId, player.user_id)
160164
const oldVolatility = player.volatility ?? 0
161165

162166
const newMMR = parseFloat((oldMMR + mmrChange).toFixed(1))
163167
const newVolatility = Math.min(oldVolatility + 1, 10)
164168

165-
playerMMRChanges.push({
166-
user_id: player.user_id,
167-
oldMMR,
168-
newMMR,
169-
})
170-
171169
player.elo = clamp(newMMR, 0, 9999)
172170
player.elo_change = parseFloat(mmrChange.toFixed(1))
173171
player.volatility = newVolatility
@@ -176,6 +174,16 @@ export async function calculateNewMMR(
176174
updatePlayerMmrAll(queueId, player.user_id, newMMR, newVolatility),
177175
)
178176

177+
const newRank = await getLeaderboardPosition(queueId, player.user_id)
178+
179+
playerMMRChanges.push({
180+
user_id: player.user_id,
181+
oldMMR,
182+
newMMR,
183+
oldRank,
184+
newRank,
185+
})
186+
179187
const gamesPlayed = await countPlayerGames(queueId, player.user_id)
180188
if (gamesPlayed === 1) {
181189
roleUpdateUsers.push(player.user_id)

src/utils/queryDB.ts

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,13 @@ export async function getUserQueueRole(
322322

323323
export async function getUsersNeedingRoleUpdates(
324324
queueId: number,
325-
players: Array<{ user_id: string; oldMMR: number; newMMR: number }>,
325+
players: Array<{
326+
user_id: string
327+
oldMMR: number
328+
newMMR: number
329+
oldRank: number
330+
newRank: number
331+
}>,
326332
): Promise<string[]> {
327333
if (players.length === 0) return []
328334

@@ -333,6 +339,13 @@ export async function getUsersNeedingRoleUpdates(
333339
[queueId],
334340
)
335341

342+
const leaderboardRoles = await pool.query(
343+
`SELECT leaderboard_min, leaderboard_max FROM queue_roles
344+
WHERE queue_id = $1 AND mmr_threshold IS NULL
345+
ORDER BY leaderboard_min DESC`,
346+
[queueId],
347+
)
348+
336349
const thresholds = roles.rows.map((r) => r.mmr_threshold)
337350
const usersToUpdate: string[] = []
338351

@@ -343,6 +356,25 @@ export async function getUsersNeedingRoleUpdates(
343356
if (oldRole !== newRole) {
344357
usersToUpdate.push(player.user_id)
345358
}
359+
360+
// Also handle leaderboard positions
361+
if (
362+
player.newRank !== null &&
363+
leaderboardRoles &&
364+
leaderboardRoles.rowCount !== 0
365+
) {
366+
const oldLeaderboardRole = leaderboardRoles.rows.find(
367+
(r) => r.leaderboard_min <= player.oldRank,
368+
)
369+
const newLeaderboardRole = leaderboardRoles.rows.find(
370+
(r) => r.leaderboard_min <= player.newRank,
371+
)
372+
373+
// Update leaderboard role if its not the same
374+
if (oldLeaderboardRole !== newLeaderboardRole) {
375+
usersToUpdate.push(player.user_id)
376+
}
377+
}
346378
}
347379

348380
return usersToUpdate
@@ -379,13 +411,15 @@ export async function getLeaderboardQueueRole(
379411
SELECT *
380412
FROM queue_roles
381413
WHERE queue_id = $1
382-
AND leaderboard_min >= $2
383-
AND leaderboard_max <= $2
414+
AND leaderboard_min <= $2
415+
AND leaderboard_max >= $2
384416
LIMIT 1
385417
`,
386418
[queueId, rank],
387419
)
388420

421+
console.log(roleRes.rowCount)
422+
389423
if (roleRes.rowCount === 0) return null
390424
return roleRes.rows[0]
391425
}

0 commit comments

Comments
 (0)