zhenxun_bot/utils/manager/plugins_manager.py
2022-11-21 20:43:41 +08:00

165 lines
4.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from typing import Optional, Dict, Callable, Union
from pathlib import Path
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):
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,
)
return func(*args, **kwargs)
return wrapper
class PluginsManager(StaticData):
"""
插件 管理器
"""
def __init__(self, file: Path):
self._data: Dict[str, Plugin]
super().__init__(file)
for k, v in self._data.items():
self._data[k] = Plugin.parse_obj(v)
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,
):
"""
说明:
添加插件数据
参数:
: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,
)
def block_plugin(
self, module: str, group_id: Optional[int] = None, block_type: str = "all"
):
"""
说明:
锁定插件
参数:
: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):
"""
说明:
解锁插件
参数:
:param module: 功能模块名
:param group_id: 群组
"""
self._set_plugin_status(module, "unblock", group_id)
def get_plugin_status(self, module: str, block_type: str = "all") -> bool:
"""
说明:
获取插件状态
参数:
:param module: 功能模块名
:param block_type: 限制类型
"""
if module in self._data.keys():
if self._data[module].block_type == "all" and block_type == "all":
return False
return not self._data[module].block_type == block_type
return True
def get_plugin_block_type(self, module: str) -> Optional[str]:
"""
说明:
获取功能限制类型
参数:
:param module: 模块名称
"""
if module in self._data.keys():
return self._data[module].block_type
@init_plugin
def get_plugin_error_status(self, module: str) -> bool:
"""
说明:
插件是否成功加载
参数:
:param module: 模块名称
"""
return self._data[module].error
@init_plugin
def _set_plugin_status(
self,
module: str,
status: str,
group_id: Optional[str],
block_type: str = "all",
):
"""
说明:
设置功能开关状态
参数:
: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":
self._data[module].status = False
self._data[module].block_type = block_type
else:
if module in self._data.keys():
self._data[module].status = True
self._data[module].block_type = None
self.save()