diff --git a/astrbot/core/utils/session_waiter.py b/astrbot/core/utils/session_waiter.py index b327a61843..0f4b9fe50d 100644 --- a/astrbot/core/utils/session_waiter.py +++ b/astrbot/core/utils/session_waiter.py @@ -97,8 +97,8 @@ def filter(self, event: AstrMessageEvent) -> str: class DefaultSessionFilter(SessionFilter): def filter(self, event: AstrMessageEvent) -> str: - """默认实现,返回统一消息来源字符串作为会话标识符""" - return event.unified_msg_origin + """Return a session identifier scoped to the current sender and chat.""" + return f"{event.unified_msg_origin}:{event.get_sender_id()}" class SessionWaiter: diff --git a/tests/unit/test_session_waiter.py b/tests/unit/test_session_waiter.py new file mode 100644 index 0000000000..a9b8fb416b --- /dev/null +++ b/tests/unit/test_session_waiter.py @@ -0,0 +1,39 @@ +from unittest.mock import MagicMock + +from astrbot.core.utils.session_waiter import DefaultSessionFilter + + +def _event(umo: str, sender_id: str) -> MagicMock: + event = MagicMock() + event.unified_msg_origin = umo + event.get_sender_id.return_value = sender_id + return event + + +def test_default_filter_isolates_group_members() -> None: + session_filter = DefaultSessionFilter() + umo = "qq:GroupMessage:123" + + first_member = session_filter.filter(_event(umo, "user-1")) + second_member = session_filter.filter(_event(umo, "user-2")) + + assert first_member != second_member + + +def test_default_filter_keeps_same_sender_in_same_chat() -> None: + session_filter = DefaultSessionFilter() + umo = "qq:GroupMessage:123" + + first_message = session_filter.filter(_event(umo, "user-1")) + next_message = session_filter.filter(_event(umo, "user-1")) + + assert first_message == next_message + + +def test_default_filter_isolates_same_sender_across_chats() -> None: + session_filter = DefaultSessionFilter() + + first_chat = session_filter.filter(_event("qq:GroupMessage:123", "user-1")) + second_chat = session_filter.filter(_event("qq:GroupMessage:456", "user-1")) + + assert first_chat != second_chat