From de1e5a7f21ab3f8e042f8c454e701b4486bff84b Mon Sep 17 00:00:00 2001 From: Stan Runge Date: Mon, 9 Mar 2026 22:36:20 +0100 Subject: [PATCH] use rank 10 million for unranked players --- scripts/reseed-ratings.ts | 4 ++-- src/lib/server/auth.ts | 5 +++-- src/routes/(app)/admin/+page.server.ts | 28 ++++++++++++++++++++------ 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/scripts/reseed-ratings.ts b/scripts/reseed-ratings.ts index 2f64d41..845dff1 100644 --- a/scripts/reseed-ratings.ts +++ b/scripts/reseed-ratings.ts @@ -95,8 +95,8 @@ async function main() { } } - // Unranked → rank 100,000 (~1000 ELO) - const effectiveRank = rank && rank > 0 ? rank : 100_000; + // Unranked → rank 10,000,000 (yields 0 ELO) + const effectiveRank = rank && rank > 0 ? rank : 10_000_000; const seedElo = rankToElo(effectiveRank); // Adjust by win/loss differential to preserve some earned progress const adjustment = (r.wins - r.losses) * 12; diff --git a/src/lib/server/auth.ts b/src/lib/server/auth.ts index c732efb..0ec4b45 100644 --- a/src/lib/server/auth.ts +++ b/src/lib/server/auth.ts @@ -14,8 +14,9 @@ import { proxyImage } from './storage/r2'; let pendingOsuProfile: { rank: number | null } | null = null; function eloFromRank(rank: number | null): { elo: number; osuRank: number | null } { - if (!rank || rank <= 0) return { elo: 1000, osuRank: null }; - const rawElo = 3500 - Math.log10(rank) * 500; + // Unranked → treat as rank 10,000,000 (yields 0 ELO) + const effectiveRank = rank && rank > 0 ? rank : 10_000_000; + const rawElo = 3500 - Math.log10(effectiveRank) * 500; return { elo: Math.round(Math.max(0, Math.min(3500, rawElo))), osuRank: rank }; } diff --git a/src/routes/(app)/admin/+page.server.ts b/src/routes/(app)/admin/+page.server.ts index 4989851..c8db346 100644 --- a/src/routes/(app)/admin/+page.server.ts +++ b/src/routes/(app)/admin/+page.server.ts @@ -148,15 +148,31 @@ export const actions: Actions = { // API failure — treat as unranked } - // Unranked → rank 100,000 (~1000 ELO) - const effectiveRank = rank && rank > 0 ? rank : 100_000; + // Unranked → rank 10,000,000 (yields 0 ELO) + const effectiveRank = rank && rank > 0 ? rank : 10_000_000; const rawElo = 3500 - Math.log10(effectiveRank) * 500; const elo = Math.round(Math.max(0, Math.min(3500, rawElo))); - await db - .update(playerRating) - .set({ elo, initialElo: elo, osuRankAtSeed: rank, wins: 0, losses: 0, updatedAt: new Date() }) - .where(eq(playerRating.userId, u.id)); + // Upsert: insert if no rating row exists, update if it does + const existing = await db.query.playerRating.findFirst({ + where: eq(playerRating.userId, u.id) + }); + + if (existing) { + await db + .update(playerRating) + .set({ elo, initialElo: elo, osuRankAtSeed: rank, wins: 0, losses: 0, updatedAt: new Date() }) + .where(eq(playerRating.userId, u.id)); + } else { + await db.insert(playerRating).values({ + userId: u.id, + elo, + initialElo: elo, + osuRankAtSeed: rank, + wins: 0, + losses: 0 + }); + } console.log(`[Admin] Reset ${u.name}: rank #${rank ?? 'unranked'} → ${elo} ELO`); updated++;