Skip to content

Commit 2d48206

Browse files
authored
Merge pull request #50 from Starrah/feat-more-score-extend
feat: ScoreExtend中新增dx_star和version
2 parents 316a9a8 + 530e4f3 commit 2d48206

File tree

5 files changed

+53
-10
lines changed

5 files changed

+53
-10
lines changed

docs/concepts/models.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,11 +104,13 @@
104104

105105
继承自 `Score` 类。
106106

107-
| 字段 | 类型 | 说明 |
108-
|------------------|--------------|------------------|
109-
| `title` | `int` | 曲目标题 |
110-
| `level_value` | `LevelIndex` | 难度定数 |
111-
| `level_dx_score` | `LevelIndex` | 难度最大 DX 分数 |
107+
| 字段 | 类型 | 说明 |
108+
|------------------|---------------|------------------|
109+
| `title` | `int` | 曲目标题 |
110+
| `level_value` | `LevelIndex` | 难度定数 |
111+
| `level_dx_score` | `LevelIndex` | 难度最大 DX 分数 |
112+
| `dx_star` | `int \| None` | DX Star |
113+
| `version` | `int` | 难度出现版本 |
112114

113115
## [PlateObject](https://api.maimai.turou.fun/maimai_py/models.html#PlateObject)
114116

maimai_py/enums.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
import functools
12
from enum import Enum, IntEnum
2-
from typing import Union
3+
from typing import Optional, Union
34

45
from maimai_ffi.model import region_map
56

@@ -26,6 +27,28 @@ class Version(IntEnum):
2627
MAIMAI_DX_PRISM = 25000 # 舞萌DX 2025
2728
MAIMAI_DX_FUTURE = 30000 # 舞萌DX 2077
2829

30+
@staticmethod
31+
@functools.cache
32+
def _reversed_values() -> list["Version"]:
33+
return list(reversed([v for v in Version.__members__.values()]))
34+
35+
@staticmethod
36+
@functools.cache
37+
def from_value(val: int) -> Optional["Version"]:
38+
"""Get the Version enum member from an integer value.
39+
40+
The function returns the highest Version whose value is less than or equal to the given integer.
41+
42+
Args:
43+
val (int): The integer value representing the version.
44+
Returns:
45+
Optional[Version]: The corresponding Version enum member, or None if not found.
46+
"""
47+
for v in Version._reversed_values():
48+
if val >= v.value:
49+
return v
50+
return None
51+
2952

3053
class Genre(Enum):
3154
POPSアニメ = "POPSアニメ"

maimai_py/maimai.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -646,18 +646,31 @@ async def _get_mapping(
646646
if song and (diff := song.get_difficulty(score.type, level_index)):
647647
yield (song, diff, score)
648648

649+
@staticmethod
650+
def _calcuate_dx_star(dx_score: int, max_dx_score: int) -> int:
651+
THRESHOLD = [0.85, 0.90, 0.93, 0.95, 0.97]
652+
653+
percentage = dx_score / max_dx_score
654+
for i, t in enumerate(THRESHOLD):
655+
if percentage < t:
656+
return i
657+
return 5
658+
649659
@staticmethod
650660
async def _get_extended(scores: Iterable[Score], maimai_songs: MaimaiSongs) -> list[ScoreExtend]:
651661
extended_scores = []
652662
async for song, diff, score in MaimaiScores._get_mapping(scores, maimai_songs):
653663
extended_dict = dataclasses.asdict(score)
664+
level_dx_score = (diff.tap_num + diff.hold_num + diff.slide_num + diff.break_num + diff.touch_num) * 3
665+
dx_star = MaimaiScores._calcuate_dx_star(score.dx_score, level_dx_score) if score.dx_score else None
654666
extended_dict.update(
655667
{
656668
"level": diff.level, # Ensure level is set correctly.
657669
"title": song.title,
670+
"dx_star": dx_star,
671+
"version": diff.version,
658672
"level_value": diff.level_value,
659-
"level_dx_score": (diff.tap_num + diff.hold_num + diff.slide_num + diff.break_num + diff.touch_num)
660-
* 3,
673+
"level_dx_score": level_dx_score,
661674
}
662675
)
663676
extended_scores.append(ScoreExtend(**extended_dict))

maimai_py/models.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,11 +500,13 @@ def _join(self, other: Optional["Score"]) -> "Score":
500500

501501
@dataclass
502502
class ScoreExtend(Score):
503-
__slots__ = ["title", "level_value", "level_dx_score"]
503+
__slots__ = ["title", "level_value", "level_dx_score", "dx_star", "version"]
504504

505505
title: str
506506
level_value: float
507507
level_dx_score: int
508+
dx_star: Optional[int]
509+
version: int
508510

509511

510512
@dataclass

tests/test_scores.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import pytest
22

3-
from maimai_py.enums import LevelIndex
3+
from maimai_py.enums import LevelIndex, Version
44
from maimai_py.maimai import MaimaiClient
55
from maimai_py.models import Player, PlayerIdentifier
66
from maimai_py.providers import ArcadeProvider, DivingFishProvider, LXNSProvider
@@ -13,6 +13,9 @@ async def test_scores_fetching_lxns(maimai: MaimaiClient, lxns: LXNSProvider, lx
1313
assert my_scores.rating_b35 > 10000
1414
score = my_scores.by_song(1231, level_index=LevelIndex.MASTER)[0]
1515
assert score.dx_rating >= 308 if score.dx_rating else True # 生命不詳 MASTER SSS+
16+
assert Version.from_value(score.version) == Version.MAIMAI_DX_UNIVERSE
17+
assert score.dx_star >= 1 if score.dx_star else True
18+
assert score.version >= 22000
1619

1720
bests = await maimai.bests(PlayerIdentifier(friend_code=664994421382429), provider=lxns)
1821
assert my_scores.rating == bests.rating

0 commit comments

Comments
 (0)