feat(score): support custom pp calculator

This commit is contained in:
MingxuanGame
2025-08-10 05:05:08 +00:00
parent b0a7278daf
commit d9cf522f40
4 changed files with 16 additions and 36 deletions

View File

@@ -7,7 +7,15 @@ from app.models.beatmap import BeatmapAttributes
from app.models.mods import APIMod
from app.models.score import GameMode
import rosu_pp_py as rosu
try:
import rosu_pp_py as rosu
except ImportError:
raise ImportError(
"rosu-pp-py is not installed. "
"Please install it.\n"
" Official: uv add rosu-pp-py\n"
" ppy-sb: uv add git+https://github.com/ppy-sb/rosu-pp-py.git"
)
if TYPE_CHECKING:
from app.database.score import Score
@@ -51,8 +59,6 @@ def calculate_pp(
) -> float:
map = rosu.Beatmap(content=beatmap)
map.convert(score.gamemode.to_rosu(), score.mods) # pyright: ignore[reportArgumentType]
if map.is_suspicious():
return 0.0
perf = rosu.Performance(
mods=score.mods,
lazer=True,
@@ -67,7 +73,6 @@ def calculate_pp(
n100=score.n100,
n50=score.n50,
misses=score.nmiss,
hitresult_priority=rosu.HitResultPriority.Fastest,
)
attrs = perf.calculate(map)
return attrs.pp

View File

@@ -1,12 +1,14 @@
from __future__ import annotations
from enum import Enum
from typing import Literal, TypedDict
from typing import TYPE_CHECKING, Literal, TypedDict
from .mods import API_MODS, APIMod, init_mods
from pydantic import BaseModel, Field, ValidationInfo, field_validator
import rosu_pp_py as rosu
if TYPE_CHECKING:
import rosu_pp_py as rosu
class GameMode(str, Enum):
@@ -15,7 +17,9 @@ class GameMode(str, Enum):
FRUITS = "fruits"
MANIA = "mania"
def to_rosu(self) -> rosu.GameMode:
def to_rosu(self) -> "rosu.GameMode":
import rosu_pp_py as rosu
return {
GameMode.OSU: rosu.GameMode.Osu,
GameMode.TAIKO: rosu.GameMode.Taiko,