From ef7ef4dd6c1b92b545c06e9af4c52cdca374b9c7 Mon Sep 17 00:00:00 2001 From: whidix Date: Mon, 2 Mar 2026 11:50:41 +0100 Subject: [PATCH] feat: refactor daily character logic to improve win count retrieval and streamline character selection --- src/lib/server/daily-character.ts | 34 +++++++++++++++++++----- src/routes/(admin)/admin/+page.server.ts | 20 +++++++------- 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/lib/server/daily-character.ts b/src/lib/server/daily-character.ts index f391559..b2257f1 100644 --- a/src/lib/server/daily-character.ts +++ b/src/lib/server/daily-character.ts @@ -1,6 +1,6 @@ import { db } from '$lib/server/db'; import { arc, character, characterHistory, characterOverride, devilFruit } from '$lib/server/db/schema'; -import { desc, eq, inArray } from 'drizzle-orm'; +import { desc, eq, inArray, and } from 'drizzle-orm'; const characterWithRelationsSelect = { id: character.id, @@ -197,10 +197,12 @@ export async function getCharacterById(characterId: string): Promise { - if (characters.length === 0) { + const dailyCharacters = characters ?? (await getDailyModeCharacters()); + + if (dailyCharacters.length === 0) { return null; } @@ -215,7 +217,7 @@ export async function getOrCreateTodayCharacter( if (existingEntry?.characterId) { return ( - characters.find((currentCharacter) => currentCharacter.id === existingEntry.characterId) ?? + dailyCharacters.find((currentCharacter) => currentCharacter.id === existingEntry.characterId) ?? (await getCharacterById(existingEntry.characterId)) ); } @@ -227,10 +229,10 @@ export async function getOrCreateTodayCharacter( .limit(100); const excludedIds = new Set(recentHistory.map((entry) => entry.characterId)); - const availableCharacters = characters.filter((currentCharacter) => !excludedIds.has(currentCharacter.id)); + const availableCharacters = dailyCharacters.filter((currentCharacter) => !excludedIds.has(currentCharacter.id)); const dailyCharacter = pickDailyCharacter( - availableCharacters.length > 0 ? availableCharacters : characters, + availableCharacters.length > 0 ? availableCharacters : dailyCharacters, today ); @@ -274,4 +276,24 @@ export async function getYesterdayCharacter( } return getCharacterById(yesterdayEntry.characterId); +} + +export async function getTodayCharacterWinsCount( + characterId: string, + date: Date = new Date() +): Promise { + const today = normalizeDay(date); + const todayDate = getDateKey(today); + + const [result] = await db + .select({ won: characterHistory.won }) + .from(characterHistory) + .where( + and( + eq(characterHistory.characterId, characterId), + eq(characterHistory.date, todayDate) + ) + ); + + return result?.won ?? 0; } \ No newline at end of file diff --git a/src/routes/(admin)/admin/+page.server.ts b/src/routes/(admin)/admin/+page.server.ts index 8e78a0a..2f63976 100644 --- a/src/routes/(admin)/admin/+page.server.ts +++ b/src/routes/(admin)/admin/+page.server.ts @@ -1,21 +1,23 @@ import { db } from '$lib/server/db'; -import { character, devilFruit, arc, user, config, characterHistory } from '$lib/server/db/schema'; +import { character, devilFruit, arc, user } from '$lib/server/db/schema'; +import { getOrCreateTodayCharacter, getTodayCharacterWinsCount } from '$lib/server/daily-character'; import type { PageServerLoad } from './$types'; -import { getDailyCharacterId } from '$lib/server/dailyCharacter'; export const load: PageServerLoad = async () => { - const [characters, devilFruits, arcs, users, configEntries, history] = await Promise.all([ + const [characters, devilFruits, arcs, users] = await Promise.all([ db.select().from(character), db.select().from(devilFruit), db.select().from(arc), - db.select().from(user), - db.select().from(config), - db.select().from(characterHistory) + db.select().from(user) ]); - const dailyCharacterId = await getDailyCharacterId(); - // Return count of wins for the daily character , count is stored in won field of characterHistory - const dailyCharacterWins = history.filter((h) => h.characterId === dailyCharacterId && h.won).length; + // Get today's daily character and count wins + const todayCharacter = await getOrCreateTodayCharacter(); + + let dailyCharacterWins = 0; + if (todayCharacter) { + dailyCharacterWins = await getTodayCharacterWinsCount(todayCharacter.id); + } return { stats: {