diff --git a/app/database/score.py b/app/database/score.py index 4a16aec..f1d3167 100644 --- a/app/database/score.py +++ b/app/database/score.py @@ -813,7 +813,7 @@ async def process_score( user_id = user.id await session.commit() await session.refresh(score) - if can_get_pp: + if can_get_pp and score.pp != 0: previous_pp_best = await get_user_best_pp_in_beatmap( session, beatmap_id, user_id, score.gamemode ) diff --git a/app/service/recalculate.py b/app/service/recalculate.py index 41ea765..fd12ab4 100644 --- a/app/service/recalculate.py +++ b/app/service/recalculate.py @@ -4,11 +4,11 @@ import asyncio import math from app.calculator import ( - calculate_pp, calculate_score_to_level, calculate_weighted_acc, calculate_weighted_pp, clamp, + pre_fetch_and_calculate_pp, ) from app.config import settings from app.const import BANCHOBOT_ID @@ -114,11 +114,14 @@ async def _recalculate_pp( ranked = db_beatmap.beatmap_status.has_pp() | settings.enable_all_beatmap_pp if not ranked or not mods_can_get_pp(int(score.gamemode), score.mods): score.pp = 0 - break + return try: - beatmap_raw = await fetcher.get_or_fetch_beatmap_raw(redis, beatmap_id) - pp = await calculate_pp(score, beatmap_raw, session) + pp = await pre_fetch_and_calculate_pp( + score, beatmap_id, session, redis, fetcher + ) score.pp = pp + if pp == 0: + return if score.beatmap_id not in prev or prev[score.beatmap_id].pp < pp: best_score = PPBestScore( user_id=user_id, @@ -129,7 +132,7 @@ async def _recalculate_pp( gamemode=score.gamemode, ) prev[score.beatmap_id] = best_score - break + return except HTTPError: time -= 1 await asyncio.sleep(2) @@ -138,7 +141,7 @@ async def _recalculate_pp( logger.exception( f"Error calculating pp for score {score.id} on beatmap {beatmap_id}" ) - break + return if time <= 0: logger.warning( f"Failed to fetch beatmap {beatmap_id} after 10 attempts, "