diff --git a/app/core/event.py b/app/core/event.py index da09bd0d..8b0eae2a 100644 --- a/app/core/event.py +++ b/app/core/event.py @@ -10,16 +10,13 @@ class EventManager(metaclass=Singleton): 事件管理器 """ - # 事件队列 - _eventQueue: Queue = None - # 事件响应函数字典 - _handlers: dict = {} - def __init__(self): # 事件队列 self._eventQueue = Queue() # 事件响应函数字典 self._handlers = {} + # 已禁用的事件响应 + self._disabled_handlers = [] def get_event(self): """ @@ -27,8 +24,12 @@ class EventManager(metaclass=Singleton): """ try: event = self._eventQueue.get(block=True, timeout=1) - handlerList = self._handlers.get(event.event_type) - return event, handlerList or [] + handlerList = self._handlers.get(event.event_type) or [] + if handlerList: + # 去除掉被禁用的事件响应 + handlerList = [handler for handler in handlerList + if handler.__qualname__.split(".")[0] not in self._disabled_handlers] + return event, handlerList except Empty: return None, [] @@ -51,18 +52,21 @@ class EventManager(metaclass=Singleton): handlerList.append(handler) logger.debug(f"Event Registed:{etype.value} - {handler}") - def remove_event_listener(self, etype: EventType, handler: type): + def disable_events_hander(self, class_name: str): """ - 移除监听器的处理函数 + 标记对应类事件处理为不可用 """ - try: - handlerList = self._handlers[etype.value] - if handler in handlerList[:]: - handlerList.remove(handler) - if not handlerList: - del self._handlers[etype.value] - except KeyError: - pass + if class_name not in self._disabled_handlers: + self._disabled_handlers.append(class_name) + logger.debug(f"Event Disabled:{class_name}") + + def enable_events_hander(self, class_name: str): + """ + 标记对应类事件处理为可用 + """ + if class_name in self._disabled_handlers: + self._disabled_handlers.remove(class_name) + logger.debug(f"Event Enabled:{class_name}") def send_event(self, etype: EventType, data: dict = None): """ diff --git a/app/core/plugin.py b/app/core/plugin.py index 3bbbe0fb..42f08f52 100644 --- a/app/core/plugin.py +++ b/app/core/plugin.py @@ -1,6 +1,7 @@ import traceback from typing import List, Any, Dict, Tuple +from app.core.event import eventmanager from app.db.systemconfig_oper import SystemConfigOper from app.helper.module import ModuleHelper from app.helper.sites import SitesHelper @@ -58,6 +59,8 @@ class PluginManager(metaclass=Singleton): self._plugins[plugin_id] = plugin # 未安装的不加载 if plugin_id not in installed_plugins: + # 设置事件状态为不可用 + eventmanager.disable_events_hander(plugin_id) continue # 生成实例 plugin_obj = plugin() @@ -66,6 +69,8 @@ class PluginManager(metaclass=Singleton): # 存储运行实例 self._running_plugins[plugin_id] = plugin_obj logger.info(f"Plugin Loaded:{plugin_id}") + # 设置事件注册状态可用 + eventmanager.enable_events_hander(plugin_id) except Exception as err: logger.error(f"加载插件 {plugin_id} 出错:{err} - {traceback.format_exc()}") diff --git a/app/plugins/chatgpt/__init__.py b/app/plugins/chatgpt/__init__.py index 44e51731..f094c911 100644 --- a/app/plugins/chatgpt/__init__.py +++ b/app/plugins/chatgpt/__init__.py @@ -198,7 +198,7 @@ class ChatGPT(_PluginBase): title = event.event_data.get("title") if not title: return - # 收到事件后需要立码返回 + # 收到事件后需要立码返回,避免主程序等待 if not self._enabled \ or not self.openai \ or not self._recognize: