From e872c259181329d6a9b42fc2967cad04a2776055 Mon Sep 17 00:00:00 2001 From: MingxuanGame Date: Sat, 30 Aug 2025 11:49:23 +0000 Subject: [PATCH] fix(score): make scores of loved beatmap as ranked scores --- app/database/score.py | 22 +++++++++++++++------- app/models/beatmap.py | 4 ++++ app/router/v2/score.py | 15 +++------------ 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/app/database/score.py b/app/database/score.py index afa823d..fe2b9f9 100644 --- a/app/database/score.py +++ b/app/database/score.py @@ -13,8 +13,10 @@ from app.calculator import ( clamp, pre_fetch_and_calculate_pp, ) +from app.config import settings from app.database.team import TeamMember from app.dependencies.database import get_redis +from app.models.beatmap import BeatmapRankStatus from app.models.model import ( CurrentUserAttributes, PinAttributes, @@ -714,9 +716,12 @@ async def process_user( score: Score, score_token: int, beatmap_length: int, - ranked: bool = False, - has_leaderboard: bool = False, + beatmap_status: BeatmapRankStatus, ): + has_pp = beatmap_status.has_pp() or settings.enable_all_beatmap_pp + ranked = beatmap_status.ranked() or settings.enable_all_beatmap_pp + has_leaderboard = beatmap_status.has_leaderboard() or settings.enable_all_beatmap_leaderboard + mod_for_save = mod_to_save(score.mods) previous_score_best = await get_user_best_score_in_beatmap(session, score.beatmap_id, user.id, score.gamemode) previous_score_best_mod = await get_user_best_score_with_mod_in_beatmap( @@ -809,28 +814,31 @@ async def process_user( previous_score_best_mod.rank = score.rank previous_score_best_mod.score_id = score.id - statistics.play_count += 1 - mouthly_playcount.count += 1 playtime, is_valid = calculate_playtime(score, beatmap_length) if is_valid: redis = get_redis() await redis.xadd(f"score:existed_time:{score_token}", {"time": playtime}) + statistics.play_count += 1 + mouthly_playcount.count += 1 statistics.play_time += playtime + with session.no_autoflush: + await process_beatmap_playcount(session, user.id, score.beatmap_id) + statistics.count_100 += score.n100 + score.nkatu statistics.count_300 += score.n300 + score.ngeki statistics.count_50 += score.n50 statistics.count_miss += score.nmiss statistics.total_hits += score.n300 + score.n100 + score.n50 + score.ngeki + score.nkatu - if score.passed and ranked: + if score.passed and has_pp: with session.no_autoflush: statistics.pp, statistics.hit_accuracy = await calculate_user_pp( session, statistics.user_id, score.gamemode ) + if add_to_db: session.add(mouthly_playcount) - with session.no_autoflush: - await process_beatmap_playcount(session, user.id, score.beatmap_id) + await session.commit() await session.refresh(user) diff --git a/app/models/beatmap.py b/app/models/beatmap.py index 2e58857..718041f 100644 --- a/app/models/beatmap.py +++ b/app/models/beatmap.py @@ -31,6 +31,10 @@ class BeatmapRankStatus(IntEnum): BeatmapRankStatus.APPROVED, } + def ranked(self) -> bool: + # https://osu.ppy.sh/wiki/Gameplay/Score/Ranked_score + return self in {BeatmapRankStatus.RANKED, BeatmapRankStatus.APPROVED, BeatmapRankStatus.LOVED} + class Genre(IntEnum): ANY = 0 diff --git a/app/router/v2/score.py b/app/router/v2/score.py index 14eab06..b887643 100644 --- a/app/router/v2/score.py +++ b/app/router/v2/score.py @@ -135,13 +135,12 @@ async def submit_score( db_beatmap = await Beatmap.get_or_fetch(db, fetcher, bid=beatmap) except HTTPError: raise HTTPException(status_code=404, detail="Beatmap not found") - has_pp = db_beatmap.beatmap_status.has_pp() | settings.enable_all_beatmap_pp - has_leaderboard = db_beatmap.beatmap_status.has_leaderboard() | settings.enable_all_beatmap_leaderboard + status = db_beatmap.beatmap_status beatmap_length = db_beatmap.total_length score = await process_score( current_user, beatmap, - has_pp, + status.has_pp() or settings.enable_all_beatmap_pp, score_token, info, fetcher, @@ -153,15 +152,7 @@ async def submit_score( await db.refresh(current_user) score_id = score.id score_token.score_id = score_id - await process_user( - db, - current_user, - score, - token, - beatmap_length, - has_pp, - has_leaderboard, - ) + await process_user(db, current_user, score, token, beatmap_length, status) score = (await db.exec(select(Score).options(joinedload(Score.user)).where(Score.id == score_id))).one() resp: ScoreResp = await ScoreResp.from_db(db, score)