from __future__ import annotations import json from typing import Optional, TypeVar from pydantic import Field from pydantic.generics import GenericModel from hopper.api.dto import ( BaseModel, BoardDto, DestinationDto, PlayerDto, PositionDto, ProductDto, ) from hopper.enums import ObjectType class LayerObjectDto(BaseModel): type: ObjectType = Field(..., alias="type_") position: PositionDto class LayerDto(BaseModel): name: str objects: list[LayerObjectDto] class GameDumpDto(BaseModel): board: BoardDto destination: DestinationDto players: list[PlayerDto] layers: list[LayerDto] class ProductPurchaseStartDto(BaseModel): player: PlayerDto products: list[ProductDto] timeout: int class ProductPurchaseTimerDto(BaseModel): time_left: int player: PlayerDto class ProductPurchaseDoneDto(BaseModel): player: PlayerDto product: Optional[ProductDto] = None TMessageData = TypeVar("TMessageData", bound=BaseModel) class WSMessage(GenericModel): message: str data: Optional[TMessageData] = None def __str__(self) -> str: return self.to_str() def to_str(self) -> str: return json.dumps(self.dict()) class WSGameDumpMessage(WSMessage): message: str = "game_dump" data: GameDumpDto class WSProductPurchaseStartMessage(WSMessage): message: str = "product_purchase_start" data: ProductPurchaseStartDto class WSProductPurchaseTimerTickMessage(WSMessage): message: str = "product_purchase_timer_tick" data: ProductPurchaseTimerDto class WSProductPurchaseDoneMessage(WSMessage): message: str = "product_purchase_done" data: ProductPurchaseDoneDto