From 3f7c85be38561a10c1cc700623922b322254b97b Mon Sep 17 00:00:00 2001 From: jimmy-sketch Date: Sun, 27 Jul 2025 06:27:36 +0000 Subject: [PATCH] =?UTF-8?q?feat(multiplayer):=20=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E8=BF=94=E5=9B=9E=E7=9A=84=E7=9A=84=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=AB=AF=E6=88=BF=E9=97=B4=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/multiplayer_resp.py | 91 ++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 app/models/multiplayer_resp.py diff --git a/app/models/multiplayer_resp.py b/app/models/multiplayer_resp.py new file mode 100644 index 0000000..5c0c90f --- /dev/null +++ b/app/models/multiplayer_resp.py @@ -0,0 +1,91 @@ +from __future__ import annotations + +from datetime import datetime, timedelta +from enum import Enum + +from app.database.user import User +from app.models.mods import APIMod +from app.models.multiplayer import MatchType, QueueMode + +from pydantic import BaseModel + + +class RoomCategory(int, Enum): + Normal = 0 + Spotlight = 1 + FeaturedArtist = 2 + DailyChallenge = 3 + + +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 + + +class RoomPlaylistItemStats(BaseModel): + CountActive: int + CountTotal: int + RulesetIDs: list[int] + + +class RoomDifficulityRange(BaseModel): + Min: float + Max: float + + +class ItemAttempsCount(BaseModel): + PlaylistItemID: int + Attemps: int + Passed: bool + + +class PlaylistAggregateScore(BaseModel): + PlaylistItemAttempts: list[ItemAttempsCount] + + +class RoomStatus(int, Enum): + Idle = 0 + Playing = 1 + + +class RoomAvilability(int, Enum): + Public = 0 + FriendsOnly = 1 + InviteOnly = 2 + + +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: ( + PlaylistAggregateScore | None + ) # osu.Game/Online/Rooms/Room.cs:221 原文如此,不知道为什么 + CurrentPlaylistItem: RespPlaylistItem + ChannelID: int + Status: RoomStatus + Availabiliity: RoomAvilability