From b06795510ad089958b805f922745c017035b35fb Mon Sep 17 00:00:00 2001 From: jxxghp Date: Fri, 5 Jan 2024 08:12:27 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E6=8F=92=E4=BB=B6=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=B3=A8=E5=86=8C=E5=85=AC=E5=85=B1=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/plugin.py | 20 ++++++++++++++++++++ app/plugins/__init__.py | 17 +++++++++++++++-- app/scheduler.py | 22 ++++++++++++++++++++++ 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/app/core/plugin.py b/app/core/plugin.py index 8d34ac07..14047274 100644 --- a/app/core/plugin.py +++ b/app/core/plugin.py @@ -213,6 +213,26 @@ class PluginManager(metaclass=Singleton): ret_apis.extend(apis) return ret_apis + def get_plugin_services(self) -> List[Dict[str, Any]]: + """ + 获取插件服务 + [{ + "id": "服务ID", + "name": "服务名称", + "trigger": "触发器:cron、interval、date、CronTrigger.from_crontab()", + "func": self.xxx, + "kwagrs": {} # 定时器参数 + }] + """ + ret_services = [] + for pid, plugin in self._running_plugins.items(): + if hasattr(plugin, "get_service") \ + and ObjectUtils.check_method(plugin.get_service): + services = plugin.get_service() + if services: + ret_services.extend(services) + return ret_services + def run_plugin_method(self, pid: str, method: str, *args, **kwargs) -> Any: """ 运行插件方法 diff --git a/app/plugins/__init__.py b/app/plugins/__init__.py index 40a7b708..ef90fc82 100644 --- a/app/plugins/__init__.py +++ b/app/plugins/__init__.py @@ -57,7 +57,7 @@ class _PluginBase(metaclass=ABCMeta): @abstractmethod def get_command() -> List[Dict[str, Any]]: """ - 获取插件命令 + 注册插件远程命令 [{ "cmd": "/xx", "event": EventType.xx, @@ -71,7 +71,7 @@ class _PluginBase(metaclass=ABCMeta): @abstractmethod def get_api(self) -> List[Dict[str, Any]]: """ - 获取插件API + 注册插件API [{ "path": "/xx", "endpoint": self.xxx, @@ -82,6 +82,19 @@ class _PluginBase(metaclass=ABCMeta): """ pass + def get_service(self) -> List[Dict[str, Any]]: + """ + 注册插件公共服务 + [{ + “id”: “服务ID”, + "name": "服务名称", + "trigger": "触发器:cron/interval/date/CronTrigger.from_crontab()", + "func": self.xxx, + "kwargs": {} # 定时器参数 + }] + """ + pass + @abstractmethod def get_form(self) -> Tuple[List[dict], Dict[str, Any]]: """ diff --git a/app/scheduler.py b/app/scheduler.py index 656438c0..a0bd9798 100644 --- a/app/scheduler.py +++ b/app/scheduler.py @@ -16,6 +16,7 @@ from app.chain.tmdb import TmdbChain from app.chain.torrents import TorrentsChain from app.chain.transfer import TransferChain from app.core.config import settings +from app.core.plugin import PluginManager from app.log import logger from app.utils.singleton import Singleton from app.utils.timer import TimerUtils @@ -227,6 +228,27 @@ class Scheduler(metaclass=Singleton): } ) + # 注册插件公共服务 + plugin_services = PluginManager().get_plugin_services() + for service in plugin_services: + try: + self._jobs[service["id"]] = { + "func": service["func"], + "running": False, + } + self._scheduler.add_job( + self.start, + service["trigger"], + id=service["id"], + name=service["name"], + **service["kwargs"], + kwargs={ + 'job_id': service["id"] + } + ) + except Exception as e: + logger.error(f"注册插件服务失败:{str(e)} - {service}") + # 打印服务 logger.debug(self._scheduler.print_jobs())