Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 25 additions & 7 deletions src/utils/algorithms/calculateMMR.ts
Original file line number Diff line number Diff line change
@@ -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'
Expand Down Expand Up @@ -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<void>[] = []

for (const ts of teamStats) {
Expand All @@ -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)
Expand Down
31 changes: 30 additions & 1 deletion src/utils/queryDB.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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<string[]> {
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,
Expand Down
1 change: 1 addition & 0 deletions src/utils/queueHelpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -578,6 +578,7 @@ export async function setUserQueueRole(
queueId: number,
userId: string,
): Promise<void> {
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)
Expand Down