优化代码

This commit is contained in:
HibiKier
2022-12-04 16:46:33 +08:00
parent 994484f3b0
commit 31e4cadecb
18 changed files with 483 additions and 325 deletions
+14 -10
View File
@@ -1,6 +1,7 @@
from typing import Optional
from .group_manager import GroupManager
from .data_class import StaticData
from .plugin_data_manager import PluginDataManager
from .withdraw_message_manager import WithdrawMessageManager
from .plugins2cd_manager import Plugins2cdManager
from .plugins2block_manager import Plugins2blockManager
@@ -18,50 +19,53 @@ from configs.path_config import DATA_PATH
admin_manager = AdminManager()
# 群功能开关 | 群被动技能 | 群权限 管理
group_manager: Optional[GroupManager] = GroupManager(
group_manager: GroupManager = GroupManager(
DATA_PATH / "manager" / "group_manager.json"
)
# 撤回消息管理
withdraw_message_manager: Optional[WithdrawMessageManager] = WithdrawMessageManager()
withdraw_message_manager: WithdrawMessageManager = WithdrawMessageManager()
# 插件管理
plugins_manager: Optional[PluginsManager] = PluginsManager(
plugins_manager: PluginsManager = PluginsManager(
DATA_PATH / "manager" / "plugins_manager.json"
)
# 插件基本设置管理
plugins2settings_manager: Optional[Plugins2settingsManager] = Plugins2settingsManager(
plugins2settings_manager: Plugins2settingsManager = Plugins2settingsManager(
DATA_PATH / "configs" / "plugins2settings.yaml"
)
# 插件命令 cd 管理
plugins2cd_manager: Optional[Plugins2cdManager] = Plugins2cdManager(
plugins2cd_manager: Plugins2cdManager = Plugins2cdManager(
DATA_PATH / "configs" / "plugins2cd.yaml"
)
# 插件命令 阻塞 管理
plugins2block_manager: Optional[Plugins2blockManager] = Plugins2blockManager(
plugins2block_manager: Plugins2blockManager = Plugins2blockManager(
DATA_PATH / "configs" / "plugins2block.yaml"
)
# 插件命令 每次次数限制 管理
plugins2count_manager: Optional[Plugins2countManager] = Plugins2countManager(
plugins2count_manager: Plugins2countManager = Plugins2countManager(
DATA_PATH / "configs" / "plugins2count.yaml"
)
# 资源管理
resources_manager: Optional[ResourcesManager] = ResourcesManager(
resources_manager: ResourcesManager = ResourcesManager(
DATA_PATH / "manager" / "resources_manager.json"
)
# 插件加载容忍管理
none_plugin_count_manager: Optional[NonePluginCountManager] = NonePluginCountManager(
none_plugin_count_manager: NonePluginCountManager = NonePluginCountManager(
DATA_PATH / "manager" / "none_plugin_count_manager.json"
)
# 好友请求/群聊邀请 管理
requests_manager: Optional[RequestManager] = RequestManager(
requests_manager: RequestManager = RequestManager(
DATA_PATH / "manager" / "requests_manager.json"
)
# 全局插件数据
plugin_data_manager: PluginDataManager = PluginDataManager()
+55 -11
View File
@@ -1,6 +1,8 @@
from typing import List, Optional, Dict, Literal, Tuple, Union
from pathlib import Path
from typing import List, Optional, Dict, Literal, Tuple, Union, Any
from pydantic import BaseModel
from configs.config import Config
from enum import Enum
class AdminSetting(BaseModel):
@@ -8,7 +10,7 @@ class AdminSetting(BaseModel):
管理员设置
"""
level: int
level: int = 5
cmd: Optional[List[str]]
@@ -40,9 +42,9 @@ class PluginBlock(BaseModel):
插件阻断
"""
status: bool # 限制状态
check_type: Literal["private", "group", "all"] # 检查类型
limit_type: Literal["user", "group"] # 监听对象
status: bool = True # 限制状态
check_type: Literal["private", "group", "all"] = "all" # 检查类型
limit_type: Literal["user", "group"] = "user" # 监听对象
rst: Optional[str] # 阻断时回复
@@ -51,10 +53,10 @@ class PluginCd(BaseModel):
插件阻断
"""
cd: int # cd
status: bool # 限制状态
check_type: Literal["private", "group", "all"] # 检查类型
limit_type: Literal["user", "group"] # 监听对象
cd: int = 5 # cd
status: bool = True # 限制状态
check_type: Literal["private", "group", "all"] = "all" # 检查类型
limit_type: Literal["user", "group"] = "user" # 监听对象
rst: Optional[str] # 阻断时回复
@@ -64,8 +66,8 @@ class PluginCount(BaseModel):
"""
max_count: int # 次数
status: bool # 限制状态
limit_type: Literal["user", "group"] # 监听对象
status: bool = True # 限制状态
limit_type: Literal["user", "group"] = "user" # 监听对象
rst: Optional[str] # 阻断时回复
@@ -93,3 +95,45 @@ class Plugin(BaseModel):
block_type: Optional[str] = None # 关闭类型
author: Optional[str] = None # 作者
version: Optional[Union[int, str]] = None # 版本
class PluginType(Enum):
"""
插件类型
"""
NORMAL = "normal"
ADMIN = "admin"
HIDDEN = "hidden"
SUPERUSER = "superuser"
class PluginData(BaseModel):
model: str
name: str
plugin_type: PluginType # 插件内部类型,根据name [Hidden] [Admin] [SUPERUSER]
usage: Optional[str]
des: Optional[str]
task: Optional[Dict[str, str]]
menu_type: Tuple[Union[str, int], ...] = ("normal",) # 菜单类型
version: Optional[Union[str, int]]
author: Optional[str]
plugin_setting: Optional[PluginSetting]
plugin_cd: Optional[PluginCd]
plugin_block: Optional[PluginBlock]
plugin_count: Optional[PluginCount]
plugin_resources: Optional[Dict[str, Union[str, Path]]]
plugin_configs: Optional[Dict[str, Dict[str, Any]]]
class Config:
arbitrary_types_allowed = True
def __eq__(self, other: "PluginData"):
return (
isinstance(other, PluginData)
and self.name == other.name
and self.menu_type == other.menu_type
)
def __hash__(self):
return hash(self.name + self.menu_type[0])
+35
View File
@@ -0,0 +1,35 @@
from typing import Dict, Any
from .models import PluginData
class PluginDataManager:
"""
插件所有信息管理
"""
def __init__(self):
self._data: Dict[str, PluginData] = {}
def add_plugin_info(self, info: PluginData):
"""
说明:
添加插件信息
参数:
:param info: PluginInfo
"""
if info.model in self._data.keys() and self._data[info.model] == info:
raise ValueError(f"PluginInfoManager {info.model}:{info.name} 插件名称及类型已存在")
self._data[info.model] = info
def get(self, item: str, default: Any = None) -> PluginData:
return self._data.get(item, default)
def __getitem__(self, item) -> PluginData:
return self._data.get(item)
def __str__(self) -> str:
return str(self._data)
+28 -11
View File
@@ -1,4 +1,4 @@
from typing import Optional, Dict, Literal, Union
from typing import Optional, Dict, Literal, Union, overload
from utils.manager.data_class import StaticData
from services.log import logger
from utils.utils import UserBlockLimiter
@@ -19,11 +19,25 @@ class Plugins2blockManager(StaticData):
self._block_limiter: Dict[str, UserBlockLimiter] = {}
self.__load_file()
@overload
def add_block_limit(self, plugin: str, plugin_block: PluginBlock):
...
@overload
def add_block_limit(
self,
plugin: str,
*,
status: Optional[bool] = True,
status: bool = True,
check_type: Literal["private", "group", "all"] = "all",
limit_type: Literal["user", "group"] = "user",
rst: Optional[str] = None,
):
...
def add_block_limit(
self,
plugin: str,
status: Union[bool, PluginBlock] = True,
check_type: Literal["private", "group", "all"] = "all",
limit_type: Literal["user", "group"] = "user",
rst: Optional[str] = None,
@@ -38,15 +52,18 @@ class Plugins2blockManager(StaticData):
:param limit_type: 限制类型 监听对象,以user_id或group_id作为键来限制,'user':用户id,'group':群id
:param rst: 回复的话,为空则不回复
"""
if check_type not in ["all", "group", "private"]:
raise ValueError(
f"{plugin} 添加block限制错误,‘check_type‘ 必须为 'private'/'group'/'all'"
if isinstance(status, PluginBlock):
self._data[plugin] = status
else:
if check_type not in ["all", "group", "private"]:
raise ValueError(
f"{plugin} 添加block限制错误,‘check_type‘ 必须为 'private'/'group'/'all'"
)
if limit_type not in ["user", "group"]:
raise ValueError(f"{plugin} 添加block限制错误,‘limit_type‘ 必须为 'user'/'group'")
self._data[plugin] = PluginBlock(
status=status, check_type=check_type, limit_type=limit_type, rst=rst
)
if limit_type not in ["user", "group"]:
raise ValueError(f"{plugin} 添加block限制错误,‘limit_type‘ 必须为 'user'/'group'")
self._data[plugin] = PluginBlock(
status=status, check_type=check_type, limit_type=limit_type, rst=rst
)
def get_plugin_block_data(self, plugin: str) -> Optional[PluginBlock]:
"""
+28 -10
View File
@@ -1,4 +1,4 @@
from typing import Optional, Dict, Literal, Union
from typing import Optional, Dict, Literal, Union, overload
from utils.manager.data_class import StaticData
from utils.utils import FreqLimiter
from services.log import logger
@@ -19,11 +19,26 @@ class Plugins2cdManager(StaticData):
self._freq_limiter: Dict[str, FreqLimiter] = {}
self.__load_file()
@overload
def add_cd_limit(self, plugin: str, plugin_cd: PluginCd):
...
@overload
def add_cd_limit(
self,
plugin: str,
*,
cd: Optional[int] = 5,
cd: Union[int, PluginCd] = 5,
status: Optional[bool] = True,
check_type: Literal["private", "group", "all"] = "all",
limit_type: Literal["user", "group"] = "user",
rst: Optional[str] = None,
):
...
def add_cd_limit(
self,
plugin: str,
cd: Union[int, PluginCd] = 5,
status: Optional[bool] = True,
check_type: Literal["private", "group", "all"] = "all",
limit_type: Literal["user", "group"] = "user",
@@ -40,13 +55,16 @@ class Plugins2cdManager(StaticData):
:param limit_type: 限制类型 监听对象,以user_id或group_id作为键来限制,'user':用户id,'group':群id
:param rst: 回复的话,为空则不回复
"""
if check_type not in ["all", "group", "private"]:
raise ValueError(
f"{plugin} 添加cd限制错误,‘check_type‘ 必须为 'private'/'group'/'all'"
)
if limit_type not in ["user", "group"]:
raise ValueError(f"{plugin} 添加cd限制错误,‘limit_type‘ 必须为 'user'/'group'")
self._data[plugin] = PluginCd(cd=cd, status=status, check_type=check_type, limit_type=limit_type, rst=rst)
if isinstance(cd, PluginCd):
self._data[plugin] = cd
else:
if check_type not in ["all", "group", "private"]:
raise ValueError(
f"{plugin} 添加cd限制错误,‘check_type‘ 必须为 'private'/'group'/'all'"
)
if limit_type not in ["user", "group"]:
raise ValueError(f"{plugin} 添加cd限制错误,‘limit_type‘ 必须为 'user'/'group'")
self._data[plugin] = PluginCd(cd=cd, status=status, check_type=check_type, limit_type=limit_type, rst=rst)
def get_plugin_cd_data(self, plugin: str) -> Optional[PluginCd]:
"""
+22 -5
View File
@@ -1,4 +1,4 @@
from typing import Optional, Dict, Literal, Union
from typing import Optional, Dict, Literal, Union, overload
from utils.manager.data_class import StaticData
from utils.utils import DailyNumberLimiter
from services.log import logger
@@ -19,14 +19,28 @@ class Plugins2countManager(StaticData):
self._daily_limiter: Dict[str, DailyNumberLimiter] = {}
self.__load_file()
@overload
def add_count_limit(self, plugin: str, plugin_count: PluginCount):
...
@overload
def add_count_limit(
self,
plugin: str,
*,
max_count: int = 5,
status: Optional[bool] = True,
limit_type: Literal["user", "group"] = "user",
rst: Optional[str] = None,
):
...
def add_count_limit(
self,
plugin: str,
max_count: Union[int, PluginCount] = 5,
status: Optional[bool] = True,
limit_type: Literal["user", "group"] = "user",
rst: Optional[str] = None,
):
"""
说明:
@@ -38,9 +52,12 @@ class Plugins2countManager(StaticData):
:param limit_type: 限制类型 监听对象,以user_id或group_id作为键来限制,'user':用户id,'group':群id
:param rst: 回复的话,为空则不回复
"""
if limit_type not in ["user", "group"]:
raise ValueError(f"{plugin} 添加count限制错误,‘limit_type‘ 必须为 'user'/'group'")
self._data[plugin] = PluginCount(max_count=max_count, status=status, limit_type=limit_type, rst=rst)
if isinstance(max_count, PluginCount):
self._data[plugin] = max_count
else:
if limit_type not in ["user", "group"]:
raise ValueError(f"{plugin} 添加count限制错误,‘limit_type‘ 必须为 'user'/'group'")
self._data[plugin] = PluginCount(max_count=max_count, status=status, limit_type=limit_type, rst=rst)
def get_plugin_count_data(self, plugin: str) -> Optional[PluginCount]:
"""
+44 -17
View File
@@ -1,9 +1,8 @@
from typing import List, Optional, Union, Tuple, Dict
from typing import List, Optional, Union, Tuple, Dict, overload
from utils.manager.data_class import StaticData
from pathlib import Path
from ruamel import yaml
from .models import PluginSetting
from .models import PluginSetting, PluginType
_yaml = yaml.YAML(typ="safe")
@@ -17,10 +16,27 @@ class Plugins2settingsManager(StaticData):
super().__init__(file, False)
self.__load_file()
@overload
def add_plugin_settings(self, plugin: str, plugin_settings: PluginSetting):
...
@overload
def add_plugin_settings(
self,
plugin: str,
cmd: Optional[List[str]] = None,
cmd: List[str] = None,
default_status: bool = True,
level: int = 5,
limit_superuser: bool = False,
plugin_type: Tuple[Union[str, int]] = ("normal",),
cost_gold: int = 0,
):
...
def add_plugin_settings(
self,
plugin: str,
cmd: Union[List[str], PluginSetting] = None,
default_status: bool = True,
level: int = 5,
limit_superuser: bool = False,
@@ -39,14 +55,17 @@ class Plugins2settingsManager(StaticData):
:param plugin_type: 插件类型
:param cost_gold: 需要消费的金币
"""
self._data[plugin] = PluginSetting(
cmd=cmd,
level=level,
default_status=default_status,
limit_superuser=limit_superuser,
plugin_type=plugin_type,
cost_gold=cost_gold,
)
if isinstance(cmd, PluginSetting):
self._data[plugin] = cmd
else:
self._data[plugin] = PluginSetting(
cmd=cmd,
level=level,
default_status=default_status,
limit_superuser=limit_superuser,
plugin_type=plugin_type,
cost_gold=cost_gold,
)
def get_plugin_data(self, module: str) -> Optional[PluginSetting]:
"""
@@ -95,8 +114,16 @@ class Plugins2settingsManager(StaticData):
path = Path(path)
if path:
with open(path, "w", encoding="utf8") as f:
self_dict = self.dict()
for key in self_dict.keys():
if self_dict[key].get("plugin_type") and isinstance(
self_dict[key].get("plugin_type"), PluginType
):
self_dict[key]["plugin_type"] = self_dict[key][
"plugin_type"
].value
yaml.dump(
{"PluginSettings": self.dict()},
{"PluginSettings": self_dict},
f,
indent=2,
Dumper=yaml.RoundTripDumper,
@@ -127,7 +154,7 @@ class Plugins2settingsManager(StaticData):
self._data: Dict[str, PluginSetting] = {}
if self.file.exists():
with open(self.file, "r", encoding="utf8") as f:
temp = _yaml.load(f)
if "PluginSettings" in temp.keys():
for k, v in temp["PluginSettings"].items():
self._data[k] = PluginSetting.parse_obj(v)
if temp := _yaml.load(f):
if "PluginSettings" in temp.keys():
for k, v in temp["PluginSettings"].items():
self._data[k] = PluginSetting.parse_obj(v)