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 from hopper.enums import ObjectType class LayerObjectDto(BaseModel): type: ObjectType = Field(..., alias="type_") position: PositionDto class LayerDto(BaseModel): name: str objects: list[LayerObjectDto] class ProductDto(BaseModel): name: str uuid: str description: Optional[str] = None 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