Skip to content

Commit d5fa8a2

Browse files
committed
Fix for new players MMR roles
1 parent 8ae172b commit d5fa8a2

File tree

3 files changed

+36
-10
lines changed

3 files changed

+36
-10
lines changed

src/utils/algorithms/calculateMMR.ts

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import {
22
getQueueSettings,
33
getUsersNeedingRoleUpdates,
44
updatePlayerMmrAll,
5+
countPlayerGames,
56
} from '../queryDB'
6-
import type { Matches, Queues, teamResults } from 'psqlDB'
7+
import type { Queues, teamResults } from 'psqlDB'
78
import { setUserQueueRole } from 'utils/queueHelpers'
89
import { clamp } from 'lodash-es'
910

@@ -130,7 +131,6 @@ export async function calculatePredictedMMR(
130131

131132
export async function calculateNewMMR(
132133
queueId: number,
133-
matchData: Matches,
134134
queueSettings: Queues,
135135
teamResults: teamResults,
136136
winningTeamId: number,
@@ -143,8 +143,13 @@ export async function calculateNewMMR(
143143
queueSettings.default_elo,
144144
)
145145

146-
const playerMMRChanges: Array<{ user_id: string; oldMMR: number; newMMR: number }> = []
146+
const playerMMRChanges: Array<{
147+
user_id: string
148+
oldMMR: number
149+
newMMR: number
150+
}> = []
147151
const updatePromises: Promise<void>[] = []
152+
let roleUpdateUsers: string[] = []
148153

149154
for (const ts of teamStats) {
150155
const isWinner = ts.isWinner
@@ -170,23 +175,29 @@ export async function calculateNewMMR(
170175
updatePromises.push(
171176
updatePlayerMmrAll(queueId, player.user_id, newMMR, newVolatility),
172177
)
178+
179+
const gamesPlayed = await countPlayerGames(queueId, player.user_id)
180+
if (gamesPlayed === 1) {
181+
roleUpdateUsers.push(player.user_id)
182+
}
173183
}
174184

175185
ts.team.score = isWinner ? 1 : 0
176186
}
177187

178188
await Promise.all(updatePromises)
179189

180-
const usersNeedingRoleUpdate = await getUsersNeedingRoleUpdates(
190+
// Get users who need role updates due to MMR threshold changes
191+
let usersNeedingRoleUpdate = await getUsersNeedingRoleUpdates(
181192
queueId,
182193
playerMMRChanges,
183194
)
184195

185-
if (usersNeedingRoleUpdate.length > 0) {
196+
roleUpdateUsers = roleUpdateUsers.concat(usersNeedingRoleUpdate).flat()
197+
198+
if (roleUpdateUsers.length > 0) {
186199
await Promise.all(
187-
usersNeedingRoleUpdate.map((userId) =>
188-
setUserQueueRole(queueId, userId),
189-
),
200+
roleUpdateUsers.map((userId) => setUserQueueRole(queueId, userId)),
190201
)
191202
}
192203

src/utils/matchHelpers.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,6 @@ export async function endMatch(
760760

761761
teamResults = await calculateNewMMR(
762762
queueId,
763-
matchData,
764763
queueSettings,
765764
teamResultsData,
766765
winningTeamId,

src/utils/queryDB.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import {
1313
} from 'psqlDB'
1414
import { client, getGuild } from '../client'
1515
import { QueryResult } from 'pg'
16-
import { setUserQueueRole } from './queueHelpers'
1716
import { endMatch } from './matchHelpers'
1817

1918
// Get the helper role
@@ -281,6 +280,23 @@ export async function getAllQueueRoles(
281280
return res.rows
282281
}
283282

283+
// Count completed games for a user in a queue
284+
export async function countPlayerGames(
285+
queueId: number,
286+
userId: string,
287+
): Promise<number> {
288+
const res = await pool.query(
289+
`
290+
SELECT COUNT(CASE WHEN m.winning_team IS NOT NULL THEN 1 END)::integer as games_played
291+
FROM match_users mu
292+
JOIN matches m ON m.id = mu.match_id
293+
WHERE mu.user_id = $1 AND m.queue_id = $2
294+
`,
295+
[userId, queueId],
296+
)
297+
return res.rows[0]?.games_played ?? 0
298+
}
299+
284300
// get a users highest queue role
285301
export async function getUserQueueRole(
286302
queueId: number,

0 commit comments

Comments
 (0)