fix(score): duplicated score when processing leaderboard scores

This commit is contained in:
MingxuanGame
2025-08-18 11:08:20 +00:00
parent cc26df253c
commit 1aa0d42e79

View File

@@ -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
)