From e45c48b9986efcd74a21f643ce25b18d36584cb4 Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Wed, 11 Dec 2024 15:23:38 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E7=BE=A4=E8=81=8A=E7=AC=AC=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=B6=88=E6=81=AF=E6=AE=B5=E6=98=AF=20At=20=E6=B6=88?= =?UTF-8?q?=E6=81=AF=EF=BC=8C=E4=BD=86=E4=B8=8D=E6=98=AF=20At=20=E6=9C=BA?= =?UTF-8?q?=E5=99=A8=E4=BA=BA=E6=88=96=20At=20=E5=85=A8=E4=BD=93=E6=88=90?= =?UTF-8?q?=E5=91=98=EF=BC=8C=E5=88=99=E4=B8=8D=E5=94=A4=E9=86=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/pipeline/waking_check/stage.py | 74 +++++++++++++-------- 1 file changed, 48 insertions(+), 26 deletions(-) diff --git a/astrbot/core/pipeline/waking_check/stage.py b/astrbot/core/pipeline/waking_check/stage.py index 739d9de18..f27700318 100644 --- a/astrbot/core/pipeline/waking_check/stage.py +++ b/astrbot/core/pipeline/waking_check/stage.py @@ -7,42 +7,56 @@ from astrbot.core.message.components import At from astrbot.core.star.star_handler import star_handlers_registry from astrbot.core.star.filter.command_group import CommandGroupFilter + @register_stage class WakingCheckStage(Stage): - '''检查是否需要唤醒。唤醒机器人有如下几点条件: - + """检查是否需要唤醒。唤醒机器人有如下几点条件: + 1. 机器人被 @ 了 2. 机器人的消息被提到了 - 3. 以 wake_prefix 前缀开头 + 3. 以 wake_prefix 前缀开头,并且消息没有以 At 消息段开头 4. 插件(Star)的 handler filter 通过 - 5. 私聊情况下,位于 admins_id 列表中的管理员的消息 - ''' + 5. 私聊情况下,位于 admins_id 列表中的管理员的消息(在白名单阶段中) + """ async def initialize(self, ctx: PipelineContext) -> None: self.ctx = ctx - async def process(self, event: AstrMessageEvent) -> Union[None, AsyncGenerator[None, None]]: + async def process( + self, event: AstrMessageEvent + ) -> Union[None, AsyncGenerator[None, None]]: # 设置 sender 身份 event.message_str = event.message_str.strip() - for admin_id in self.ctx.astrbot_config['admins_id']: + for admin_id in self.ctx.astrbot_config["admins_id"]: if event.get_sender_id() == admin_id: event.role = "admin" break # 检查 wake - wake_prefixes = self.ctx.astrbot_config['wake_prefix'] + wake_prefixes = self.ctx.astrbot_config["wake_prefix"] messages = event.get_messages() is_wake = False for wake_prefix in wake_prefixes: if event.message_str.startswith(wake_prefix): + if ( + not event.is_private_chat() + and isinstance(messages[0], At) + and str(messages[0].qq) != str(event.get_self_id()) + and str(messages[0].qq) != "all" + ): + # 如果是群聊,且第一个消息段是 At 消息,但不是 At 机器人或 At 全体成员,则不唤醒 + break is_wake = True event.is_wake = True - event.message_str = event.message_str[len(wake_prefix):].strip() + event.message_str = event.message_str[len(wake_prefix) :].strip() break if not is_wake: # 检查是否有 at 消息 for message in messages: - if isinstance(message, At) and (str(message.qq) == str(event.get_self_id()) or str(message.qq) == "all"): + if isinstance(message, At) and ( + str(message.qq) == str(event.get_self_id()) + or str(message.qq) == "all" + ): is_wake = True event.is_wake = True wake_prefix = "" @@ -52,28 +66,30 @@ class WakingCheckStage(Stage): is_wake = True event.is_wake = True wake_prefix = "" - + # 检查插件的 handler filter activated_handlers = [] - handlers_parsed_params = {} # 注册了指令的 handler + handlers_parsed_params = {} # 注册了指令的 handler for handler in star_handlers_registry: # filter 需要满足 AND 的逻辑关系 passed = True child_command_handler_md = None - + if len(handler.event_filters) == 0: # 不可能有这种情况, 也不允许有这种情况 continue - + for filter in handler.event_filters: try: if isinstance(filter, CommandGroupFilter): - '''如果指令组过滤成功, 会返回叶子指令的 StarHandlerMetadata''' - ok, child_command_handler_md = filter.filter(event, self.ctx.astrbot_config) + """如果指令组过滤成功, 会返回叶子指令的 StarHandlerMetadata""" + ok, child_command_handler_md = filter.filter( + event, self.ctx.astrbot_config + ) if not ok: passed = False else: - handler = child_command_handler_md # handler 覆盖 + handler = child_command_handler_md # handler 覆盖 break else: if not filter.filter(event, self.ctx.astrbot_config): @@ -82,7 +98,11 @@ class WakingCheckStage(Stage): except Exception as e: # event.set_result(MessageEventResult().message(f"插件 {handler.handler_full_name} 报错:{e}")) # yield - await event.send(MessageEventResult().message(f"插件 {handler.handler_full_name} 报错:{e}")) + await event.send( + MessageEventResult().message( + f"插件 {handler.handler_full_name} 报错:{e}" + ) + ) event.stop_event() passed = False break @@ -90,14 +110,16 @@ class WakingCheckStage(Stage): if passed: is_wake = True event.is_wake = True - - activated_handlers.append(handler) - if 'parsed_params' in event.get_extra(): - handlers_parsed_params[handler.handler_full_name] = event.get_extra('parsed_params') + + activated_handlers.append(handler) + if "parsed_params" in event.get_extra(): + handlers_parsed_params[handler.handler_full_name] = event.get_extra( + "parsed_params" + ) event.clear_extra() - event.set_extra('activated_handlers', activated_handlers) - event.set_extra('handlers_parsed_params', handlers_parsed_params) - + event.set_extra("activated_handlers", activated_handlers) + event.set_extra("handlers_parsed_params", handlers_parsed_params) + if not is_wake: - event.stop_event() \ No newline at end of file + event.stop_event()