zhenxun_bot/basic_plugins/init_plugin_config/init_plugins_settings.py

129 lines
6.2 KiB
Python
Raw Normal View History

2021-11-23 21:44:59 +08:00
from pathlib import Path
from ruamel.yaml import round_trip_load, round_trip_dump, YAML
from utils.manager import plugins2settings_manager, admin_manager
from services.log import logger
from utils.utils import get_matchers
from ruamel import yaml
import nonebot
_yaml = YAML(typ="safe")
def init_plugins_settings(data_path: str):
"""
初始化插件设置从插件中获取 __zx_plugin_name____plugin_cmd____plugin_settings__
"""
2022-02-19 18:20:19 +08:00
plugins2settings_file = data_path / "configs" / "plugins2settings.yaml"
2021-11-23 21:44:59 +08:00
plugins2settings_file.parent.mkdir(exist_ok=True, parents=True)
_matchers = get_matchers()
_tmp_module = {}
_tmp = []
for x in plugins2settings_manager.keys():
try:
_plugin = nonebot.plugin.get_plugin(x)
_module = _plugin.module
plugin_name = _module.__getattribute__("__zx_plugin_name__")
_tmp_module[x] = plugin_name
except (KeyError, AttributeError) as e:
2021-12-01 14:03:34 +08:00
logger.warning(f"配置文件 模块:{x} 获取 plugin_name 失败...{e}")
2021-11-23 21:44:59 +08:00
_tmp_module[x] = ""
for matcher in _matchers:
2022-02-19 18:20:19 +08:00
if matcher.plugin_name not in plugins2settings_manager.keys():
_plugin = nonebot.plugin.get_plugin(matcher.plugin_name)
2021-11-23 21:44:59 +08:00
try:
_module = _plugin.module
except AttributeError:
2022-02-19 18:20:19 +08:00
logger.warning(f"插件 {matcher.plugin_name} 加载失败...,插件控制未加载.")
2021-11-23 21:44:59 +08:00
else:
try:
plugin_name = _module.__getattribute__("__zx_plugin_name__")
if "[admin]" in plugin_name.lower():
try:
admin_settings = _module.__getattribute__(
"__plugin_settings__"
)
level = admin_settings["admin_level"]
cmd = admin_settings.get("cmd")
except (AttributeError, KeyError):
level = 5
cmd = None
if level is None:
level = 5
admin_manager.add_admin_plugin_settings(
2022-02-19 18:20:19 +08:00
matcher.plugin_name, cmd, level
2021-11-23 21:44:59 +08:00
)
if (
"[hidden]" in plugin_name.lower()
or "[admin]" in plugin_name.lower()
or "[superuser]" in plugin_name.lower()
2022-02-19 18:20:19 +08:00
or matcher.plugin_name in plugins2settings_manager.keys()
2021-11-23 21:44:59 +08:00
):
continue
except AttributeError:
2022-02-19 18:20:19 +08:00
if matcher.plugin_name not in _tmp:
2021-11-23 21:44:59 +08:00
logger.warning(
2022-02-19 18:20:19 +08:00
f"获取插件 {matcher.plugin_name} __zx_plugin_name__ 失败...,插件控制未加载."
2021-11-23 21:44:59 +08:00
)
else:
try:
2022-02-19 18:20:19 +08:00
_tmp_module[matcher.plugin_name] = plugin_name
2021-11-23 21:44:59 +08:00
plugin_settings = _module.__getattribute__(
"__plugin_settings__"
)
2022-01-05 22:32:59 +08:00
if plugin_settings.get('cost_gold') is None:
plugin_settings['cost_gold'] = 0
2021-11-23 21:44:59 +08:00
if (
2022-04-04 20:33:37 +08:00
plugin_settings.get("cmd") is not None
2021-11-23 21:44:59 +08:00
and plugin_name not in plugin_settings["cmd"]
):
plugin_settings["cmd"].append(plugin_name)
if plugins2settings_manager.get(
2022-02-19 18:20:19 +08:00
matcher.plugin_name
) and plugins2settings_manager[matcher.plugin_name].get(
2021-11-23 21:44:59 +08:00
"plugin_type"
):
plugin_type = tuple(
plugins2settings_manager.get_plugin_data(
2022-02-19 18:20:19 +08:00
matcher.plugin_name
2021-11-23 21:44:59 +08:00
)["plugin_type"]
)
else:
try:
plugin_type = _module.__getattribute__(
"__plugin_type__"
)
except AttributeError:
plugin_type = ("normal",)
2022-02-19 18:20:19 +08:00
if plugin_settings and matcher.plugin_name:
2021-11-23 21:44:59 +08:00
plugins2settings_manager.add_plugin_settings(
2022-02-19 18:20:19 +08:00
matcher.plugin_name,
2021-11-23 21:44:59 +08:00
plugin_type=plugin_type,
2022-01-05 22:32:59 +08:00
**plugin_settings,
2021-11-23 21:44:59 +08:00
)
except AttributeError:
pass
2022-02-19 18:20:19 +08:00
_tmp.append(matcher.plugin_name)
2021-11-23 21:44:59 +08:00
_tmp_data = {"PluginSettings": plugins2settings_manager.get_data()}
with open(plugins2settings_file, "w", encoding="utf8") as wf:
yaml.dump(_tmp_data, wf, Dumper=yaml.RoundTripDumper, allow_unicode=True)
_data = round_trip_load(open(plugins2settings_file, encoding="utf8"))
_data["PluginSettings"].yaml_set_start_comment(
"""# 模块与对应命令和对应群权限
# 用于生成帮助图片 和 开关功能
# key模块名称
# level需要的群等级
# default_status加入群时功能的默认开关状态
# limit_superuser: 功能状态是否限制超级用户
# cmd: 关闭[cmd] 都会触发命令 关闭对应功能cmd列表第一个词为统计的功能名称
# plugin_type: 帮助类别 示例:('原神相关',) 或 ('原神相关', 1)1代表帮助命令列向排列否则为横向排列""",
indent=2,
)
for plugin in _data["PluginSettings"].keys():
_data["PluginSettings"][plugin].yaml_set_start_comment(
f"{plugin}{_tmp_module[plugin]}", indent=2
)
with open(plugins2settings_file, "w", encoding="utf8") as wf:
round_trip_dump(_data, wf, Dumper=yaml.RoundTripDumper, allow_unicode=True)
logger.info(f"已成功加载 {len(plugins2settings_manager.get_data())} 个非限制插件.")