From efb0b3d33092ee65e27cdef3451728a06016ac5c Mon Sep 17 00:00:00 2001 From: Whidix Date: Wed, 8 Jul 2026 23:11:29 +0200 Subject: [PATCH] refactor: simplify daily fruit selection logic and update type definitions --- src/lib/server/daily-fruit.ts | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/lib/server/daily-fruit.ts b/src/lib/server/daily-fruit.ts index be23026..70e7972 100644 --- a/src/lib/server/daily-fruit.ts +++ b/src/lib/server/daily-fruit.ts @@ -1,10 +1,7 @@ import { db } from '$lib/server/db'; -import { character, devilFruit, devilFruitHistory, type DevilFruit, type Character } from '$lib/server/db/schema'; +import { character, devilFruit, devilFruitHistory, type DevilFruit, type Character, type DevilFruitType } from '$lib/server/db/schema'; import { eq, and } from 'drizzle-orm'; -// Generate or get random seed for daily fruit selection -const RANDOM_SEED = Math.random(); - const characterWithFruitSelect = { id: character.id, name: character.name, @@ -15,9 +12,10 @@ const characterWithFruitSelect = { url: devilFruit.url }; -export type CharacterWithFruit = Character & { +export type CharacterWithFruit = Pick & { devilFruitName: string | null; - devilFruitType: string | null; + devilFruitType: DevilFruitType | null; + url: string | null; }; export function getDateKey(date: Date): number { @@ -30,31 +28,29 @@ export function normalizeDay(date: Date = new Date()): Date { return normalized; } -function pickDailyFruit(fruits: DevilFruit[], date: Date): DevilFruit { - const timestamp = getDateKey(date); - const daysSinceEpoch = Math.floor(timestamp / 1000 / 60 / 60 / 24); - const combinedSeed = (daysSinceEpoch + Math.floor(RANDOM_SEED * 1000000)) % fruits.length; - return fruits[combinedSeed]; +function pickDailyFruit(fruits: DevilFruit[]): DevilFruit { + const randomIndex = Math.floor(Math.random() * fruits.length); + return fruits[randomIndex]; } export async function getCharactersWithDevilFruit(): Promise { - const rows = (await db + const rows = await db .select(characterWithFruitSelect) .from(character) .leftJoin(devilFruit, eq(character.devilFruitId, devilFruit.id)) .where(eq(character.isInDailyMode, true)) - .all()) as any[]; + .all(); - return rows.filter((r) => r.devilFruitId) as CharacterWithFruit[]; + return rows.filter((r): r is CharacterWithFruit => Boolean(r.devilFruitId)); } export async function getAllDevilFruitsFromCharacters(): Promise { - const characters = (await db + const characters = await db .select(characterWithFruitSelect) .from(character) .leftJoin(devilFruit, eq(character.devilFruitId, devilFruit.id)) .where(eq(character.isInDailyMode, true)) - .all()) as any[]; + .all(); const map = new Map(); for (const row of characters) { @@ -95,7 +91,7 @@ export async function getOrCreateTodayFruit(date: Date = new Date()): Promise