mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-09-29 08:39:59 +08:00
优化代码
This commit is contained in:
+14
-10
@@ -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
@@ -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])
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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]:
|
||||
"""
|
||||
|
||||
@@ -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]:
|
||||
"""
|
||||
|
||||
@@ -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]:
|
||||
"""
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user