refactor: complete host module and event contracts

This commit is contained in:
jxxghp
2026-08-22 13:21:52 +08:00
parent e61b5168ad
commit 677f6a66c2
9 changed files with 3497 additions and 72 deletions
+185 -1
View File
@@ -1,7 +1,7 @@
from pathlib import Path
from typing import Iterable, Optional, Dict, Any, List, Set, Callable
from pydantic import BaseModel, Field, field_validator, model_validator
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
from app.schemas.common import JsonData
from app.schemas.types import MediaType, NotificationChannel
@@ -29,6 +29,190 @@ class BaseEventData(BaseModel):
pass
class ExtensibleEventData(BaseEventData):
"""允许第三方插件附加字段的类型化事件载荷基类。"""
model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
class EmptyEventData(ExtensibleEventData):
"""当前没有固定字段、但仍需进入 typed registry 的事件载荷。"""
class PluginReloadEventData(ExtensibleEventData):
"""插件重载广播事件载荷。"""
plugin_id: str = Field(description="重载的插件 ID")
class PluginActionEventData(ExtensibleEventData):
"""插件命令动作载荷;具体动作参数由目标插件扩展。"""
plugin_id: Optional[str] = Field(default=None, description="目标插件 ID")
action: Optional[str] = Field(default=None, description="插件动作名称")
channel: Optional[str] = Field(default=None, description="消息渠道")
source: Optional[str] = Field(default=None, description="消息来源")
user: Optional[Any] = Field(default=None, description="发起用户")
class PluginTriggeredEventData(ExtensibleEventData):
"""插件主动发布的跨插件事件载荷。"""
plugin_id: str = Field(description="发布事件的插件 ID")
event_name: str = Field(description="插件定义的稳定事件名")
data: Any = Field(default=None, description="插件定义的事件数据")
class CommandExecuteEventData(ExtensibleEventData):
"""斜杠命令执行事件载荷。"""
cmd: str = Field(description="包含参数的完整命令文本")
user: Optional[Any] = Field(default=None, description="发起用户")
channel: Optional[str] = Field(default=None, description="消息渠道")
source: Optional[str] = Field(default=None, description="消息来源")
processing_status: Optional[Any] = Field(default=None, description="交互处理状态")
class SiteEventData(ExtensibleEventData):
"""站点新增、更新、删除或数据刷新事件载荷。"""
site_id: Optional[int | str] = Field(default=None, description="站点 ID 或通配符")
domain: Optional[str] = Field(default=None, description="站点域名")
name: Optional[str] = Field(default=None, description="站点名称")
site_url: Optional[str] = Field(default=None, description="站点地址")
class HistoryDeletedEventData(ExtensibleEventData):
"""历史记录删除事件的兼容载荷。"""
history_id: Optional[int] = Field(default=None, description="历史记录 ID")
src: Optional[str] = Field(default=None, description="关联源路径")
class DownloadFileDeletedEventData(ExtensibleEventData):
"""下载源文件删除事件载荷。"""
src: Optional[str] = Field(default=None, description="已删除的下载源路径")
hash: Optional[str] = Field(default=None, description="下载任务 hash")
class DownloadDeletedEventData(ExtensibleEventData):
"""下载任务删除事件载荷。"""
hash: str = Field(description="下载任务 hash")
torrents: List[Dict[str, Any]] = Field(default_factory=list, description="删除前任务快照")
class UserMessageEventData(ExtensibleEventData):
"""未被宿主命令或交互消费的用户文本消息载荷。"""
text: str = Field(description="用户文本")
userid: Optional[Any] = Field(default=None, description="用户 ID")
channel: Optional[str] = Field(default=None, description="消息渠道")
source: Optional[str] = Field(default=None, description="消息来源")
chat_id: Optional[Any] = Field(default=None, description="会话 ID")
reply_to_message_id: Optional[Any] = Field(default=None, description="回复消息 ID")
class NoticeMessageEventData(ExtensibleEventData):
"""宿主向消息模块发送的通知事件载荷。"""
type: Optional[Any] = Field(default=None, description="兼容消息类型")
title: Optional[str] = Field(default=None, description="消息标题")
text: Optional[str] = Field(default=None, description="消息正文")
userid: Optional[Any] = Field(default=None, description="目标用户 ID")
channel: Optional[Any] = Field(default=None, description="目标消息渠道")
source: Optional[str] = Field(default=None, description="消息来源")
class SubscribeCompleteEventData(ExtensibleEventData):
"""订阅完成广播事件载荷。"""
subscribe_id: int = Field(description="已完成订阅 ID")
subscribe_info: Dict[str, Any] = Field(default_factory=dict, description="订阅快照")
mediainfo: Dict[str, Any] = Field(default_factory=dict, description="媒体信息快照")
class SystemErrorEventData(ExtensibleEventData):
"""事件、模块、插件或调度器错误的宿主诊断载荷。"""
type: str = Field(description="错误来源类别")
error: str = Field(description="错误摘要")
traceback: Optional[str] = Field(default=None, description="错误堆栈")
class MetadataScrapeEventData(ExtensibleEventData):
"""媒体文件元数据刮削事件载荷。"""
fileitem: FileItem = Field(description="待刮削目录或文件项")
file_list: List[str] = Field(default_factory=list, description="待刮削文件清单")
meta: Any = Field(default=None, description="文件名解析对象")
mediainfo: Any = Field(default=None, description="媒体信息对象")
overwrite: bool = Field(default=False, description="是否覆盖已有元数据")
file_contexts: List[Any] = Field(default_factory=list, description="逐文件上下文")
class MessageActionEventData(ExtensibleEventData):
"""定向插件消息交互动作载荷。"""
plugin_id: Optional[str] = Field(default=None, description="目标插件 ID")
text: Optional[str] = Field(default=None, description="兼容动作文本")
input_text: Optional[str] = Field(default=None, description="用户输入文本")
userid: Optional[Any] = Field(default=None, description="用户 ID")
channel: Optional[str] = Field(default=None, description="消息渠道")
source: Optional[str] = Field(default=None, description="消息来源")
input_session_id: Optional[str] = Field(default=None, description="输入会话 ID")
payload: Any = Field(default=None, description="插件自定义交互数据")
class WorkflowExecuteEventData(ExtensibleEventData):
"""请求执行指定工作流的事件载荷。"""
workflow_id: int = Field(description="工作流 ID")
class NameRecognizeEventData(ExtensibleEventData):
"""影视名称辅助识别的输入和插件回写字段。"""
title: str = Field(description="待识别标题")
name: Optional[str] = Field(default=None, description="插件识别后的名称")
year: Optional[Any] = Field(default=None, description="年份")
season: Optional[Any] = Field(default=None, description="季号")
episode: Optional[Any] = Field(default=None, description="集号")
class MusicNameRecognizeEventData(ExtensibleEventData):
"""音乐名称辅助识别的输入和插件回写字段。"""
title: str = Field(description="待识别曲名")
artist: Optional[str] = Field(default=None, description="艺术家")
album: Optional[str] = Field(default=None, description="专辑")
year: Optional[Any] = Field(default=None, description="年份")
duration: Optional[Any] = Field(default=None, description="时长")
name: Optional[str] = Field(default=None, description="插件识别后的曲名")
class MediaRecognizeEventData(ExtensibleEventData):
"""影视媒体身份补充识别的输入和插件回写字段。"""
title: Optional[str] = Field(default=None, description="待识别标题")
year: Optional[Any] = Field(default=None, description="年份")
season: Optional[Any] = Field(default=None, description="季号")
type: Optional[Any] = Field(default=None, description="媒体类型")
media_source: Optional[Any] = Field(default=None, description="媒体数据源")
media_id: Optional[Any] = Field(default=None, description="数据源原生 ID")
mediainfo: Optional[Dict[str, Any]] = Field(default=None, description="插件回写媒体信息")
class MusicMediaRecognizeEventData(MediaRecognizeEventData):
"""音乐媒体身份补充识别的输入和插件回写字段。"""
artists: List[str] = Field(default_factory=list, description="艺术家列表")
album: Optional[str] = Field(default=None, description="专辑")
isrc: Optional[str] = Field(default=None, description="ISRC")
music_type: Optional[str] = Field(default=None, description="音乐实体类型")
class ConfigChangeEventData(BaseEventData):
"""
ConfigChange 事件的数据模型