Skip to content

Commit 530e4f3

Browse files
committed
feat: improve code style and version from value
feat: re-add from_value add docs
1 parent b985a65 commit 530e4f3

File tree

5 files changed

+40
-17
lines changed

5 files changed

+40
-17
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: 21 additions & 4 deletions
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

@@ -27,9 +28,25 @@ class Version(IntEnum):
2728
MAIMAI_DX_FUTURE = 30000 # 舞萌DX 2077
2829

2930
@staticmethod
30-
def fromVersionNumber(num):
31-
for v in reversed(Version.__members__.values()):
32-
if num >= v.value: return v
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
3350
return None
3451

3552

maimai_py/maimai.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ async def _get_mapping(
647647
yield (song, diff, score)
648648

649649
@staticmethod
650-
def calcuate_dx_star(dx_score, max_dx_score):
650+
def _calcuate_dx_star(dx_score: int, max_dx_score: int) -> int:
651651
THRESHOLD = [0.85, 0.90, 0.93, 0.95, 0.97]
652652

653653
percentage = dx_score / max_dx_score
@@ -661,15 +661,16 @@ async def _get_extended(scores: Iterable[Score], maimai_songs: MaimaiSongs) -> l
661661
extended_scores = []
662662
async for song, diff, score in MaimaiScores._get_mapping(scores, maimai_songs):
663663
extended_dict = dataclasses.asdict(score)
664-
max_dx_score = (diff.tap_num + diff.hold_num + diff.slide_num + diff.break_num + diff.touch_num) * 3
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
665666
extended_dict.update(
666667
{
667668
"level": diff.level, # Ensure level is set correctly.
668669
"title": song.title,
670+
"dx_star": dx_star,
671+
"version": diff.version,
669672
"level_value": diff.level_value,
670-
"level_dx_score": max_dx_score,
671-
"dx_star": MaimaiScores.calcuate_dx_star(score.dx_score, max_dx_score),
672-
"version": Version.fromVersionNumber(diff.version),
673+
"level_dx_score": level_dx_score,
673674
}
674675
)
675676
extended_scores.append(ScoreExtend(**extended_dict))

maimai_py/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -505,8 +505,8 @@ class ScoreExtend(Score):
505505
title: str
506506
level_value: float
507507
level_dx_score: int
508-
dx_star: int
509-
version: Version
508+
dx_star: Optional[int]
509+
version: int
510510

511511

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