Skip to content

Commit

Permalink
Fixed wrong exp totals
Browse files Browse the repository at this point in the history
  • Loading branch information
grumd committed Feb 15, 2024
1 parent 921f197 commit f128daa
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 4 deletions.
59 changes: 59 additions & 0 deletions packages/api/migrations/20240215172804_refresh_exp.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import { ExpressionBuilder, Kysely, sql } from 'kysely';

export async function up(db: Kysely<any>): Promise<void> {
// "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<number>`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<number>('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<any>): Promise<void> {}
10 changes: 10 additions & 0 deletions packages/api/src/controllers/players/index.ts
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -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);
}
};
3 changes: 3 additions & 0 deletions packages/api/src/routes/players.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
getPlayerPpHistoryController,
updatePpHistory,
getPlayerAchievementsController,
updateExpTotal,
} from 'controllers/players';
import { Router } from 'express';

Expand Down Expand Up @@ -49,4 +50,6 @@ router.get('/:playerId/achievements', getPlayerAchievementsController);

router.get('/update-pp', updatePpHistory);

router.get('/update-exp', updateExpTotal);

export default router;
9 changes: 5 additions & 4 deletions packages/api/src/services/players/playerExp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,15 @@ const getRefreshExpBaseQuery = (trx?: Transaction) => {
'player_id',
'exp',
sql<number>`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<number>('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),
}));
};

Expand Down

0 comments on commit f128daa

Please sign in to comment.