From eb781f60e42080e0deb7231e2ddc3e52417887ca Mon Sep 17 00:00:00 2001 From: jimmy-sketch Date: Sun, 27 Jul 2025 09:55:41 +0000 Subject: [PATCH] =?UTF-8?q?refactor(multiplayer):=20=E5=B0=86=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E5=AD=97=E6=AE=B5=E6=9B=B4=E6=94=B9=E4=B8=BA=E5=B0=8F?= =?UTF-8?q?=E5=86=99=E4=BB=A5=E4=B8=8E=E5=AE=9E=E9=99=85=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/multiplayer.py | 60 +++++++++++++---------- app/models/multiplayer_resp.py | 89 ++++++++++++++++++---------------- 2 files changed, 81 insertions(+), 68 deletions(-) diff --git a/app/models/multiplayer.py b/app/models/multiplayer.py index 9014b78..bd2bef4 100644 --- a/app/models/multiplayer.py +++ b/app/models/multiplayer.py @@ -32,13 +32,13 @@ class QueueMode(int, Enum): class MultiPlayerRoomSettings(BaseModel): - Name: str = "Unnamed room" # 来自osu/osu.Game/Online/MultiplayerRoomSettings.cs:15 - PlaylistItemId: int - Password: str - MatchType: MatchType - QueueMode: QueueMode - AutoStartDuration: timedelta - AutoSkip: bool + name: str = "Unnamed room" # 来自osu/osu.Game/Online/MultiplayerRoomSettings.cs:15 + playlist_item_id: int + password: str + match_type: MatchType + queue_mode: QueueMode + auto_start_duration: timedelta + auto_skip: bool class MultiPlayerUserState(int, Enum): @@ -62,8 +62,8 @@ class DownloadeState(int, Enum): class BeatmapAvailability(BaseModel): - State: DownloadeState - DownloadProgress: float + state: DownloadeState + download_progress: float class MatchUserState(BaseModel): @@ -75,16 +75,26 @@ class MatchRoomState(BaseModel): class MultiPlayerRoomUser(BaseModel): - UserID: int - State: MultiPlayerUserState - Mods: APIMod - MatchState: MatchUserState | None - RuleSetId: int | None # 非空则用户本地有自定义模式 - BeatmapId: int | None # 非空则用户本地自定义谱面 + user_id: int + state: MultiPlayerUserState = MultiPlayerUserState.Idle + mods: APIMod = APIMod(acronym="", settings={}) + match_state: MatchUserState | None + rule_set_id: int | None # 非空则用户本地有自定义模式 + beatmap_id: int | None # 非空则用户本地自定义谱面 class MultiplayerPlaylistItem(BaseModel): id: int + owner_id: int + beatmap_id: int + beatmap_checksum: str = "" + ruleset_id: int + requierd_mods: list[APIMod] = [] + allowed_mods: list[APIMod] = [] + play_list_order: int + played_at: datetime | None + star_rating: Double + free_style: bool OwnerID: int BeatmapID: int BeatmapChecksum: str = "" @@ -99,16 +109,16 @@ class MultiplayerPlaylistItem(BaseModel): class MultiplayerCountdown(BaseModel): id: int - TimeRaming: timedelta + time_raming: timedelta class MultiplayerRoom(BaseModel): - RoomID: int - State: MultiplayerRoomState - Settings: MultiPlayerRoomSettings - Users: list[MultiPlayerRoomUser] - Host: MultiPlayerRoomUser | None - MatchState: MatchUserState - Playlist: list[MultiplayerPlaylistItem] - ActiveConutdowns: list[MultiplayerCountdown] - ChannelID: int + room_id: int + state: MultiplayerRoomState + settings: MultiPlayerRoomSettings + users: list[MultiPlayerRoomUser] + host: MultiPlayerRoomUser | None + match_state: MatchUserState + playlist: list[MultiplayerPlaylistItem] + active_conutdowns: list[MultiplayerCountdown] + channel_id: int diff --git a/app/models/multiplayer_resp.py b/app/models/multiplayer_resp.py index 5c0c90f..3fd6001 100644 --- a/app/models/multiplayer_resp.py +++ b/app/models/multiplayer_resp.py @@ -3,6 +3,7 @@ from __future__ import annotations from datetime import datetime, timedelta from enum import Enum +from app.database.beatmap import Beatmap from app.database.user import User from app.models.mods import APIMod from app.models.multiplayer import MatchType, QueueMode @@ -18,36 +19,38 @@ class RoomCategory(int, Enum): class RespPlaylistItem(BaseModel): - id: int - OwnerID: int - RulesetID: int - Expired: bool - PlaylistOrder: int | None - PlayedAt: datetime | None - AllowedMods: list[APIMod] = [] - RequiredMods: list[APIMod] = [] - Freestyle: bool + id: int | None + owner_id: int + ruleset_id: int + expired: bool + playlist_order: int | None + played_at: datetime | None + allowed_mods: list[APIMod] = [] + required_mods: list[APIMod] = [] + beatmap_id: int + freestyle: bool + beatmap: Beatmap | None class RoomPlaylistItemStats(BaseModel): - CountActive: int - CountTotal: int - RulesetIDs: list[int] + count_active: int + count_total: int + ruleset_ids: list[int] class RoomDifficulityRange(BaseModel): - Min: float - Max: float + min: float + max: float class ItemAttempsCount(BaseModel): - PlaylistItemID: int - Attemps: int - Passed: bool + playlist_item_id: int + attemps: int + passed: bool class PlaylistAggregateScore(BaseModel): - PlaylistItemAttempts: list[ItemAttempsCount] + playlist_item_attempts: list[ItemAttempsCount] class RoomStatus(int, Enum): @@ -62,30 +65,30 @@ class RoomAvilability(int, Enum): class RoomResp(BaseModel): - RoomID: int - Name: str = "" - Password: str | None - Has_Password: bool - Host: User | None - Category: RoomCategory - Duration: timedelta | None - StartDate: datetime | None - EndDate: datetime | None - MaxParticipants: int | None - ParticipantCount: int - RecentParticipants: list[User] = [] - Type: MatchType - MaxAttemps: int | None - Playlist: list[RespPlaylistItem] - PlaylistItemStatus: RoomPlaylistItemStats - DifficulityRange: RoomDifficulityRange - QueueMode: QueueMode - AutoSkip: bool - AutoStartDuration: timedelta - UserScore: ( + room_id: int + name: str = "" + password: str | None + has_password: bool + host: User | None + category: RoomCategory + duration: timedelta | None + start_date: datetime | None + end_date: datetime | None + max_participants: int | None + participant_count: int + recent_participants: list[User] = [] + type: MatchType + max_attemps: int | None + playlist: list[RespPlaylistItem] + playlist_item_status: RoomPlaylistItemStats + difficulity_range: RoomDifficulityRange + queue_mode: QueueMode + auto_skip: bool + auto_start_duration: timedelta + user_score: ( PlaylistAggregateScore | None ) # osu.Game/Online/Rooms/Room.cs:221 原文如此,不知道为什么 - CurrentPlaylistItem: RespPlaylistItem - ChannelID: int - Status: RoomStatus - Availabiliity: RoomAvilability + current_playlist_item: RespPlaylistItem + channel_id: int + status: RoomStatus + availabiliity: RoomAvilability