From c501728204db711d0c07ff008f21d4a2578b386d Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Wed, 28 May 2025 00:23:02 +0800 Subject: [PATCH 1/2] fix: plugin priority fixes: #1662 --- .../platform/sources/telegram/tg_adapter.py | 2 +- astrbot/core/star/star_handler.py | 59 ++++--------------- 2 files changed, 13 insertions(+), 48 deletions(-) diff --git a/astrbot/core/platform/sources/telegram/tg_adapter.py b/astrbot/core/platform/sources/telegram/tg_adapter.py index b13b60d7d..0f66ef15b 100644 --- a/astrbot/core/platform/sources/telegram/tg_adapter.py +++ b/astrbot/core/platform/sources/telegram/tg_adapter.py @@ -145,7 +145,7 @@ class TelegramPlatformAdapter(Platform): skip_commands = {"start"} for handler_md in star_handlers_registry._handlers: - handler_metadata = handler_md[1] + handler_metadata = handler_md if not star_map[handler_metadata.handler_module_path].activated: continue for event_filter in handler_metadata.event_filters: diff --git a/astrbot/core/star/star_handler.py b/astrbot/core/star/star_handler.py index 0764f15f6..d375091e5 100644 --- a/astrbot/core/star/star_handler.py +++ b/astrbot/core/star/star_handler.py @@ -1,6 +1,5 @@ from __future__ import annotations import enum -import heapq from dataclasses import dataclass, field from typing import Awaitable, List, Dict, TypeVar, Generic from .filter import HandlerFilter @@ -8,100 +7,66 @@ from .star import star_map T = TypeVar("T", bound="StarHandlerMetadata") - class StarHandlerRegistry(Generic[T]): - """用于存储所有的 Star Handler""" - - star_handlers_map: Dict[str, StarHandlerMetadata] = {} - """用于快速查找。key 是 handler_full_name""" - _handlers = [] + def __init__(self): + self.star_handlers_map: Dict[str, StarHandlerMetadata] = {} + self._handlers: List[StarHandlerMetadata] = [] def append(self, handler: StarHandlerMetadata): - """添加一个 Handler""" + """添加一个 Handler,并保持按优先级有序""" if "priority" not in handler.extras_configs: handler.extras_configs["priority"] = 0 - heapq.heappush(self._handlers, (-handler.extras_configs["priority"], handler)) self.star_handlers_map[handler.handler_full_name] = handler + self._handlers.append(handler) + self._handlers.sort(key=lambda h: -h.extras_configs["priority"]) def _print_handlers(self): - """打印所有的 Handler""" - for _, handler in self._handlers: + for handler in self._handlers: print(handler.handler_full_name) def get_handlers_by_event_type( self, event_type: EventType, only_activated=True, platform_id=None ) -> List[StarHandlerMetadata]: - """通过事件类型获取 Handler - - Args: - event_type: 事件类型 - only_activated: 是否只返回已激活的插件的处理器 - platform_id: 平台ID,如果提供此参数,将过滤掉在此平台不兼容的处理器 - - Returns: - List[StarHandlerMetadata]: 处理器列表 - """ handlers = [] - for _, handler in self._handlers: + for handler in self._handlers: if handler.event_type != event_type: continue - - # 只激活的插件处理器 if only_activated: plugin = star_map.get(handler.handler_module_path) if not (plugin and plugin.activated): continue - - # 平台兼容性过滤 if platform_id and event_type != EventType.OnAstrBotLoadedEvent: if not handler.is_enabled_for_platform(platform_id): continue - handlers.append(handler) - return handlers def get_handler_by_full_name(self, full_name: str) -> StarHandlerMetadata: - """通过 Handler 的全名获取 Handler""" return self.star_handlers_map.get(full_name, None) def get_handlers_by_module_name( self, module_name: str ) -> List[StarHandlerMetadata]: - """通过模块名获取 Handler""" return [ - handler - for _, handler in self._handlers + handler for handler in self._handlers if handler.handler_module_path == module_name ] def clear(self): - """清空所有的 Handler""" self.star_handlers_map.clear() self._handlers.clear() def remove(self, handler: StarHandlerMetadata): - """删除一个 Handler""" - # self._handlers.remove(handler) - for i, h in enumerate(self._handlers): - if h[1] == handler: - self._handlers.pop(i) - break - try: - del self.star_handlers_map[handler.handler_full_name] - except KeyError: - pass + self.star_handlers_map.pop(handler.handler_full_name, None) + self._handlers = [h for h in self._handlers if h != handler] def __iter__(self): - """使 StarHandlerRegistry 支持迭代""" - return (handler for _, handler in self._handlers) + return iter(self._handlers) def __len__(self): - """返回 Handler 的数量""" return len(self._handlers) - star_handlers_registry = StarHandlerRegistry() From 52a4c986a8498fc7611cfefe6b7ef2b711955045 Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Wed, 28 May 2025 00:31:04 +0800 Subject: [PATCH 2/2] fix: update star_handlers_registry iteration in TelegramPlatformAdapter --- astrbot/core/platform/sources/telegram/tg_adapter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/astrbot/core/platform/sources/telegram/tg_adapter.py b/astrbot/core/platform/sources/telegram/tg_adapter.py index 0f66ef15b..c6fc56b93 100644 --- a/astrbot/core/platform/sources/telegram/tg_adapter.py +++ b/astrbot/core/platform/sources/telegram/tg_adapter.py @@ -144,7 +144,7 @@ class TelegramPlatformAdapter(Platform): command_dict = {} skip_commands = {"start"} - for handler_md in star_handlers_registry._handlers: + for handler_md in star_handlers_registry: handler_metadata = handler_md if not star_map[handler_metadata.handler_module_path].activated: continue