Files
g0v0-server/app/models/multiplayer.py

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