mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 14:22:55 +08:00
modified: basic_plugins/admin_bot_manage/admin_config.py modified: basic_plugins/admin_bot_manage/custom_welcome_message.py modified: basic_plugins/admin_bot_manage/timing_task.py modified: basic_plugins/apscheduler/__init__.py modified: basic_plugins/ban/__init__.py modified: basic_plugins/ban/data_source.py modified: basic_plugins/chat_history/chat_message.py modified: basic_plugins/chat_history/chat_message_handle.py modified: basic_plugins/group_handle/__init__.py modified: basic_plugins/hooks/_utils.py modified: basic_plugins/hooks/ban_hook.py modified: basic_plugins/hooks/chkdsk_hook.py modified: basic_plugins/init_plugin_config/__init__.py deleted: basic_plugins/init_plugin_config/init_group_manager.py modified: basic_plugins/invite_manager/__init__.py new file: basic_plugins/invite_manager/utils.py modified: basic_plugins/nickname.py modified: basic_plugins/plugin_shop/__init__.py modified: basic_plugins/plugin_shop/data_source.py modified: basic_plugins/scripts.py modified: basic_plugins/shop/__init__.py modified: basic_plugins/shop/buy.py modified: basic_plugins/shop/gold.py modified: basic_plugins/shop/my_props/__init__.py deleted: basic_plugins/shop/reset_today_gold.py modified: basic_plugins/shop/shop_handle/__init__.py modified: basic_plugins/shop/shop_handle/data_source.py modified: basic_plugins/shop/use/__init__.py modified: basic_plugins/shop/use/data_source.py modified: basic_plugins/super_cmd/__init__.py modified: basic_plugins/super_cmd/bot_friend_group.py modified: basic_plugins/super_cmd/clear_data.py modified: basic_plugins/super_cmd/exec_sql.py modified: basic_plugins/super_cmd/manager_group.py modified: basic_plugins/super_cmd/reload_setting.py modified: basic_plugins/super_cmd/set_admin_permissions.py deleted: basic_plugins/super_cmd/super_task_switch.py modified: basic_plugins/super_cmd/update_friend_group_info.py modified: basic_plugins/super_help/__init__.py modified: basic_plugins/update_info.py modified: configs/config.py modified: configs/utils/__init__.py modified: models/bag_user.py modified: models/ban_user.py modified: models/chat_history.py modified: models/friend_user.py modified: models/goods_info.py modified: models/group_info.py modified: models/group_member_info.py modified: models/level_user.py modified: models/sign_group_user.py modified: models/user_shop_gold_log.py modified: plugins/aconfig/__init__.py modified: plugins/ai/__init__.py modified: plugins/ai/data_source.py modified: plugins/bilibili_sub/__init__.py modified: plugins/bilibili_sub/data_source.py modified: plugins/bilibili_sub/model.py modified: plugins/black_word/__init__.py modified: plugins/black_word/model.py modified: plugins/black_word/utils.py modified: plugins/bt/data_source.py modified: plugins/genshin/almanac/__init__.py modified: plugins/genshin/material_remind/__init__.py modified: plugins/genshin/query_user/_models/__init__.py modified: plugins/genshin/query_user/_utils/__init__.py modified: plugins/genshin/query_user/bind/__init__.py modified: plugins/genshin/query_user/genshin_sign/__init__.py modified: plugins/genshin/query_user/genshin_sign/data_source.py modified: plugins/genshin/query_user/genshin_sign/init_task.py modified: plugins/genshin/query_user/mihoyobbs_sign/__init__.py modified: plugins/genshin/query_user/query_memo/__init__.py modified: plugins/genshin/query_user/query_memo/data_source.py modified: plugins/genshin/query_user/query_role/__init__.py modified: plugins/genshin/query_user/query_role/data_source.py modified: plugins/genshin/query_user/reset_today_query_user_data/__init__.py modified: plugins/genshin/query_user/resin_remind/__init__.py modified: plugins/genshin/query_user/resin_remind/init_task.py modified: plugins/gold_redbag/model.py modified: plugins/image_management/send_image/__init__.py modified: plugins/my_info/__init__.py modified: plugins/open_cases/models/buff_prices.py modified: plugins/open_cases/models/open_cases_user.py modified: plugins/open_cases/open_cases_c.py modified: plugins/open_cases/utils.py modified: plugins/parse_bilibili_json.py modified: plugins/pid_search.py modified: plugins/pix_gallery/__init__.py modified: plugins/pix_gallery/_data_source.py modified: plugins/pix_gallery/_model/omega_pixiv_illusts.py modified: plugins/pix_gallery/_model/pixiv.py modified: plugins/pix_gallery/_model/pixiv_keyword_user.py modified: plugins/pix_gallery/pix_add_keyword.py modified: plugins/pix_gallery/pix_pass_del_keyword.py modified: plugins/pix_gallery/pix_show_info.py modified: plugins/pix_gallery/pix_update.py modified: plugins/pixiv_rank_search/data_source.py modified: plugins/poke/__init__.py modified: plugins/russian/__init__.py modified: plugins/russian/data_source.py modified: plugins/russian/model.py modified: plugins/send_dinggong_voice/__init__.py modified: plugins/send_setu_/_model.py modified: plugins/send_setu_/send_setu/__init__.py modified: plugins/send_setu_/send_setu/data_source.py modified: plugins/send_setu_/update_setu/data_source.py modified: plugins/sign_in/goods_register.py modified: plugins/sign_in/group_user_checkin.py modified: plugins/sign_in/random_event.py modified: plugins/sign_in/utils.py modified: plugins/statistics/_model.py modified: plugins/statistics/statistics_handle.py modified: plugins/statistics/statistics_hook.py modified: plugins/update_picture.py modified: plugins/web_ui/api/request.py modified: plugins/word_bank/_model.py deleted: plugins/word_bank/_old_model.py modified: plugins/word_bank/_rule.py modified: plugins/word_bank/word_handle.py modified: plugins/word_clouds/data_source.py modified: resources/image/sign/sign_res/bar.png modified: resources/image/sign/sign_res/bar_white.png modified: services/db_context.py modified: services/log.py modified: utils/browser.py modified: utils/data_utils.py modified: utils/depends/__init__.py modified: utils/http_utils.py modified: utils/image_utils.py modified: utils/manager/admin_manager.py modified: utils/message_builder.py modified: utils/utils.py
238 lines
7.9 KiB
Python
238 lines
7.9 KiB
Python
import copy
|
||
from pathlib import Path
|
||
from typing import Any, Optional, Union
|
||
|
||
from ruamel import yaml
|
||
from ruamel.yaml import YAML
|
||
from ruamel.yaml.scanner import ScannerError
|
||
|
||
|
||
class ConfigsManager:
|
||
"""
|
||
插件配置 与 资源 管理器
|
||
"""
|
||
|
||
def __init__(self, file: Path):
|
||
self._data: dict = {}
|
||
self._simple_data: dict = {}
|
||
self._admin_level_data = []
|
||
self._simple_file = Path() / "configs" / "config.yaml"
|
||
if file:
|
||
file.parent.mkdir(exist_ok=True, parents=True)
|
||
self.file = file
|
||
_yaml = YAML()
|
||
if file.exists():
|
||
with open(file, "r", encoding="utf8") as f:
|
||
self._data = _yaml.load(f)
|
||
if not self._data:
|
||
self.file.unlink()
|
||
raise ValueError(
|
||
"配置文件为空!\n"
|
||
"***********************************************************\n"
|
||
"****** 配置文件 plugins2config.yaml 为空,已删除,请重启 ******\n"
|
||
"***********************************************************"
|
||
)
|
||
if self._simple_file.exists():
|
||
try:
|
||
with open(self._simple_file, "r", encoding="utf8") as f:
|
||
self._simple_data = _yaml.load(f)
|
||
except ScannerError as e:
|
||
raise ScannerError(
|
||
f"{e}\n**********************************************\n"
|
||
f"****** 可能为config.yaml配置文件填写不规范 ******\n"
|
||
f"**********************************************"
|
||
)
|
||
|
||
def add_plugin_config(
|
||
self,
|
||
module: str,
|
||
key: str,
|
||
value: Optional[Any],
|
||
*,
|
||
name: Optional[str] = None,
|
||
help_: Optional[str] = None,
|
||
default_value: Optional[Any] = None,
|
||
_override: bool = False,
|
||
):
|
||
"""
|
||
为插件添加一个配置,不会被覆盖,只有第一个生效
|
||
:param module: 模块
|
||
:param key: 键
|
||
:param value: 值
|
||
:param name: 插件名称
|
||
:param help_: 配置注解
|
||
:param default_value: 默认值
|
||
:param _override: 覆盖前值
|
||
"""
|
||
if (
|
||
not (module in self._data.keys() and self._data[module].get(key))
|
||
or _override
|
||
):
|
||
_module = None
|
||
if ":" in module:
|
||
module = module.split(":")
|
||
_module = module[-1]
|
||
module = module[0]
|
||
if "[LEVEL]" in key and _module:
|
||
key = key.replace("[LEVEL]", "").strip()
|
||
self._admin_level_data.append((_module, value))
|
||
if self._data.get(module) is None:
|
||
self._data[module] = {}
|
||
key = key.upper()
|
||
self._data[module][key] = {
|
||
"value": value,
|
||
"name": name.strip() if isinstance(name, str) else name,
|
||
"help": help_.strip() if isinstance(help_, str) else help_,
|
||
"default_value": default_value,
|
||
"level_module": _module,
|
||
}
|
||
|
||
def remove_plugin_config(self, module: str):
|
||
"""
|
||
为插件删除一个配置
|
||
:param module: 模块名
|
||
"""
|
||
if module in self._data.keys():
|
||
del self._data[module]
|
||
self.save()
|
||
|
||
def set_config(self, module: str, key: str, value: Any, auto_save: bool = False, save_simple_data: bool = True):
|
||
"""
|
||
设置配置值
|
||
:param module: 模块名
|
||
:param key: 配置名称
|
||
:param value: 值
|
||
:param auto_save: 自动保存
|
||
:param save_simple_data: 保存至config.yaml
|
||
"""
|
||
if module in self._data.keys():
|
||
if (
|
||
self._data[module].get(key) is not None
|
||
and self._data[module][key] != value
|
||
):
|
||
self._data[module][key]["value"] = value
|
||
self._simple_data[module][key] = value
|
||
if auto_save:
|
||
self.save(save_simple_data=save_simple_data)
|
||
|
||
def set_help(self, module: str, key: str, help_: str):
|
||
"""
|
||
设置配置注释
|
||
:param module: 模块名
|
||
:param key: 配置名称
|
||
:param help_: 注释文本
|
||
"""
|
||
if module in self._data.keys():
|
||
if self._data[module].get(key) is not None:
|
||
self._data[module][key]["help"] = help_
|
||
self.save()
|
||
|
||
def set_default_value(self, module: str, key: str, value: Any):
|
||
"""
|
||
设置配置默认值
|
||
:param module: 模块名
|
||
:param key: 配置名称
|
||
:param value: 值
|
||
"""
|
||
if module in self._data.keys():
|
||
if self._data[module].get(key) is not None:
|
||
self._data[module][key]["default_value"] = value
|
||
self.save()
|
||
|
||
def get_config(
|
||
self, module: str, key: str, default: Optional[Any] = None
|
||
) -> Optional[Any]:
|
||
"""
|
||
获取指定配置值
|
||
:param module: 模块名
|
||
:param key: 配置名称
|
||
:param default: 没有key值内容的默认返回值
|
||
"""
|
||
key = key.upper()
|
||
if module in self._data.keys():
|
||
for key in [key, f"{key} [LEVEL]"]:
|
||
if self._data[module].get(key) is not None:
|
||
if self._data[module][key]["value"] is None:
|
||
return self._data[module][key]["default_value"]
|
||
return self._data[module][key]["value"]
|
||
if default is not None:
|
||
return default
|
||
return None
|
||
|
||
def get_level2module(self, module: str, key: str) -> Optional[str]:
|
||
"""
|
||
获取指定key所绑定的module,一般为权限等级
|
||
:param module: 模块名
|
||
:param key: 配置名称
|
||
:return:
|
||
"""
|
||
if self._data.get(module) is not None:
|
||
if self._data[module].get(key) is not None:
|
||
return self._data[module][key].get("level_module")
|
||
|
||
def get(self, key: str):
|
||
"""
|
||
获取插件配置数据
|
||
:param key: 名称
|
||
"""
|
||
if key in self._data.keys():
|
||
return self._data[key]
|
||
|
||
def save(self, path: Union[str, Path] = None, save_simple_data: bool = False):
|
||
"""
|
||
保存数据
|
||
:param path: 路径
|
||
:param save_simple_data: 同时保存至config.yaml
|
||
"""
|
||
if save_simple_data:
|
||
with open(self._simple_file, "w", encoding="utf8") as f:
|
||
yaml.dump(
|
||
self._simple_data,
|
||
f,
|
||
indent=2,
|
||
Dumper=yaml.RoundTripDumper,
|
||
allow_unicode=True,
|
||
)
|
||
path = path if path else self.file
|
||
with open(path, "w", encoding="utf8") as f:
|
||
yaml.dump(
|
||
self._data, f, indent=2, Dumper=yaml.RoundTripDumper, allow_unicode=True
|
||
)
|
||
|
||
def reload(self):
|
||
"""
|
||
重新加载配置文件
|
||
"""
|
||
_yaml = YAML()
|
||
if self._simple_file.exists():
|
||
with open(self._simple_file, "r", encoding="utf8") as f:
|
||
self._simple_data = _yaml.load(f)
|
||
for key in self._simple_data.keys():
|
||
for k in self._simple_data[key].keys():
|
||
self._data[key][k]["value"] = self._simple_data[key][k]
|
||
self.save()
|
||
|
||
def get_admin_level_data(self):
|
||
"""
|
||
获取管理插件等级
|
||
"""
|
||
return self._admin_level_data
|
||
|
||
def get_data(self):
|
||
return copy.deepcopy(self._data)
|
||
|
||
def is_empty(self) -> bool:
|
||
return not bool(self._data)
|
||
|
||
def keys(self):
|
||
return self._data.keys()
|
||
|
||
def __str__(self):
|
||
return str(self._data)
|
||
|
||
def __setitem__(self, key, value):
|
||
self._data[key] = value
|
||
|
||
def __getitem__(self, key):
|
||
return self._data[key]
|