125 lines
2.7 KiB
Python
125 lines
2.7 KiB
Python
# mp 房间相关模型
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime, timedelta
|
|
from enum import Enum
|
|
|
|
from app.models.mods import APIMod
|
|
|
|
from pydantic import BaseModel
|
|
from sqlmodel import Double
|
|
|
|
# 数据结构定义来自osu/osu.Game/Online/Multiplayer*.cs
|
|
|
|
|
|
class MultiplayerRoomState(int, Enum):
|
|
Open = 0
|
|
WaitingForLoad = 1
|
|
Playing = 2
|
|
Closed = 3
|
|
|
|
|
|
class MatchType(int, Enum):
|
|
Playlists = 0
|
|
HeadToHead = 1
|
|
TeamVersus = 2
|
|
|
|
|
|
class QueueMode(int, Enum):
|
|
HostOnly = 0
|
|
Allplayers = 1
|
|
AllplayersRoundRobin = 2
|
|
|
|
|
|
class MultiPlayerRoomSettings(BaseModel):
|
|
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):
|
|
Idle = 0
|
|
Ready = 1
|
|
WaitingForLoad = 2
|
|
Loaded = 3
|
|
ReadyForGameplay = 4
|
|
Playing = 5
|
|
FinishedPlay = 6
|
|
Results = 7
|
|
Spectating = 8
|
|
|
|
|
|
class DownloadeState(int, Enum):
|
|
Unkown = 0
|
|
NotDownloaded = 1
|
|
Downloading = 2
|
|
Importing = 3
|
|
LocallyAvailable = 4
|
|
|
|
|
|
class BeatmapAvailability(BaseModel):
|
|
state: DownloadeState
|
|
download_progress: float
|
|
|
|
|
|
class MatchUserState(BaseModel):
|
|
pass
|
|
|
|
|
|
class MatchRoomState(BaseModel):
|
|
pass
|
|
|
|
|
|
class MultiPlayerRoomUser(BaseModel):
|
|
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 = ""
|
|
RulesetID: int
|
|
RequierdMods: list[APIMod] = []
|
|
AllowedMods: list[APIMod] = []
|
|
PlayListOrder: int
|
|
PlayedAt: datetime | None
|
|
StarRating: Double
|
|
FreeStyle: bool
|
|
|
|
|
|
class MultiplayerCountdown(BaseModel):
|
|
id: int
|
|
time_raming: timedelta
|
|
|
|
|
|
class MultiplayerRoom(BaseModel):
|
|
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
|