refactor(schemas): 统一 message/notification 命名边界,旧名收敛至兼容映射表

- notification 域:渠道能力(MessageChannel→NotificationChannel、ChannelCapability* 迁入 notification.py)
- message 域:消息收发(Notification→Message、NotificationType→MessageType、CommingMessage→IncomingMessage、NotificationHistoryItem→MessageHistoryItem、NotificationClear*→MessageClear*)
- Agent 工具契约:send_notification_message→send_message、notification_callback→message_callback
- 源码不保留旧名物理别名,旧导入经 app/runtime/compat/manifest.py SYMBOL_ALIASES 惰性解析
- API 路径与持久化键冻结不变,前端零改动
- 新增兼容守护测试与 docs/rules/07 命名边界规范
This commit is contained in:
jxxghp
2026-08-16 19:32:20 +08:00
parent 98276a68a8
commit 240a4dffe6
96 changed files with 1975 additions and 1751 deletions
+27 -27
View File
@@ -14,10 +14,10 @@ from app.runtime.log import logger
from app.modules import _ModuleBase, _MessageBase
from app.schemas import (
CommandRegisterEventData,
CommingMessage,
MessageChannel,
IncomingMessage,
NotificationChannel,
MessageResponse,
Notification,
Message,
)
from app.schemas.types import ChainEventType, ModuleType
from app.adapters.network.http import RequestUtils
@@ -31,7 +31,7 @@ except Exception as err: # ImportError or other load issues
register_channel_admin_resolver(
MessageChannel.Discord,
NotificationChannel.Discord,
lambda config: resolve_config_principal_ids(config, "DISCORD_ADMINS"),
)
@@ -72,7 +72,7 @@ class DiscordModule(_ModuleBase, _MessageBase[Discord]):
super().init_service(
service_name=Discord.__name__.lower(), service_type=Discord
)
self._channel = MessageChannel.Discord
self._channel = NotificationChannel.Discord
@staticmethod
def get_name() -> str:
@@ -86,11 +86,11 @@ class DiscordModule(_ModuleBase, _MessageBase[Discord]):
return ModuleType.Notification
@staticmethod
def get_subtype() -> MessageChannel:
def get_subtype() -> NotificationChannel:
"""
获取模块子类型
"""
return MessageChannel.Discord
return NotificationChannel.Discord
@staticmethod
def get_priority() -> int:
@@ -170,7 +170,7 @@ class DiscordModule(_ModuleBase, _MessageBase[Discord]):
def message_parser(
self, source: str, body: Any, form: Any, args: Any
) -> Optional[CommingMessage]:
) -> Optional[IncomingMessage]:
"""
解析消息内容,返回字典,注意以下约定值:
userid: 用户ID
@@ -213,13 +213,13 @@ class DiscordModule(_ModuleBase, _MessageBase[Discord]):
f"收到来自 {client_config.name} 的 Discord 按钮回调:"
f"userid={userid}, username={username}, callback_data={callback_data}"
)
return CommingMessage(
channel=MessageChannel.Discord,
return IncomingMessage(
channel=NotificationChannel.Discord,
source=client_config.name,
userid=userid,
username=username,
is_channel_admin=matches_channel_admin(
MessageChannel.Discord, client_config.config, userid
NotificationChannel.Discord, client_config.config, userid
),
text=f"CALLBACK:{callback_data}",
is_callback=True,
@@ -247,13 +247,13 @@ class DiscordModule(_ModuleBase, _MessageBase[Discord]):
f"images={len(images) if images else 0}, audios={len(audio_refs) if audio_refs else 0}, "
f"files={len(files) if files else 0}"
)
return CommingMessage(
channel=MessageChannel.Discord,
return IncomingMessage(
channel=NotificationChannel.Discord,
source=client_config.name,
userid=userid,
username=username,
is_channel_admin=matches_channel_admin(
MessageChannel.Discord, client_config.config, userid
NotificationChannel.Discord, client_config.config, userid
),
text=text,
chat_id=str(chat_id) if chat_id else None,
@@ -266,7 +266,7 @@ class DiscordModule(_ModuleBase, _MessageBase[Discord]):
@staticmethod
def _extract_images(
msg_json: dict,
) -> Optional[List[CommingMessage.MessageImage]]:
) -> Optional[List[IncomingMessage.MessageImage]]:
"""
从Discord消息中提取图片URL
"""
@@ -286,7 +286,7 @@ class DiscordModule(_ModuleBase, _MessageBase[Discord]):
or filename.endswith(DiscordModule._IMAGE_SUFFIXES)
):
images.append(
CommingMessage.MessageImage(
IncomingMessage.MessageImage(
ref=url,
name=attachment.get("filename"),
mime_type=attachment.get("content_type"),
@@ -317,7 +317,7 @@ class DiscordModule(_ModuleBase, _MessageBase[Discord]):
@classmethod
def _extract_files(
cls, msg_json: dict
) -> Optional[List[CommingMessage.MessageAttachment]]:
) -> Optional[List[IncomingMessage.MessageAttachment]]:
"""
从 Discord 消息中提取非图片/非音频文件。
"""
@@ -343,7 +343,7 @@ class DiscordModule(_ModuleBase, _MessageBase[Discord]):
if is_image or is_audio:
continue
files.append(
CommingMessage.MessageAttachment(
IncomingMessage.MessageAttachment(
ref=f"discord://file/{quote(url, safe='')}",
name=attachment.get("filename"),
mime_type=attachment.get("content_type"),
@@ -366,7 +366,7 @@ class DiscordModule(_ModuleBase, _MessageBase[Discord]):
return resp.content
return None
def post_message(self, message: Notification, **kwargs) -> None:
def post_message(self, message: Message, **kwargs) -> None:
"""
发送通知消息
:param message: 消息通知对象
@@ -441,7 +441,7 @@ class DiscordModule(_ModuleBase, _MessageBase[Discord]):
)
def post_medias_message(
self, message: Notification, medias: List[MediaInfo]
self, message: Message, medias: List[MediaInfo]
) -> None:
"""
发送媒体信息选择列表
@@ -464,7 +464,7 @@ class DiscordModule(_ModuleBase, _MessageBase[Discord]):
)
def post_torrents_message(
self, message: Notification, torrents: List[Context]
self, message: Message, torrents: List[Context]
) -> None:
"""
发送种子信息选择列表
@@ -488,7 +488,7 @@ class DiscordModule(_ModuleBase, _MessageBase[Discord]):
def delete_message(
self,
channel: MessageChannel,
channel: NotificationChannel,
source: str,
message_id: str,
chat_id: Optional[str] = None,
@@ -516,7 +516,7 @@ class DiscordModule(_ModuleBase, _MessageBase[Discord]):
def edit_message(
self,
channel: MessageChannel,
channel: NotificationChannel,
source: str,
message_id: Union[str, int],
chat_id: Union[str, int],
@@ -606,7 +606,7 @@ class DiscordModule(_ModuleBase, _MessageBase[Discord]):
def mark_message_processing_started(
self,
channel: MessageChannel,
channel: NotificationChannel,
source: str,
userid: Optional[Union[str, int]] = None,
message_id: Optional[Union[str, int]] = None,
@@ -642,7 +642,7 @@ class DiscordModule(_ModuleBase, _MessageBase[Discord]):
def mark_message_processing_finished(
self,
channel: MessageChannel,
channel: NotificationChannel,
source: str,
userid: Optional[Union[str, int]] = None,
message_id: Optional[Union[str, int]] = None,
@@ -667,7 +667,7 @@ class DiscordModule(_ModuleBase, _MessageBase[Discord]):
chat_id=str(target_chat_id) if target_chat_id else None,
)
def send_direct_message(self, message: Notification) -> Optional[MessageResponse]:
def send_direct_message(self, message: Message) -> Optional[MessageResponse]:
"""
直接发送消息并返回消息ID等信息
:param message: 消息体
@@ -716,7 +716,7 @@ class DiscordModule(_ModuleBase, _MessageBase[Discord]):
return MessageResponse(
message_id=str(message_id) if message_id else None,
chat_id=str(chat_id) if chat_id else None,
channel=MessageChannel.Discord,
channel=NotificationChannel.Discord,
source=conf.name,
success=True,
)
+8 -8
View File
@@ -13,16 +13,16 @@ from app.runtime.config import settings
from app.domain.context import MediaInfo, Context
from app.domain.metainfo import MetaInfo
from app.runtime.log import logger
from app.schemas.types import NotificationType
from app.schemas.types import MessageType
from app.foundation import size as size_tools
# Discord embed 字段解析白名单
# 只有这些消息类型会使用复杂的字段解析逻辑
PARSE_FIELD_TYPES = {
NotificationType.Download, # 资源下载
NotificationType.Organize, # 整理入库
NotificationType.Subscribe, # 订阅
NotificationType.Manual, # 手动处理
MessageType.Download, # 资源下载
MessageType.Organize, # 整理入库
MessageType.Subscribe, # 订阅
MessageType.Manual, # 手动处理
}
@@ -413,7 +413,7 @@ class Discord:
buttons: Optional[List[List[dict]]] = None,
original_message_id: Optional[Union[int, str]] = None,
original_chat_id: Optional[str] = None,
mtype: Optional["NotificationType"] = None,
mtype: Optional["MessageType"] = None,
) -> Optional[bool]:
logger.debug(
f"[Discord] send_msg 被调用: userid={userid}, title={title[:50] if title else None}..."
@@ -708,7 +708,7 @@ class Discord:
buttons: Optional[List[List[dict]]],
original_message_id: Optional[Union[int, str]],
original_chat_id: Optional[str],
mtype: Optional["NotificationType"] = None,
mtype: Optional["MessageType"] = None,
) -> Tuple[bool, Optional[Dict[str, str]]]:
logger.debug(
f"[Discord] _send_message: userid={userid}, original_chat_id={original_chat_id}"
@@ -887,7 +887,7 @@ class Discord:
text: Optional[str],
image: Optional[str],
link: Optional[str],
mtype: Optional["NotificationType"] = None,
mtype: Optional["MessageType"] = None,
) -> discord.Embed:
fields: List[Dict[str, str]] = []
desc_lines: List[str] = []