Files
WPSBot/core/models.py

96 lines
2.8 KiB
Python

"""数据模型定义"""
from pydantic import BaseModel, Field
from typing import Optional, Dict, Any, List
class CallbackRequest(BaseModel):
"""WPS Callback请求模型"""
chatid: int = Field(..., description="会话ID")
creator: int = Field(..., description="发送者ID")
content: str = Field(..., description="消息内容")
reply: Optional[Dict[str, Any]] = Field(None, description="回复内容")
robot_key: str = Field(..., description="机器人key")
url: str = Field(..., description="callback地址")
ctime: int = Field(..., description="发送时间")
class TextMessage(BaseModel):
"""文本消息"""
msgtype: str = "text"
text: Dict[str, str]
@classmethod
def create(cls, content: str):
"""创建文本消息"""
return cls(text={"content": content})
class MarkdownMessage(BaseModel):
"""Markdown消息"""
msgtype: str = "markdown"
markdown: Dict[str, str]
@classmethod
def create(cls, text: str):
"""创建Markdown消息"""
return cls(markdown={"text": text})
class LinkMessage(BaseModel):
"""链接消息"""
msgtype: str = "link"
link: Dict[str, str]
@classmethod
def create(cls, title: str, text: str, message_url: str = "", btn_title: str = "查看详情"):
"""创建链接消息"""
return cls(link={
"title": title,
"text": text,
"messageUrl": message_url,
"btnTitle": btn_title
})
class GameState(BaseModel):
"""游戏状态基类"""
game_type: str
created_at: int
updated_at: int
class GuessGameState(GameState):
"""猜数字游戏状态"""
game_type: str = "guess"
target: int = Field(..., description="目标数字")
attempts: int = Field(0, description="尝试次数")
guesses: list[int] = Field(default_factory=list, description="历史猜测")
max_attempts: int = Field(10, description="最大尝试次数")
class QuizGameState(GameState):
"""问答游戏状态"""
game_type: str = "quiz"
question_id: int = Field(..., description="问题ID")
question: str = Field(..., description="问题内容")
attempts: int = Field(0, description="尝试次数")
max_attempts: int = Field(3, description="最大尝试次数")
class PrivateMessageRequest(BaseModel):
"""私聊消息请求模型"""
user_id: int = Field(..., description="目标用户ID")
content: str = Field(..., description="消息内容")
msg_type: str = Field(default="text", description="消息类型: text 或 markdown")
class CheckBatchRequest(BaseModel):
"""批量检查请求模型"""
user_ids: List[int] = Field(..., description="用户ID列表")
class CheckBatchResponse(BaseModel):
"""批量检查响应模型"""
results: Dict[int, bool] = Field(..., description="用户ID到是否有URL的映射")