zhenxun_bot/utils/manager/plugins_manager.py

168 lines
4.7 KiB
Python
Raw Normal View History

2022-11-21 20:43:41 +08:00
from typing import Optional, Dict, Callable, Union
2021-11-04 16:11:50 +08:00
from pathlib import Path
2022-11-21 20:43:41 +08:00
from utils.manager.data_class import StaticData
from utils.manager import group_manager
from .models import Plugin
def init_plugin(func: Callable):
"""
说明:
初始化群数据
参数:
:param func: func
"""
def wrapper(*args, **kwargs):
2022-12-26 18:40:34 +08:00
try:
self = args[0]
module = args[1]
if module not in self._data.keys():
self._data[module] = Plugin(
plugin_name=module,
status=True,
error=False,
block_type=None,
author=None,
version=None,
)
except Exception as e:
pass
2022-11-21 20:43:41 +08:00
return func(*args, **kwargs)
return wrapper
2021-11-04 16:11:50 +08:00
class PluginsManager(StaticData[Plugin]):
2021-11-04 16:11:50 +08:00
"""
插件 管理器
"""
def __init__(self, file: Path):
2022-11-21 20:43:41 +08:00
self._data: Dict[str, Plugin]
2021-11-04 16:11:50 +08:00
super().__init__(file)
2022-11-21 20:43:41 +08:00
for k, v in self._data.items():
self._data[k] = Plugin.parse_obj(v)
2021-11-04 16:11:50 +08:00
def add_plugin_data(
self,
module: str,
plugin_name: str,
*,
status: Optional[bool] = True,
error: Optional[bool] = False,
block_type: Optional[str] = None,
author: Optional[str] = None,
version: Optional[int] = None,
):
"""
2022-11-21 20:43:41 +08:00
说明:
添加插件数据
参数:
:param module: 模块名称
:param plugin_name: 插件名称
:param status: 插件开关状态
:param error: 加载状态
:param block_type: 限制类型
:param author: 作者
:param version: 版本
"""
self._data[module] = Plugin(
plugin_name=plugin_name,
status=status,
error=error,
block_type=block_type,
author=author,
version=version,
)
2021-11-04 16:11:50 +08:00
def block_plugin(
self, module: str, group_id: Optional[int] = None, block_type: str = "all"
):
"""
2022-07-23 14:09:17 +08:00
说明:
2021-11-04 16:11:50 +08:00
锁定插件
2022-07-23 14:09:17 +08:00
参数:
2021-11-04 16:11:50 +08:00
:param module: 功能模块名
:param group_id: 群组None时为超级用户禁用
:param block_type: 限制类型
"""
self._set_plugin_status(module, "block", group_id, block_type)
def unblock_plugin(self, module: str, group_id: Optional[int] = None):
"""
2022-07-23 14:09:17 +08:00
说明:
2021-11-04 16:11:50 +08:00
解锁插件
2022-07-23 14:09:17 +08:00
参数:
2021-11-04 16:11:50 +08:00
:param module: 功能模块名
:param group_id: 群组
"""
self._set_plugin_status(module, "unblock", group_id)
2022-11-21 20:43:41 +08:00
def get_plugin_status(self, module: str, block_type: str = "all") -> bool:
2021-11-04 16:11:50 +08:00
"""
2022-07-23 14:09:17 +08:00
说明:
2021-11-04 16:11:50 +08:00
获取插件状态
2022-07-23 14:09:17 +08:00
参数:
2021-11-04 16:11:50 +08:00
:param module: 功能模块名
:param block_type: 限制类型
"""
if module in self._data.keys():
2022-11-21 20:43:41 +08:00
if self._data[module].block_type == "all" and block_type == "all":
2021-11-04 16:11:50 +08:00
return False
2022-11-21 20:43:41 +08:00
return not self._data[module].block_type == block_type
2021-11-04 16:11:50 +08:00
return True
2022-11-21 20:43:41 +08:00
def get_plugin_block_type(self, module: str) -> Optional[str]:
2021-11-04 16:11:50 +08:00
"""
2022-07-23 14:09:17 +08:00
说明:
2021-11-04 16:11:50 +08:00
获取功能限制类型
2022-07-23 14:09:17 +08:00
参数:
2021-11-04 16:11:50 +08:00
:param module: 模块名称
"""
if module in self._data.keys():
2022-11-21 20:43:41 +08:00
return self._data[module].block_type
2021-11-04 16:11:50 +08:00
2022-11-21 20:43:41 +08:00
@init_plugin
2021-11-04 16:11:50 +08:00
def get_plugin_error_status(self, module: str) -> bool:
"""
2022-11-21 20:43:41 +08:00
说明:
插件是否成功加载
参数:
:param module: 模块名称
2021-11-04 16:11:50 +08:00
"""
2022-11-21 20:43:41 +08:00
return self._data[module].error
2021-11-04 16:11:50 +08:00
2022-11-21 20:43:41 +08:00
@init_plugin
2021-11-04 16:11:50 +08:00
def _set_plugin_status(
self,
module: str,
status: str,
group_id: Optional[str],
block_type: str = "all",
):
"""
2022-07-23 14:09:17 +08:00
说明:
2021-11-04 16:11:50 +08:00
设置功能开关状态
2022-07-23 14:09:17 +08:00
参数:
2021-11-04 16:11:50 +08:00
:param module: 功能模块名
:param status: 功能状态
:param group_id: 群组
:param block_type: 限制类型
"""
if module:
if group_id:
if status == "block":
group_manager.block_plugin(f"{module}:super", int(group_id))
else:
group_manager.unblock_plugin(f"{module}:super", int(group_id))
else:
if status == "block":
2022-11-21 20:43:41 +08:00
self._data[module].status = False
self._data[module].block_type = block_type
2021-11-04 16:11:50 +08:00
else:
if module in self._data.keys():
2022-11-21 20:43:41 +08:00
self._data[module].status = True
self._data[module].block_type = None
2021-11-04 16:11:50 +08:00
self.save()