mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 06:12:53 +08:00
148 lines
6.0 KiB
Python
148 lines
6.0 KiB
Python
from pathlib import Path
|
||
from ruamel.yaml import round_trip_load, round_trip_dump, YAML
|
||
from utils.manager import admin_manager, plugins_manager
|
||
from configs.config import Config
|
||
from services.log import logger
|
||
from utils.utils import get_matchers
|
||
from ruamel import yaml
|
||
import nonebot
|
||
|
||
|
||
_yaml = YAML(typ="safe")
|
||
|
||
|
||
def init_plugins_config(data_path):
|
||
"""
|
||
初始化插件数据配置
|
||
"""
|
||
plugins2config_file = Path(data_path) / "configs" / "plugins2config.yaml"
|
||
plugins2config_file.parent.mkdir(parents=True, exist_ok=True)
|
||
_data = {}
|
||
if plugins2config_file.exists():
|
||
_data = _yaml.load(open(plugins2config_file, "r", encoding="utf8"))
|
||
_matchers = get_matchers()
|
||
for matcher in _matchers:
|
||
_plugin = nonebot.plugin.get_plugin(matcher.module)
|
||
try:
|
||
_module = _plugin.module
|
||
except AttributeError:
|
||
continue
|
||
try:
|
||
plugin_version = _module.__getattribute__("__plugin_version__")
|
||
except AttributeError:
|
||
plugin_version = None
|
||
try:
|
||
plugin_configs = _module.__getattribute__("__plugin_configs__")
|
||
except AttributeError:
|
||
continue
|
||
# 插件配置版本更新或为Version为None或不在存储配置内
|
||
if (
|
||
plugin_version is None
|
||
or (
|
||
_data.get(matcher.module)
|
||
and _data[matcher.module].keys() != plugin_configs.keys()
|
||
)
|
||
or plugin_version > plugins_manager.get(matcher.module)["version"]
|
||
or matcher.module not in _data.keys()
|
||
):
|
||
for key in plugin_configs:
|
||
if isinstance(plugin_configs[key], dict):
|
||
Config.add_plugin_config(
|
||
matcher.module,
|
||
key,
|
||
plugin_configs[key].get("value"),
|
||
help_=plugin_configs[key].get("help"),
|
||
default_value=plugin_configs[key].get("default_value"),
|
||
_override=True,
|
||
)
|
||
else:
|
||
Config.add_plugin_config(matcher.module, key, plugin_configs[key])
|
||
else:
|
||
plugin_configs = _data[matcher.module]
|
||
for key in plugin_configs:
|
||
Config.add_plugin_config(
|
||
matcher.module,
|
||
key,
|
||
plugin_configs[key]["value"],
|
||
help_=plugin_configs[key]["help"],
|
||
default_value=plugin_configs[key]["default_value"],
|
||
_override=True,
|
||
)
|
||
if not Config.is_empty():
|
||
Config.save()
|
||
_data = round_trip_load(open(plugins2config_file, encoding="utf8"))
|
||
for plugin in _data.keys():
|
||
try:
|
||
plugin_name = plugins_manager.get(plugin)["plugin_name"]
|
||
except (AttributeError, TypeError):
|
||
plugin_name = plugin
|
||
_data[plugin].yaml_set_start_comment(plugin_name, indent=2)
|
||
# 初始化未设置的管理员权限等级
|
||
for k, v in Config.get_admin_level_data():
|
||
admin_manager.set_admin_level(k, v)
|
||
# 存完插件基本设置
|
||
with open(plugins2config_file, "w", encoding="utf8") as wf:
|
||
round_trip_dump(
|
||
_data, wf, indent=2, Dumper=yaml.RoundTripDumper, allow_unicode=True
|
||
)
|
||
# 再开始读取用户配置
|
||
user_config_file = Path() / "configs" / "config.yaml"
|
||
_data = {}
|
||
_tmp_data = {}
|
||
if user_config_file.exists():
|
||
with open(user_config_file, "r", encoding="utf8") as f:
|
||
_data = _yaml.load(f)
|
||
for plugin in Config.keys():
|
||
_tmp_data[plugin] = {}
|
||
for k in Config[plugin].keys():
|
||
if _data.get(plugin) and k in _data[plugin].keys():
|
||
Config.set_config(plugin, k, _data[plugin][k])
|
||
_tmp_data[plugin][k] = Config.get_config(plugin, k)
|
||
Config.save()
|
||
temp_file = Path() / "configs" / "temp_config.yaml"
|
||
try:
|
||
with open(temp_file, "w", encoding="utf8") as wf:
|
||
yaml.dump(
|
||
_tmp_data, wf, Dumper=yaml.RoundTripDumper, allow_unicode=True
|
||
)
|
||
with open(temp_file, "r", encoding="utf8") as rf:
|
||
_data = round_trip_load(rf)
|
||
# 添加注释
|
||
for plugin in _data.keys():
|
||
rst = ""
|
||
plugin_name = None
|
||
try:
|
||
plugin_data = Config.get(plugin)
|
||
for x in list(Config.get(plugin).keys()):
|
||
try:
|
||
_x = plugin_data[x].get("name")
|
||
if _x:
|
||
plugin_name = _x
|
||
except AttributeError:
|
||
pass
|
||
except (KeyError, AttributeError):
|
||
plugin_name = None
|
||
if not plugin_name:
|
||
try:
|
||
plugin_name = plugins_manager.get(plugin)["plugin_name"]
|
||
except (AttributeError, TypeError):
|
||
plugin_name = plugin
|
||
plugin_name = (
|
||
plugin_name.replace("[Hidden]", "")
|
||
.replace("[Superuser]", "")
|
||
.replace("[Admin]", "")
|
||
.strip()
|
||
)
|
||
rst += plugin_name + "\n"
|
||
for k in _data[plugin].keys():
|
||
rst += f'{k}: {Config[plugin][k]["help"]}' + "\n"
|
||
_data[plugin].yaml_set_start_comment(rst[:-1], indent=2)
|
||
with open(Path() / "configs" / "config.yaml", "w", encoding="utf8") as wf:
|
||
round_trip_dump(
|
||
_data, wf, Dumper=yaml.RoundTripDumper, allow_unicode=True
|
||
)
|
||
except Exception as e:
|
||
logger.error(f"生成简易配置注释错误 {type(e)}:{e}")
|
||
if temp_file.exists():
|
||
temp_file.unlink()
|