82 lines
2.0 KiB
Python
82 lines
2.0 KiB
Python
import json
|
||
from pydantic import BaseModel, Field
|
||
from typing import Optional
|
||
from datetime import datetime
|
||
|
||
class ChestBase(BaseModel):
|
||
title: str = Field(..., min_length=1, max_length=200)
|
||
option_a: str = Field(..., min_length=1, max_length=100)
|
||
option_b: str = Field(..., min_length=1, max_length=100)
|
||
countdown_seconds: int = Field(default=300, ge=10, le=3600) # 10秒到1小时
|
||
|
||
|
||
class ChestCreate(ChestBase):
|
||
pass
|
||
|
||
|
||
class ChestResponse(ChestBase):
|
||
id: int
|
||
streamer_id: int
|
||
status: int
|
||
pool_a: int
|
||
pool_b: int
|
||
total_bets: int
|
||
locked_at: Optional[datetime] = None
|
||
settled_at: Optional[datetime] = None
|
||
result: Optional[str] = None
|
||
created_at: datetime
|
||
time_remaining: int = 0 # 改为非可选字段,默认值为0
|
||
|
||
# 计算属性
|
||
@property
|
||
def total_pool(self) -> int:
|
||
return self.pool_a + self.pool_b
|
||
|
||
@property
|
||
def odds_a(self) -> float:
|
||
"""计算A边赔率 (1 : X)"""
|
||
if self.pool_a == 0:
|
||
return 0.0
|
||
# 修改赔率计算方式,只对获胜方抽水
|
||
return round((self.pool_a + self.pool_b * 0.9) / self.pool_a, 2)
|
||
|
||
@property
|
||
def odds_b(self) -> float:
|
||
"""计算B边赔率 (1 : X)"""
|
||
if self.pool_b == 0:
|
||
return 0.0
|
||
# 修改赔率计算方式,只对获胜方抽水
|
||
return round((self.pool_b + self.pool_a * 0.9) / self.pool_b, 2)
|
||
|
||
class Config:
|
||
from_attributes = True
|
||
|
||
|
||
class BetCreate(BaseModel):
|
||
chest_id: int
|
||
option: str = Field(..., pattern="^[AB]$")
|
||
amount: int = Field(..., gt=0)
|
||
|
||
|
||
class BetResponse(BaseModel):
|
||
id: int
|
||
user_id: int
|
||
chest_id: int
|
||
option: str
|
||
amount: int
|
||
payout: int
|
||
status: str
|
||
created_at: datetime
|
||
|
||
class Config:
|
||
from_attributes = True
|
||
|
||
|
||
class ChestSettle(BaseModel):
|
||
"""宝箱结算"""
|
||
result: str = Field(..., pattern="^(A|B|REFUND)$")
|
||
|
||
|
||
class ChestLock(BaseModel):
|
||
"""宝箱封盘"""
|
||
pass |