From f128daa3815607a91adab62415394abe58af5740 Mon Sep 17 00:00:00 2001 From: Anton Kalmanovich Date: Thu, 15 Feb 2024 18:51:33 +0100 Subject: [PATCH] Fixed wrong exp totals --- .../migrations/20240215172804_refresh_exp.ts | 59 +++++++++++++++++++ packages/api/src/controllers/players/index.ts | 10 ++++ packages/api/src/routes/players.ts | 3 + .../api/src/services/players/playerExp.ts | 9 +-- 4 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 packages/api/migrations/20240215172804_refresh_exp.ts diff --git a/packages/api/migrations/20240215172804_refresh_exp.ts b/packages/api/migrations/20240215172804_refresh_exp.ts new file mode 100644 index 00000000..d64be112 --- /dev/null +++ b/packages/api/migrations/20240215172804_refresh_exp.ts @@ -0,0 +1,59 @@ +import { ExpressionBuilder, Kysely, sql } from 'kysely'; + +export async function up(db: Kysely): Promise { + // "update .. inner join .. set" is not supported by kysely, using raw sql + // NOT COOP + await sql` + UPDATE + results AS r + INNER JOIN shared_charts AS sc ON + sc.id = r.shared_chart + INNER JOIN chart_instances AS ci ON + ci.shared_chart = sc.id AND ci.mix = r.mix + SET + exp = GREATEST(0.1, ((score_phoenix - 400000) * 2 / 1000000)) * POW(\`level\`, 2.31) / 9 + WHERE score_phoenix IS NOT NULL + AND ci.level IS NOT NULL + AND ci.label NOT LIKE 'COOP%' + `.execute(db); + + // COOP + await sql` + UPDATE + results AS r + INNER JOIN shared_charts AS sc ON + sc.id = r.shared_chart + INNER JOIN chart_instances AS ci ON + ci.shared_chart = sc.id AND ci.mix = r.mix + SET + exp = GREATEST(0.1, (score_phoenix - 400000) * 2 / 1000000) * 50 * \`level\` + WHERE score_phoenix IS NOT NULL + AND ci.level IS NOT NULL + AND ci.label LIKE 'COOP%' + `.execute(db); + + await db + .updateTable('players') + .set((eb) => ({ + exp: db + .with('ranked_results', (_db) => { + return _db + .selectFrom('results as r') + .select([ + 'player_id', + 'exp', + sql`row_number() over (partition by r.shared_chart, r.player_id order by ${sql.ref( + 'exp' + )} desc)`.as('exp_rank'), + ]) + .where('exp', 'is not', null); + }) + .selectFrom('ranked_results') + .select((eb2) => eb2.fn.sum('ranked_results.exp').as('total_exp')) + .whereRef('ranked_results.player_id', '=', eb.ref('players.id')) + .where('ranked_results.exp_rank', '=', 1), + })) + .execute(); +} + +export async function down(db: Kysely): Promise {} diff --git a/packages/api/src/controllers/players/index.ts b/packages/api/src/controllers/players/index.ts index 5fe97a23..c9eb97f6 100644 --- a/packages/api/src/controllers/players/index.ts +++ b/packages/api/src/controllers/players/index.ts @@ -1,6 +1,7 @@ import type { Response, Request, NextFunction } from 'express'; import _ from 'lodash/fp'; import { getPlayerAchievements } from 'services/players/playerAchievements'; +import { refreshAllPlayersTotalExp } from 'services/players/playerExp'; import { getPlayerGradeStats } from 'services/players/playerGrades'; import { getPlayers, getPlayersStats } from 'services/players/players'; import { getPlayerPpHistory, updatePpHistoryIfNeeded } from 'services/players/playersPp'; @@ -73,3 +74,12 @@ export const updatePpHistory = async (request: Request, response: Response, next next(error); } }; + +export const updateExpTotal = async (request: Request, response: Response, next: NextFunction) => { + try { + await refreshAllPlayersTotalExp(); + response.json({ success: true }); + } catch (error) { + next(error); + } +}; diff --git a/packages/api/src/routes/players.ts b/packages/api/src/routes/players.ts index 1c90d8c0..0bef6cc3 100644 --- a/packages/api/src/routes/players.ts +++ b/packages/api/src/routes/players.ts @@ -5,6 +5,7 @@ import { getPlayerPpHistoryController, updatePpHistory, getPlayerAchievementsController, + updateExpTotal, } from 'controllers/players'; import { Router } from 'express'; @@ -49,4 +50,6 @@ router.get('/:playerId/achievements', getPlayerAchievementsController); router.get('/update-pp', updatePpHistory); +router.get('/update-exp', updateExpTotal); + export default router; diff --git a/packages/api/src/services/players/playerExp.ts b/packages/api/src/services/players/playerExp.ts index ecd1ee03..8ed5c61f 100644 --- a/packages/api/src/services/players/playerExp.ts +++ b/packages/api/src/services/players/playerExp.ts @@ -11,14 +11,15 @@ const getRefreshExpBaseQuery = (trx?: Transaction) => { 'player_id', 'exp', sql`row_number() over (partition by r.shared_chart, r.player_id order by ${sql.ref( - 'score_phoenix' - )} desc)`.as('score_rank'), - ]); + 'exp' + )} desc)`.as('exp_rank'), + ]) + .where('exp', 'is not', null); }) .selectFrom('ranked_results') .select((eb2) => eb2.fn.sum('ranked_results.exp').as('total_exp')) .whereRef('ranked_results.player_id', '=', eb.ref('players.id')) - .where('ranked_results.score_rank', '=', 1), + .where('ranked_results.exp_rank', '=', 1), })); };