diff --git a/src/utils/algorithms/calculateMMR.ts b/src/utils/algorithms/calculateMMR.ts index d1ba12b..5d394d5 100644 --- a/src/utils/algorithms/calculateMMR.ts +++ b/src/utils/algorithms/calculateMMR.ts @@ -1,4 +1,8 @@ -import { getQueueSettings, updatePlayerMmrAll } from '../queryDB' +import { + getQueueSettings, + getUsersNeedingRoleUpdates, + updatePlayerMmrAll, +} from '../queryDB' import type { Matches, Queues, teamResults } from 'psqlDB' import { setUserQueueRole } from 'utils/queueHelpers' import { clamp } from 'lodash-es' @@ -139,7 +143,7 @@ export async function calculateNewMMR( queueSettings.default_elo, ) - // Apply changes to all teams and players + const playerMMRChanges: Array<{ user_id: string; oldMMR: number; newMMR: number }> = [] const updatePromises: Promise[] = [] for (const ts of teamStats) { @@ -153,25 +157,39 @@ export async function calculateNewMMR( const newMMR = parseFloat((oldMMR + mmrChange).toFixed(1)) const newVolatility = Math.min(oldVolatility + 1, 10) - // Update teamResults object immediately + playerMMRChanges.push({ + user_id: player.user_id, + oldMMR, + newMMR, + }) + player.elo = clamp(newMMR, 0, 9999) player.elo_change = parseFloat(mmrChange.toFixed(1)) player.volatility = newVolatility - // Collect database update promises to run in parallel updatePromises.push( updatePlayerMmrAll(queueId, player.user_id, newMMR, newVolatility), ) - updatePromises.push(setUserQueueRole(queueId, player.user_id)) } - // Set team score ts.team.score = isWinner ? 1 : 0 } - // Run all database updates in parallel await Promise.all(updatePromises) + const usersNeedingRoleUpdate = await getUsersNeedingRoleUpdates( + queueId, + playerMMRChanges, + ) + + if (usersNeedingRoleUpdate.length > 0) { + await Promise.all( + usersNeedingRoleUpdate.map((userId) => + setUserQueueRole(queueId, userId), + ), + ) + } + return teamResults } catch (err) { console.error('Error calculating new MMR:', err) diff --git a/src/utils/queryDB.ts b/src/utils/queryDB.ts index bc3c4d8..fd277cf 100644 --- a/src/utils/queryDB.ts +++ b/src/utils/queryDB.ts @@ -117,7 +117,8 @@ export async function createQueueUser( ON CONFLICT (user_id, queue_id) DO NOTHING`, [userId, queueSettings.default_elo, queueId], ) - await setUserQueueRole(queueId, userId) + // Removing since we add queue roles after match ends + // await setUserQueueRole(queueId, userId) } // Set a priority queue for a user @@ -303,6 +304,34 @@ export async function getUserQueueRole( return res.rows[0] } +export async function getUsersNeedingRoleUpdates( + queueId: number, + players: Array<{ user_id: string; oldMMR: number; newMMR: number }>, +): Promise { + if (players.length === 0) return [] + + const roles = await pool.query( + `SELECT mmr_threshold FROM queue_roles + WHERE queue_id = $1 AND mmr_threshold IS NOT NULL + ORDER BY mmr_threshold DESC`, + [queueId], + ) + + const thresholds = roles.rows.map(r => r.mmr_threshold) + const usersToUpdate: string[] = [] + + for (const player of players) { + const oldRole = thresholds.find(t => t <= player.oldMMR) + const newRole = thresholds.find(t => t <= player.newMMR) + + if (oldRole !== newRole) { + usersToUpdate.push(player.user_id) + } + } + + return usersToUpdate +} + export async function getLeaderboardPosition( queueId: number, userId: string, diff --git a/src/utils/queueHelpers.ts b/src/utils/queueHelpers.ts index c28f94d..92f1373 100644 --- a/src/utils/queueHelpers.ts +++ b/src/utils/queueHelpers.ts @@ -578,6 +578,7 @@ export async function setUserQueueRole( queueId: number, userId: string, ): Promise { + console.log(`setting queue role for user ${userId} in queue ${queueId}`) const currentRole = await getUserQueueRole(queueId, userId) const leaderboardRole = await getLeaderboardQueueRole(queueId, userId) const allQueueRoles = await getAllQueueRoles(queueId, false)