From 6a2a871e655eae7d8975f6b49708d773f7b471d5 Mon Sep 17 00:00:00 2001 From: Qixuan112 <3573568193@qq.com> Date: Tue, 28 Jul 2026 10:35:09 +0800 Subject: [PATCH 1/2] fix(session_waiter): bind empty-mention waiter to the initiating sender to avoid intercepting other group members (#9377) --- astrbot/builtin_stars/astrbot/main.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/astrbot/builtin_stars/astrbot/main.py b/astrbot/builtin_stars/astrbot/main.py index e0053a29de..accb122856 100644 --- a/astrbot/builtin_stars/astrbot/main.py +++ b/astrbot/builtin_stars/astrbot/main.py @@ -13,6 +13,7 @@ FILTERS, USER_SESSIONS, SessionController, + SessionFilter, SessionWaiter, session_waiter, ) @@ -109,6 +110,10 @@ async def handle_empty_mention(self, event: AstrMessageEvent): logger.error(f"LLM response failed: {e!s}") yield event.plain_result("想要问什么呢?😄") + class _SenderSessionFilter(SessionFilter): + def filter(self, ev: AstrMessageEvent) -> str: + return f"{ev.unified_msg_origin}:{ev.get_sender_id()}" + @session_waiter(60) async def empty_mention_waiter( controller: SessionController, @@ -126,7 +131,7 @@ async def empty_mention_waiter( controller.stop() try: - await empty_mention_waiter(event) + await empty_mention_waiter(event, session_filter=_SenderSessionFilter()) except TimeoutError: pass except Exception as e: From dfd6c00183702064a5dec98e9a014269e594183e Mon Sep 17 00:00:00 2001 From: Qixuan112 <3573568193@qq.com> Date: Tue, 28 Jul 2026 10:41:26 +0800 Subject: [PATCH 2/2] refactor: move _SenderSessionFilter to module scope and guard against empty sender_id --- astrbot/builtin_stars/astrbot/main.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/astrbot/builtin_stars/astrbot/main.py b/astrbot/builtin_stars/astrbot/main.py index accb122856..d9f18a4bba 100644 --- a/astrbot/builtin_stars/astrbot/main.py +++ b/astrbot/builtin_stars/astrbot/main.py @@ -28,6 +28,22 @@ def _iter_message_components(event: AstrMessageEvent): return tuple(messages) +class _SenderSessionFilter(SessionFilter): + """Session filter scoped to a specific (conversation, sender) pair. + + Used by the empty-mention waiter so that only the user who initiated the + empty mention (not every member of the group) can satisfy the waiter. + """ + + def filter(self, ev: AstrMessageEvent) -> str: + sender_id = ev.get_sender_id() or "" + if not sender_id: + # Fall back to a value that will not accidentally collide with a + # legitimate session key from another member. + sender_id = "__unknown_sender__" + return f"{ev.unified_msg_origin}:{sender_id}" + + class Main(star.Star): def __init__(self, context: star.Context) -> None: self.context = context @@ -110,10 +126,6 @@ async def handle_empty_mention(self, event: AstrMessageEvent): logger.error(f"LLM response failed: {e!s}") yield event.plain_result("想要问什么呢?😄") - class _SenderSessionFilter(SessionFilter): - def filter(self, ev: AstrMessageEvent) -> str: - return f"{ev.unified_msg_origin}:{ev.get_sender_id()}" - @session_waiter(60) async def empty_mention_waiter( controller: SessionController,