from __future__ import annotations from datetime import datetime from enum import Enum from app.database import User from app.database.beatmap import Beatmap from app.models.mods import APIMod from .model import UTCBaseModel from pydantic import BaseModel, Field class RoomCategory(str, Enum): NORMAL = "normal" SPOTLIGHT = "spotlight" FEATURED_ARTIST = "featured_artist" DAILY_CHALLENGE = "daily_challenge" class MatchType(str, Enum): PLAYLISTS = "playlists" HEAD_TO_HEAD = "head_to_head" TEAM_VERSUS = "team_versus" class QueueMode(str, Enum): HOST_ONLY = "host_only" ALL_PLAYERS = "all_players" ALL_PLAYERS_ROUND_ROBIN = "all_players_round_robin" class RoomAvailability(str, Enum): PUBLIC = "public" FRIENDS_ONLY = "friends_only" INVITE_ONLY = "invite_only" class RoomStatus(str, Enum): IDLE = "idle" PLAYING = "playing" class PlaylistItem(UTCBaseModel): id: int | None owner_id: int ruleset_id: int expired: bool playlist_order: int | None played_at: datetime | None allowed_mods: list[APIMod] = Field(default_factory=list) required_mods: list[APIMod] = Field(default_factory=list) beatmap_id: int beatmap: Beatmap | None freestyle: bool class RoomPlaylistItemStats(BaseModel): count_active: int count_total: int ruleset_ids: list[int] = [] class RoomDifficultyRange(BaseModel): min: float max: float class ItemAttemptsCount(BaseModel): id: int attempts: int passed: bool class PlaylistAggregateScore(BaseModel): playlist_item_attempts: list[ItemAttemptsCount] class Room(UTCBaseModel): id: int | None name: str = "" password: str | None has_password: bool = False host: User | None category: RoomCategory = RoomCategory.NORMAL duration: int | None starts_at: datetime | None ends_at: datetime | None participant_count: int = 0 recent_participants: list[User] = Field(default_factory=list) max_attempts: int | None playlist: list[PlaylistItem] = Field(default_factory=list) playlist_item_stats: RoomPlaylistItemStats | None difficulty_range: RoomDifficultyRange | None type: MatchType = MatchType.PLAYLISTS queue_mode: QueueMode = QueueMode.HOST_ONLY auto_skip: bool = False auto_start_duration: int = 0 current_user_score: PlaylistAggregateScore | None current_playlist_item: PlaylistItem | None channel_id: int = 0 status: RoomStatus = RoomStatus.IDLE # availability 字段在当前序列化中未包含,但可能在某些场景下需要 availability: RoomAvailability | None