Skip to content

Commit 8afdb50

Browse files
committed
Queue roles only set on update
1 parent 1b85fe1 commit 8afdb50

File tree

3 files changed

+56
-8
lines changed

3 files changed

+56
-8
lines changed

src/utils/algorithms/calculateMMR.ts

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import { getQueueSettings, updatePlayerMmrAll } from '../queryDB'
1+
import {
2+
getQueueSettings,
3+
getUsersNeedingRoleUpdates,
4+
updatePlayerMmrAll,
5+
} from '../queryDB'
26
import type { Matches, Queues, teamResults } from 'psqlDB'
37
import { setUserQueueRole } from 'utils/queueHelpers'
48
import { clamp } from 'lodash-es'
@@ -139,7 +143,7 @@ export async function calculateNewMMR(
139143
queueSettings.default_elo,
140144
)
141145

142-
// Apply changes to all teams and players
146+
const playerMMRChanges: Array<{ user_id: string; oldMMR: number; newMMR: number }> = []
143147
const updatePromises: Promise<void>[] = []
144148

145149
for (const ts of teamStats) {
@@ -153,25 +157,39 @@ export async function calculateNewMMR(
153157
const newMMR = parseFloat((oldMMR + mmrChange).toFixed(1))
154158
const newVolatility = Math.min(oldVolatility + 1, 10)
155159

156-
// Update teamResults object immediately
160+
playerMMRChanges.push({
161+
user_id: player.user_id,
162+
oldMMR,
163+
newMMR,
164+
})
165+
157166
player.elo = clamp(newMMR, 0, 9999)
158167
player.elo_change = parseFloat(mmrChange.toFixed(1))
159168
player.volatility = newVolatility
160169

161-
// Collect database update promises to run in parallel
162170
updatePromises.push(
163171
updatePlayerMmrAll(queueId, player.user_id, newMMR, newVolatility),
164172
)
165-
updatePromises.push(setUserQueueRole(queueId, player.user_id))
166173
}
167174

168-
// Set team score
169175
ts.team.score = isWinner ? 1 : 0
170176
}
171177

172-
// Run all database updates in parallel
173178
await Promise.all(updatePromises)
174179

180+
const usersNeedingRoleUpdate = await getUsersNeedingRoleUpdates(
181+
queueId,
182+
playerMMRChanges,
183+
)
184+
185+
if (usersNeedingRoleUpdate.length > 0) {
186+
await Promise.all(
187+
usersNeedingRoleUpdate.map((userId) =>
188+
setUserQueueRole(queueId, userId),
189+
),
190+
)
191+
}
192+
175193
return teamResults
176194
} catch (err) {
177195
console.error('Error calculating new MMR:', err)

src/utils/queryDB.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ export async function createQueueUser(
117117
ON CONFLICT (user_id, queue_id) DO NOTHING`,
118118
[userId, queueSettings.default_elo, queueId],
119119
)
120-
await setUserQueueRole(queueId, userId)
120+
// Removing since we add queue roles after match ends
121+
// await setUserQueueRole(queueId, userId)
121122
}
122123

123124
// Set a priority queue for a user
@@ -303,6 +304,34 @@ export async function getUserQueueRole(
303304
return res.rows[0]
304305
}
305306

307+
export async function getUsersNeedingRoleUpdates(
308+
queueId: number,
309+
players: Array<{ user_id: string; oldMMR: number; newMMR: number }>,
310+
): Promise<string[]> {
311+
if (players.length === 0) return []
312+
313+
const roles = await pool.query(
314+
`SELECT mmr_threshold FROM queue_roles
315+
WHERE queue_id = $1 AND mmr_threshold IS NOT NULL
316+
ORDER BY mmr_threshold DESC`,
317+
[queueId],
318+
)
319+
320+
const thresholds = roles.rows.map(r => r.mmr_threshold)
321+
const usersToUpdate: string[] = []
322+
323+
for (const player of players) {
324+
const oldRole = thresholds.find(t => t <= player.oldMMR)
325+
const newRole = thresholds.find(t => t <= player.newMMR)
326+
327+
if (oldRole !== newRole) {
328+
usersToUpdate.push(player.user_id)
329+
}
330+
}
331+
332+
return usersToUpdate
333+
}
334+
306335
export async function getLeaderboardPosition(
307336
queueId: number,
308337
userId: string,

src/utils/queueHelpers.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,7 @@ export async function setUserQueueRole(
578578
queueId: number,
579579
userId: string,
580580
): Promise<void> {
581+
console.log(`setting queue role for user ${userId} in queue ${queueId}`)
581582
const currentRole = await getUserQueueRole(queueId, userId)
582583
const leaderboardRole = await getLeaderboardQueueRole(queueId, userId)
583584
const allQueueRoles = await getAllQueueRoles(queueId, false)

0 commit comments

Comments
 (0)