feat 清理无效的插件事件响应

This commit is contained in:
jxxghp 2023-10-12 12:48:40 +08:00
parent eb3c09a3d3
commit cbccac87f0
3 changed files with 27 additions and 18 deletions

View File

@ -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):
"""

View File

@ -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()}")

View File

@ -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: