Skip to content

Commit

Permalink
add provisional api._beatmap_scores_non_legacy endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
tybug committed Feb 4, 2024
1 parent 121b477 commit 1e81a9c
Show file tree
Hide file tree
Showing 3 changed files with 121 additions and 3 deletions.
86 changes: 86 additions & 0 deletions ossapi/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -1274,3 +1274,89 @@ class MatchResponse(Model):
first_event_id: int
latest_event_id: int
current_game_id: Optional[int]


# ==================
# Provisional Models
# ==================

class _NonLegacyBeatmapScores(Model):
scores: List[_NonLegacyScore]
userScore: Optional[BeatmapUserScore]

class _NonLegacyMod(BaseModel):
# returned in a new format. e.g.:
# "mods": [
# {
# "acronym": "HR"
# },
# {
# "acronym": "HD"
# },
# {
# "acronym": "CL"
# }
# ],
def __init__(self, value):
self.value = value

class _NonLegacyStatistics(Model):
# these values simply aren't present if they are 0. oversight?
miss: Optional[int]
meh: Optional[int]
ok: Optional[int]
good: Optional[int]
great: Optional[int]

# TODO: are these weird values returned by the api anywhere?
# e.g. legacy_combo_increase in particular.
perfect: Optional[int]
small_tick_miss: Optional[int]
small_tick_hit: Optional[int]
large_tick_miss: Optional[int]
large_tick_hit: Optional[int]
small_bonus: Optional[int]
large_bonus: Optional[int]
ignore_miss: Optional[int]
ignore_hit: Optional[int]
combo_break: Optional[int]
slider_tail_hit: Optional[int]
legacy_combo_increase: Optional[int]

class _NonLegacyScore(Model):
id: Optional[int]
best_id: Optional[int]
user_id: int
accuracy: float
max_combo: int
statistics: _NonLegacyStatistics
pp: Optional[float]
rank: Grade

passed: bool
current_user_attributes: Any
replay: bool
maximum_statistics: Any # TODO property typing
mods: _NonLegacyMod
ruleset_id: int
started_at: Optional[Datetime]
ended_at: Datetime
ranked: bool
preserve: bool
beatmap_id: int
build_id: Optional[int]
has_replay: bool
is_perfect_combo: bool
total_score: int

legacy_perfect: bool
legacy_score_id: int
legacy_total_score: int

beatmapset: Optional[BeatmapsetCompact]
rank_country: Optional[int]
rank_global: Optional[int]
weight: Optional[Weight]
_user: Optional[UserCompact] = Field(name="user")
match: Optional[ScoreMatchInfo]
type: str
24 changes: 23 additions & 1 deletion ossapi/ossapiv2.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
BeatmapUserScores, DifficultyAttributes, Users, Beatmaps,
CreateForumTopicResponse, ForumPoll, ForumPost, ForumTopic, Room,
RoomLeaderboard, Matches, Match, MatchResponse, ChatChannel, Events,
BeatmapPack, BeatmapPacks)
BeatmapPack, BeatmapPacks, _NonLegacyBeatmapScores)
from ossapi.enums import (GameMode, ScoreType, RankingFilter, RankingType,
UserBeatmapType, BeatmapDiscussionPostSort, UserLookupKey,
BeatmapsetEventType, CommentableType, CommentSort, ForumTopicSort,
Expand Down Expand Up @@ -1169,6 +1169,28 @@ def beatmap_scores(self,
return self._get(BeatmapScores, f"/beatmaps/{beatmap_id}/scores",
params)

def _beatmap_scores_non_legacy(self,
beatmap_id: BeatmapIdT,
*,
mode: Optional[GameModeT] = None,
mods: Optional[ModT] = None,
type: Optional[RankingTypeT] = None,
limit: Optional[int] = None,
legacy_only: Optional[bool] = None
) -> _NonLegacyBeatmapScores:
"""
This is a provisional method. It may change or disappear in the future.
Feel free to use it, but don't expect ossapi to maintain backwards
compatability here.
I'll decide what to do about these provisional methods once the lazer
migration settles down.
"""
params = {"mode": mode, "mods": mods, "type": type, "limit": limit,
"legacy_only": legacy_only}
return self._get(_NonLegacyBeatmapScores, f"/beatmaps/{beatmap_id}/solo-scores",
params)

@request(Scope.PUBLIC, category="beatmaps")
def beatmap(self,
beatmap_id: Optional[BeatmapIdT] = None,
Expand Down
14 changes: 12 additions & 2 deletions tests/test_endpoints.py
Original file line number Diff line number Diff line change
Expand Up @@ -304,9 +304,9 @@ def test_lazer_different_from_osu(self):
self.assertEqual(pp_lazer, pp_exp_osu)


# =====================
# ==================
# api_dev test cases
# =====================
# ==================

class TestForum(TestCaseDevServer):
def test_forum(self):
Expand Down Expand Up @@ -354,3 +354,13 @@ def test_poll(self):
forum_id=85,
poll=poll
)


# ==========================
# provisional api test cases
# ==========================

class TestBeatmapScoresNonLegacy(TestCase):
def test_deserialize(self):
api._beatmap_scores_non_legacy(221777)
api._beatmap_scores_non_legacy(221777, legacy_only=True)

0 comments on commit 1e81a9c

Please sign in to comment.