From 88eb5cd40d6e952d746e73e79443956a91c24657 Mon Sep 17 00:00:00 2001 From: UnCLAS-Prommer Date: Wed, 17 Sep 2025 16:17:35 +0800 Subject: [PATCH] =?UTF-8?q?events=E7=B3=BB=E7=BB=9F=E5=A4=A7=E4=BD=93?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/hello_world_plugin/plugin.py | 17 +++++++- .../message_receive/uni_message_sender.py | 41 +++++++++++++++++++ src/plugin_system/base/component_types.py | 1 + 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/plugins/hello_world_plugin/plugin.py b/plugins/hello_world_plugin/plugin.py index 7fb897fa..4be16968 100644 --- a/plugins/hello_world_plugin/plugin.py +++ b/plugins/hello_world_plugin/plugin.py @@ -151,7 +151,7 @@ class PrintMessage(BaseEventHandler): class ForwardMessages(BaseEventHandler): """ 把接收到的消息转发到指定聊天ID - + 此组件是HYBRID消息和FORWARD消息的使用示例。 每收到10条消息,就会以1%的概率使用HYBRID消息转发,否则使用FORWARD消息转发。 """ @@ -177,11 +177,23 @@ class ForwardMessages(BaseEventHandler): if random.random() < 0.01: success = await self.send_hybrid(stream_id, [(ReplyContentType.TEXT, msg) for msg in self.messages]) else: - success = await self.send_forward(stream_id, [(str(global_config.bot.qq_account), str(global_config.bot.nickname), [(ReplyContentType.TEXT, msg)]) for msg in self.messages]) + success = await self.send_forward( + stream_id, + [ + ( + str(global_config.bot.qq_account), + str(global_config.bot.nickname), + [(ReplyContentType.TEXT, msg)], + ) + for msg in self.messages + ], + ) if not success: raise ValueError("转发消息失败") self.messages = [] return True, True, None, None, None + + class RandomEmojis(BaseCommand): command_name = "random_emojis" command_description = "发送多张随机表情包" @@ -203,6 +215,7 @@ class RandomEmojis(BaseCommand): success = await self.send_forward([("0", "神秘用户", [(ReplyContentType.IMAGE, img)]) for img in images]) return (True, "已发送随机表情包", True) if success else (False, "发送随机表情包失败", False) + # ===== 插件注册 ===== diff --git a/src/chat/message_receive/uni_message_sender.py b/src/chat/message_receive/uni_message_sender.py index 7a71c58c..5a8ae022 100644 --- a/src/chat/message_receive/uni_message_sender.py +++ b/src/chat/message_receive/uni_message_sender.py @@ -2,6 +2,7 @@ import asyncio import traceback from rich.traceback import install +from maim_message import Seg from src.common.message.api import get_global_api from src.common.logger import get_logger @@ -66,8 +67,36 @@ class UniversalMessageSender: message.build_reply() logger.debug(f"[{chat_id}] 选择回复引用消息: {message.processed_plain_text[:20]}...") + from src.plugin_system.core.events_manager import events_manager + from src.plugin_system.base.component_types import EventType + + continue_flag, modified_message = await events_manager.handle_mai_events( + EventType.POST_SEND_PRE_PROCESS, message=message, stream_id=chat_id + ) + if not continue_flag: + logger.info(f"[{chat_id}] 消息发送被插件取消: {str(message.message_segment)[:100]}...") + return False + if modified_message: + if modified_message._modify_flags.modify_message_segments: + message.message_segment = Seg(type="seglist", data=modified_message.message_segments) + if modified_message._modify_flags.modify_plain_text: + logger.warning(f"[{chat_id}] 插件修改了消息的纯文本内容,可能导致此内容被覆盖。") + message.processed_plain_text = modified_message.plain_text + await message.process() + continue_flag, modified_message = await events_manager.handle_mai_events( + EventType.POST_SEND, message=message, stream_id=chat_id + ) + if not continue_flag: + logger.info(f"[{chat_id}] 消息发送被插件取消: {str(message.message_segment)[:100]}...") + return False + if modified_message: + if modified_message._modify_flags.modify_message_segments: + message.message_segment = Seg(type="seglist", data=modified_message.message_segments) + if modified_message._modify_flags.modify_plain_text: + message.processed_plain_text = modified_message.plain_text + if typing: typing_time = calculate_typing_time( input_string=message.processed_plain_text, @@ -80,6 +109,18 @@ class UniversalMessageSender: if not sent_msg: return False + continue_flag, modified_message = await events_manager.handle_mai_events( + EventType.AFTER_SEND, message=message, stream_id=chat_id + ) + if not continue_flag: + logger.info(f"[{chat_id}] 消息发送后续处理被插件取消: {str(message.message_segment)[:100]}...") + return True + if modified_message: + if modified_message._modify_flags.modify_message_segments: + message.message_segment = Seg(type="seglist", data=modified_message.message_segments) + if modified_message._modify_flags.modify_plain_text: + message.processed_plain_text = modified_message.plain_text + if storage_message: await self.storage.store_message(message, message.chat_stream) diff --git a/src/plugin_system/base/component_types.py b/src/plugin_system/base/component_types.py index 6c073ae9..963b274f 100644 --- a/src/plugin_system/base/component_types.py +++ b/src/plugin_system/base/component_types.py @@ -67,6 +67,7 @@ class EventType(Enum): ON_PLAN = "on_plan" POST_LLM = "post_llm" AFTER_LLM = "after_llm" + POST_SEND_PRE_PROCESS = "post_send_pre_process" POST_SEND = "post_send" AFTER_SEND = "after_send" UNKNOWN = "unknown" # 未知事件类型