From 1aa0d42e7999f65e75e5e9bf06870f65c79fdd44 Mon Sep 17 00:00:00 2001 From: MingxuanGame Date: Mon, 18 Aug 2025 11:08:20 +0000 Subject: [PATCH] fix(score): duplicated score when processing leaderboard scores --- app/database/score.py | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/app/database/score.py b/app/database/score.py index 5725e60..025cf29 100644 --- a/app/database/score.py +++ b/app/database/score.py @@ -681,14 +681,9 @@ async def process_user( } session.add(rank_lost_event) if score.passed and has_leaderboard: - if previous_score_best_mod is not None: - previous_score_best_mod.mods = mod_for_save - previous_score_best_mod.score_id = score.id - previous_score_best_mod.rank = score.rank - previous_score_best_mod.total_score = score.total_score - elif ( - previous_score_best is not None and previous_score_best.score_id != score.id - ) or previous_score_best is None: + # 情况1: 没有最佳分数记录,直接添加 + # 情况2: 有最佳分数记录但没有该mod组合的记录,添加新记录 + if previous_score_best is None or previous_score_best_mod is None: session.add( BestScore( user_id=user.id, @@ -700,12 +695,30 @@ async def process_user( mods=mod_for_save, ) ) - if previous_score_best is not None: + + # 情况3: 有最佳分数记录和该mod组合的记录,且是同一个记录,更新得分更高的情况 + elif ( + previous_score_best.score_id == previous_score_best_mod.score_id + and difference > 0 + ): previous_score_best.total_score = score.total_score previous_score_best.rank = score.rank - previous_score_best.mods = mod_for_save previous_score_best.score_id = score.id + # 情况4: 有最佳分数记录和该mod组合的记录,但不是同一个记录 + elif previous_score_best.score_id != previous_score_best_mod.score_id: + # 更新全局最佳记录(如果新分数更高) + if difference > 0: + # 下方的 if 一定会触发。将高分设置为此分数,删除自己防止重复的 score_id + await session.delete(previous_score_best) + + # 更新mod特定最佳记录(如果新分数更高) + mod_diff = score.total_score - previous_score_best_mod.total_score + if mod_diff > 0: + previous_score_best_mod.total_score = score.total_score + 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) @@ -791,6 +804,7 @@ async def process_score( ) if can_get_pp: from app.calculator import pre_fetch_and_calculate_pp + pp = await pre_fetch_and_calculate_pp( score, beatmap_id, session, redis, fetcher )