feat(score): don't include in best performance for 0pp

This commit is contained in:
MingxuanGame
2025-08-21 11:43:36 +00:00
parent 49aa5edc96
commit 1104ff6c54
2 changed files with 10 additions and 7 deletions

View File

@@ -813,7 +813,7 @@ async def process_score(
user_id = user.id user_id = user.id
await session.commit() await session.commit()
await session.refresh(score) 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( previous_pp_best = await get_user_best_pp_in_beatmap(
session, beatmap_id, user_id, score.gamemode session, beatmap_id, user_id, score.gamemode
) )

View File

@@ -4,11 +4,11 @@ import asyncio
import math import math
from app.calculator import ( from app.calculator import (
calculate_pp,
calculate_score_to_level, calculate_score_to_level,
calculate_weighted_acc, calculate_weighted_acc,
calculate_weighted_pp, calculate_weighted_pp,
clamp, clamp,
pre_fetch_and_calculate_pp,
) )
from app.config import settings from app.config import settings
from app.const import BANCHOBOT_ID 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 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): if not ranked or not mods_can_get_pp(int(score.gamemode), score.mods):
score.pp = 0 score.pp = 0
break return
try: try:
beatmap_raw = await fetcher.get_or_fetch_beatmap_raw(redis, beatmap_id) pp = await pre_fetch_and_calculate_pp(
pp = await calculate_pp(score, beatmap_raw, session) score, beatmap_id, session, redis, fetcher
)
score.pp = pp score.pp = pp
if pp == 0:
return
if score.beatmap_id not in prev or prev[score.beatmap_id].pp < pp: if score.beatmap_id not in prev or prev[score.beatmap_id].pp < pp:
best_score = PPBestScore( best_score = PPBestScore(
user_id=user_id, user_id=user_id,
@@ -129,7 +132,7 @@ async def _recalculate_pp(
gamemode=score.gamemode, gamemode=score.gamemode,
) )
prev[score.beatmap_id] = best_score prev[score.beatmap_id] = best_score
break return
except HTTPError: except HTTPError:
time -= 1 time -= 1
await asyncio.sleep(2) await asyncio.sleep(2)
@@ -138,7 +141,7 @@ async def _recalculate_pp(
logger.exception( logger.exception(
f"Error calculating pp for score {score.id} on beatmap {beatmap_id}" f"Error calculating pp for score {score.id} on beatmap {beatmap_id}"
) )
break return
if time <= 0: if time <= 0:
logger.warning( logger.warning(
f"Failed to fetch beatmap {beatmap_id} after 10 attempts, " f"Failed to fetch beatmap {beatmap_id} after 10 attempts, "