This commit is contained in:
jxxghp
2023-06-06 07:15:17 +08:00
commit 4d06f86e62
217 changed files with 13959 additions and 0 deletions

104
app/plugins/__init__.py Normal file
View File

@ -0,0 +1,104 @@
from abc import ABCMeta, abstractmethod
from pathlib import Path
from typing import Any
from app.core import settings
from app.db.systemconfigs import SystemConfigs
class _PluginBase(metaclass=ABCMeta):
"""
插件模块基类,通过继续该类实现插件功能
除内置属性外,还有以下方法可以扩展或调用:
- get_fields() 获取配置字典,用于生成插件配置表单
- get_state() 获取插件启用状态,用于展示运行状态
- stop_service() 停止插件服务
- get_config() 获取配置信息
- update_config() 更新配置信息
- init_config() 生效配置信息
- get_page() 插件额外页面数据,在插件配置页面左下解按钮展示
- get_script() 插件额外脚本Javascript将会写入插件页面可在插件元素中绑定使用XX_PluginInit为初始化函数
- get_data_path() 获取插件数据保存目录
- get_command() 获取插件命令,使用消息机制通过远程控制
"""
# 插件名称
plugin_name: str = ""
# 插件描述
plugin_desc: str = ""
# 插件图标
plugin_icon: str = ""
# 主题色
plugin_color: str = ""
# 插件版本
plugin_version: str = "1.0"
# 插件作者
plugin_author: str = ""
# 作者主页
author_url: str = ""
# 插件配置项ID前缀为了避免各插件配置表单相冲突配置表单元素ID自动在前面加上此前缀
plugin_config_prefix: str = "plugin_"
# 显示顺序
plugin_order: int = 0
# 可使用的用户级别
auth_level: int = 1
@staticmethod
@abstractmethod
def get_fields() -> dict:
"""
获取配置字典,用于生成表单
"""
pass
@abstractmethod
def get_state(self) -> bool:
"""
获取插件启用状态
"""
pass
@abstractmethod
def init_plugin(self, config: dict = None):
"""
生效配置信息
:param config: 配置信息字典
"""
pass
@abstractmethod
def stop_service(self):
"""
停止插件
"""
pass
def update_config(self, config: dict, plugin_id: str = None) -> bool:
"""
更新配置信息
:param config: 配置信息字典
:param plugin_id: 插件ID
"""
if not plugin_id:
plugin_id = self.__class__.__name__
return SystemConfigs().set(f"plugin.{plugin_id}", config)
def get_config(self, plugin_id: str = None) -> Any:
"""
获取配置信息
:param plugin_id: 插件ID
"""
if not plugin_id:
plugin_id = self.__class__.__name__
return SystemConfigs().get(f"plugin.{plugin_id}")
def get_data_path(self, plugin_id: str = None) -> Path:
"""
获取插件数据保存目录
"""
if not plugin_id:
plugin_id = self.__class__.__name__
data_path = settings.PLUGIN_DATA_PATH / f"{plugin_id}"
if not data_path.exists():
data_path.mkdir(parents=True)
return data_path