blob: 1e70ce7d55d707f93a838ec67ff244883c2b2ff9 [file] [log] [blame] [raw]
"""
Webhook数据模型
定义Bot间消息传递的数据结构
"""
from typing import Optional, Dict, List, Any
from datetime import datetime
from pydantic import BaseModel, Field, ConfigDict
import uuid
class UserInfo(BaseModel):
"""用户信息"""
user_id: int
username: Optional[str] = None
first_name: Optional[str] = None
last_name: Optional[str] = None
is_bot: bool = False
class ReplyInfo(BaseModel):
"""回复消息信息"""
user_info: UserInfo
timestamp: Optional[datetime] = None
content: str
message_id: Optional[int] = None
class BotMessage(BaseModel):
"""Bot消息模型"""
# 消息基本信息
message_id: str = Field(default_factory=lambda: str(uuid.uuid4()))
bot_username: str
group_id: int
timestamp: datetime = Field(default_factory=datetime.now)
# 消息内容
message_content: str
message_type: str = "text" # text, photo, document, etc.
# 用户信息
sender_info: UserInfo
# 回复信息(可选)
reply_info: Optional[ReplyInfo] = None
# Telegram特定字段
telegram_message_id: Optional[int] = None
chat_type: str = "group" # group, supergroup, private
# 扩展字段
metadata: Dict[str, Any] = Field(default_factory=dict)
model_config = ConfigDict(
json_encoders={
datetime: lambda v: v.isoformat()
}
)
class WebhookConfig(BaseModel):
"""Webhook配置"""
# 服务器配置
server_host: str = "0.0.0.0"
server_port: int = 8080
# 认证配置
auth_token: str
# 连接配置
webhook_url: Optional[str] = None # 客户端连接的Webhook URL
# 消息过滤配置
enabled_groups: List[int] = Field(default_factory=list)
message_filters: Dict[str, Any] = Field(default_factory=dict)
# 重试配置
max_retries: int = 3
retry_delay: float = 1.0
# 超时配置
connection_timeout: float = 10.0
request_timeout: float = 5.0
class BotRegistration(BaseModel):
"""Bot注册信息"""
bot_username: str
auth_token: str
subscribed_groups: List[int] = Field(default_factory=list)
webhook_endpoint: Optional[str] = None # Bot的回调端点
# 注册时间
registered_at: datetime = Field(default_factory=datetime.now)
last_seen: datetime = Field(default_factory=datetime.now)
model_config = ConfigDict(
json_encoders={
datetime: lambda v: v.isoformat()
}
)
class WebhookResponse(BaseModel):
"""Webhook响应"""
success: bool
message: str = ""
data: Optional[Dict[str, Any]] = None
timestamp: datetime = Field(default_factory=datetime.now)
model_config = ConfigDict(
json_encoders={
datetime: lambda v: v.isoformat()
}
)
class MessageBroadcast(BaseModel):
"""消息广播请求"""
bot_message: BotMessage
target_groups: Optional[List[int]] = None # 如果为None,则广播给所有订阅的Bot
exclude_bots: List[str] = Field(default_factory=list) # 排除的Bot用户名列表