perf: 群聊第一个消息段是 At 消息,但不是 At 机器人或 At 全体成员,则不唤醒
This commit is contained in:
@@ -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()
|
||||
event.stop_event()
|
||||
|
||||
Reference in New Issue
Block a user