3597726aad
* fix(core): terminate active events on reset/new/del to prevent stale responses Closes #5222 * style: fix import sorting in scheduler.py
51 lines
1.4 KiB
Python
51 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
from collections import defaultdict
|
|
from typing import TYPE_CHECKING
|
|
|
|
if TYPE_CHECKING:
|
|
from astrbot.core.platform import AstrMessageEvent
|
|
|
|
|
|
class ActiveEventRegistry:
|
|
"""维护 unified_msg_origin 到活跃事件的映射。
|
|
|
|
用于在 reset 等场景下终止该会话正在处理的事件。
|
|
"""
|
|
|
|
def __init__(self) -> None:
|
|
self._events: dict[str, set[AstrMessageEvent]] = defaultdict(set)
|
|
|
|
def register(self, event: AstrMessageEvent) -> None:
|
|
self._events[event.unified_msg_origin].add(event)
|
|
|
|
def unregister(self, event: AstrMessageEvent) -> None:
|
|
umo = event.unified_msg_origin
|
|
self._events[umo].discard(event)
|
|
if not self._events[umo]:
|
|
del self._events[umo]
|
|
|
|
def stop_all(
|
|
self,
|
|
umo: str,
|
|
exclude: AstrMessageEvent | None = None,
|
|
) -> int:
|
|
"""终止指定 UMO 的所有活跃事件。
|
|
|
|
Args:
|
|
umo: 统一消息来源标识符。
|
|
exclude: 需要排除的事件(通常是发起 reset 的事件本身)。
|
|
|
|
Returns:
|
|
被终止的事件数量。
|
|
"""
|
|
count = 0
|
|
for event in list(self._events.get(umo, [])):
|
|
if event is not exclude:
|
|
event.stop_event()
|
|
count += 1
|
|
return count
|
|
|
|
|
|
active_event_registry = ActiveEventRegistry()
|