feat(achievements): add some achievements
This commit is contained in:
61
app/achievements/daily_challenge.py
Normal file
61
app/achievements/daily_challenge.py
Normal file
@@ -0,0 +1,61 @@
|
||||
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),
|
||||
}
|
||||
Reference in New Issue
Block a user