feat:支持插件协持系统模块实现

This commit is contained in:
jxxghp
2025-05-01 11:03:28 +08:00
parent f46e2acd56
commit 9d333b855c
3 changed files with 88 additions and 3 deletions
+48 -3
View File
@@ -14,6 +14,7 @@ from app.core.context import Context, MediaInfo, TorrentInfo
from app.core.event import EventManager from app.core.event import EventManager
from app.core.meta import MetaBase from app.core.meta import MetaBase
from app.core.module import ModuleManager from app.core.module import ModuleManager
from app.core.plugin import PluginManager
from app.db.message_oper import MessageOper from app.db.message_oper import MessageOper
from app.db.user_oper import UserOper from app.db.user_oper import UserOper
from app.helper.message import MessageHelper, MessageQueueManager from app.helper.message import MessageHelper, MessageQueueManager
@@ -42,6 +43,7 @@ class ChainBase(metaclass=ABCMeta):
send_callback=self.run_module send_callback=self.run_module
) )
self.useroper = UserOper() self.useroper = UserOper()
self.pluginmanager = PluginManager()
@staticmethod @staticmethod
def load_cache(filename: str) -> Any: def load_cache(filename: str) -> Any:
@@ -97,7 +99,50 @@ class ChainBase(metaclass=ABCMeta):
return ret is None return ret is None
result = None result = None
logger.debug(f"请求模块执行:{method} ...") plugin_modules = self.pluginmanager.get_plugin_modules()
# 插件模块
for plugin, module_dict in plugin_modules.items():
plugin_id, plugin_name = plugin
if method in module_dict:
func = module_dict[method]
if func:
try:
logger.info(f"请求插件 {plugin_name} 执行:{method} ...")
if is_result_empty(result):
# 返回None,第一次执行或者需继续执行下一模块
result = func(*args, **kwargs)
elif isinstance(result, list):
# 返回为列表,有多个模块运行结果时进行合并
temp = func(*args, **kwargs)
if isinstance(temp, list):
result.extend(temp)
else:
break
except Exception as err:
if kwargs.get("raise_exception"):
raise
logger.error(
f"运行插件 {plugin_id} 模块 {method} 出错:{str(err)}\n{traceback.format_exc()}")
self.messagehelper.put(title=f"{plugin_name} 发生了错误",
message=str(err),
role="plugin")
self.eventmanager.send_event(
EventType.SystemError,
{
"type": "plugin",
"plugin_id": plugin_id,
"plugin_name": plugin_name,
"plugin_method": method,
"error": str(err),
"traceback": traceback.format_exc()
}
)
if not is_result_empty(result):
# 如果插件模块返回结果,则不再执行系统模块
return result
# 系统模块
logger.debug(f"请求系统模块执行:{method} ...")
modules = self.modulemanager.get_running_modules(method) modules = self.modulemanager.get_running_modules(method)
# 按优先级排序 # 按优先级排序
modules = sorted(modules, key=lambda x: x.get_priority()) modules = sorted(modules, key=lambda x: x.get_priority())
@@ -114,10 +159,10 @@ class ChainBase(metaclass=ABCMeta):
# 返回None,第一次执行或者需继续执行下一模块 # 返回None,第一次执行或者需继续执行下一模块
result = func(*args, **kwargs) result = func(*args, **kwargs)
elif ObjectUtils.check_signature(func, result): elif ObjectUtils.check_signature(func, result):
# 返回结果与方法签名一致,将结果传入(不能多个模块同时运行的需要通过开关控制) # 返回结果与方法签名一致,将结果传入
result = func(result) result = func(result)
elif isinstance(result, list): elif isinstance(result, list):
# 返回为列表,有多个模块运行结果时进行合并(不能多个模块同时运行的需要通过开关控制) # 返回为列表,有多个模块运行结果时进行合并
temp = func(*args, **kwargs) temp = func(*args, **kwargs)
if isinstance(temp, list): if isinstance(temp, list):
result.extend(temp) result.extend(temp)
+23
View File
@@ -558,6 +558,29 @@ class PluginManager(metaclass=Singleton):
logger.error(f"获取插件 {plugin_id} 服务出错:{str(e)}") logger.error(f"获取插件 {plugin_id} 服务出错:{str(e)}")
return ret_services return ret_services
def get_plugin_modules(self, pid: Optional[str] = None) -> Dict[tuple, Dict[str, Any]]:
"""
获取插件模块
{
plugin_id: {
method: function
}
}
"""
ret_modules = {}
for plugin_id, plugin in self._running_plugins.items():
if pid and pid != plugin_id:
continue
if hasattr(plugin, "get_module") and ObjectUtils.check_method(plugin.get_module):
try:
if not plugin.get_state():
continue
plugin_module = plugin.get_module() or []
ret_modules[(plugin_id, plugin.get_name())] = plugin_module
except Exception as e:
logger.error(f"获取插件 {plugin_id} 模块出错:{str(e)}")
return ret_modules
def get_plugin_dashboard_meta(self): def get_plugin_dashboard_meta(self):
""" """
获取所有插件仪表盘元信息 获取所有插件仪表盘元信息
+17
View File
@@ -55,6 +55,13 @@ class _PluginBase(metaclass=ABCMeta):
""" """
pass pass
def get_name(self) -> str:
"""
获取插件名称
:return: 插件名称
"""
return self.plugin_name
@abstractmethod @abstractmethod
def get_state(self) -> bool: def get_state(self) -> bool:
""" """
@@ -155,6 +162,16 @@ class _PluginBase(metaclass=ABCMeta):
""" """
pass pass
def get_module(self) -> Dict[str, Any]:
"""
获取插件模块声明,用于协持系统模块实现(方法名:方法实现)
{
"id1": self.xxx1,
"id2": self.xxx2,
}
"""
pass
@abstractmethod @abstractmethod
def stop_service(self): def stop_service(self):
""" """