Files
g0v0-server/app/achievements/daily_challenge.py
2025-08-21 14:25:26 +00:00

62 lines
1.5 KiB
Python

from __future__ import annotations
from functools import partial
from app.database.daily_challenge import DailyChallengeStats
from app.database.score import Beatmap, Score
from app.models.achievement import Achievement
from sqlmodel import select
from sqlmodel.ext.asyncio.session import AsyncSession
async def process_streak(
streak: int,
next_streak: int,
session: AsyncSession,
score: Score,
beatmap: Beatmap,
) -> bool:
if not score.passed:
return False
if streak < 1:
return False
if next_streak != 0 and streak >= next_streak:
return False
stats = (
await session.exec(
select(DailyChallengeStats).where(
DailyChallengeStats.user_id == score.user_id,
)
)
).first()
if not stats:
return False
if streak <= stats.daily_streak_best < next_streak:
return True
elif next_streak == 0 and stats.daily_streak_best >= streak:
return True
return False
MEDALS = {
Achievement(
id=102,
name="Daily Sprout",
desc="Ready for anything.",
assets_id="all-skill-dc-1",
): partial(process_streak, 1, 7),
Achievement(
id=103,
name="Weekly Sapling",
desc="Circadian rhythm calibrated.",
assets_id="all-skill-dc-7",
): partial(process_streak, 7, 30),
Achievement(
id=104,
name="Monthly Shrub",
desc="In for the grind.",
assets_id="all-skill-dc-30",
): partial(process_streak, 30, 0),
}