85 lines
1.7 KiB
Python
85 lines
1.7 KiB
Python
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
|