Files
g0v0-server/app/achievements/osu_playcount.py

65 lines
1.7 KiB
Python

from functools import partial
from app.database import UserStatistics
from app.database.beatmap import Beatmap
from app.database.score import Score
from app.models.achievement import Achievement, Medals
from app.models.score import GameMode
from sqlmodel import select
from sqlmodel.ext.asyncio.session import AsyncSession
async def process_playcount(
pc: int,
next_pc: int,
session: AsyncSession,
score: Score,
beatmap: Beatmap,
) -> bool:
if pc < 1:
return False
if next_pc != 0 and pc >= next_pc:
return False
if score.gamemode != GameMode.OSU:
return False
stats = (
await session.exec(
select(UserStatistics).where(
UserStatistics.mode == GameMode.OSU,
UserStatistics.user_id == score.user_id,
)
)
).first()
if not stats:
return False
return bool(pc <= stats.play_count < next_pc or (next_pc == 0 and stats.play_count >= pc))
MEDALS: Medals = {
Achievement(
id=73,
name="5,000 Plays",
desc="There's a lot more where that came from",
assets_id="osu-plays-5000",
): partial(process_playcount, 5000, 15000),
Achievement(
id=74,
name="15,000 Plays",
desc="Must.. click.. circles..",
assets_id="osu-plays-15000",
): partial(process_playcount, 15000, 25000),
Achievement(
id=75,
name="25,000 Plays",
desc="There's no going back.",
assets_id="osu-plays-25000",
): partial(process_playcount, 25000, 50000),
Achievement(
id=76,
name="50,000 Plays",
desc="You're here forever.",
assets_id="osu-plays-50000",
): partial(process_playcount, 50000, 0),
}