From 5c695899a14c801d4686a40ae0b79a6dfecf612d Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Sun, 21 Aug 2022 18:09:31 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=B0=86=E9=85=8D=E7=BD=AE=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E5=8A=A0=E5=85=A5=E5=8D=95=E6=AC=A1=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=EF=BC=8C=E6=8F=90=E9=AB=98=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E9=80=9F=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 + basic_plugins/init_plugin_config/__init__.py | 3 +- .../init_none_plugin_count_manager.py | 1 - .../init_plugin_config/init_plugins_config.py | 167 ++++++++++-------- .../init_plugins_resources.py | 16 +- .../init_plugins_settings.py | 18 +- configs/utils/__init__.py | 33 ++-- plugins/word_bank/_model.py | 8 +- 8 files changed, 132 insertions(+), 116 deletions(-) diff --git a/README.md b/README.md index 93a13e06..11a22ccf 100644 --- a/README.md +++ b/README.md @@ -281,6 +281,8 @@ PS: **ARM平台** 请使用全量版 同时 **如果你的机器 RAM < 1G 可能 * 开箱提供重置开箱命令,重置今日所有开箱数据(重置次数,并不会删除今日已开箱记录) * 提供全局字典GDict,通过from utils.manager import GDict导入 * 适配omega 13w张图的数据结构表(建议删表重导) +* 除首次启动外将配置替换加入单次定时任务,提高启动速度 +* fix: WordBank.check() [@pull/1008](https://github.com/HibiKier/zhenxun_bot/pull/1008) * 改进插件 `我有一个朋友`,避免触发过于频繁 [@pull/1001](https://github.com/HibiKier/zhenxun_bot/pull/1001) * 原神便笺新增洞天宝钱和参量质变仪提示 [@pull/1005](https://github.com/HibiKier/zhenxun_bot/pull/1005) * 新增米游社签到功能,自动领取(白嫖)米游币 [@pull/991](https://github.com/HibiKier/zhenxun_bot/pull/991) diff --git a/basic_plugins/init_plugin_config/__init__.py b/basic_plugins/init_plugin_config/__init__.py index 65d9d63d..94984da9 100755 --- a/basic_plugins/init_plugin_config/__init__.py +++ b/basic_plugins/init_plugin_config/__init__.py @@ -14,7 +14,6 @@ from .check_plugin_status import check_plugin_status from nonebot.adapters.onebot.v11 import Bot from configs.path_config import DATA_PATH from services.log import logger -from pathlib import Path from nonebot import Driver import nonebot @@ -28,7 +27,7 @@ driver: Driver = nonebot.get_driver() @driver.on_startup -def _(): +async def _(): """ 初始化数据 """ diff --git a/basic_plugins/init_plugin_config/init_none_plugin_count_manager.py b/basic_plugins/init_plugin_config/init_none_plugin_count_manager.py index 9c5d07d5..c612ae71 100755 --- a/basic_plugins/init_plugin_config/init_none_plugin_count_manager.py +++ b/basic_plugins/init_plugin_config/init_none_plugin_count_manager.py @@ -5,7 +5,6 @@ from utils.manager import ( plugins2settings_manager, plugins2block_manager, plugins_manager, - resources_manager ) from services.log import logger from utils.utils import get_matchers diff --git a/basic_plugins/init_plugin_config/init_plugins_config.py b/basic_plugins/init_plugin_config/init_plugins_config.py index b3ce429d..d95348f9 100755 --- a/basic_plugins/init_plugin_config/init_plugins_config.py +++ b/basic_plugins/init_plugin_config/init_plugins_config.py @@ -1,3 +1,5 @@ +import asyncio +from datetime import datetime, timedelta from pathlib import Path from ruamel.yaml import round_trip_load, round_trip_dump, YAML from utils.manager import admin_manager, plugins_manager @@ -5,6 +7,7 @@ from configs.config import Config from services.log import logger from utils.text_utils import prompt2cn from utils.utils import get_matchers +from utils.utils import scheduler from ruamel import yaml @@ -104,78 +107,96 @@ def init_plugins_config(data_path): 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(): - try: - if _data.get(plugin) and k in _data[plugin].keys(): - Config.set_config(plugin, k, _data[plugin][k]) - if level2module := Config.get_level2module(plugin, k): - try: - admin_manager.set_admin_level( - level2module, _data[plugin][k] - ) - except KeyError: - logger.warning( - f"{level2module} 设置权限等级失败:{_data[plugin][k]}" - ) - _tmp_data[plugin][k] = Config.get_config(plugin, k) - except AttributeError as e: - raise AttributeError( - f"{e}\n" + prompt2cn("可能为config.yaml配置文件填写不规范", 46) - ) - 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()): + user_config_file = Path() / "configs" / "config.yaml" + if not user_config_file.exists(): + _replace_config() + else: + logger.info('五分钟后将进行配置数据替换,请注意...') + scheduler.add_job( + _replace_config, + "date", + run_date=datetime.now() + timedelta(minutes=5), + id=f"_replace_config" + ) + + +def _replace_config(): + """ + 说明: + 定时任务加载的配置读取替换 + """ + # 再开始读取用户配置 + 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(): + try: + if _data.get(plugin) and k in _data[plugin].keys(): + Config.set_config(plugin, k, _data[plugin][k]) + if level2module := Config.get_level2module(plugin, k): 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: + admin_manager.set_admin_level( + level2module, _data[plugin][k] + ) + except KeyError: + logger.warning( + f"{level2module} 设置权限等级失败:{_data[plugin][k]}" + ) + _tmp_data[plugin][k] = Config.get_config(plugin, k) + except AttributeError as e: + raise AttributeError( + f"{e}\n" + prompt2cn("可能为config.yaml配置文件填写不规范", 46) + ) + 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: - 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() + _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() diff --git a/basic_plugins/init_plugin_config/init_plugins_resources.py b/basic_plugins/init_plugin_config/init_plugins_resources.py index 0285f293..b69bb59b 100755 --- a/basic_plugins/init_plugin_config/init_plugins_resources.py +++ b/basic_plugins/init_plugin_config/init_plugins_resources.py @@ -26,18 +26,8 @@ def init_plugins_resources(): else: path = Path(_module.__getattribute__("__file__")).parent for resource in resources.keys(): - resources_manager.add_resource(matcher.plugin_name, path / resource, resources[resource]) + resources_manager.add_resource( + matcher.plugin_name, path / resource, resources[resource] + ) resources_manager.save() resources_manager.start_move() - - - - - - - - - - - - diff --git a/basic_plugins/init_plugin_config/init_plugins_settings.py b/basic_plugins/init_plugin_config/init_plugins_settings.py index 004c2449..86a7eb3d 100755 --- a/basic_plugins/init_plugin_config/init_plugins_settings.py +++ b/basic_plugins/init_plugin_config/init_plugins_settings.py @@ -24,7 +24,11 @@ def init_plugins_settings(data_path: str): _plugin = nonebot.plugin.get_plugin(x) _module = _plugin.module metadata = _plugin.metadata - plugin_name = metadata.name if metadata else _module.__getattribute__("__zx_plugin_name__") + plugin_name = ( + metadata.name + if metadata + else _module.__getattribute__("__zx_plugin_name__") + ) _tmp_module[x] = plugin_name except (KeyError, AttributeError) as e: logger.warning(f"配置文件 模块:{x} 获取 plugin_name 失败...{e}") @@ -77,11 +81,9 @@ def init_plugins_settings(data_path: str): "__plugin_settings__" ) except AttributeError: - plugin_settings = { - "cmd": [matcher.plugin_name, plugin_name] - } - if not plugin_settings.get('cost_gold'): - plugin_settings['cost_gold'] = 0 + plugin_settings = {"cmd": [matcher.plugin_name, plugin_name]} + if not plugin_settings.get("cost_gold"): + plugin_settings["cost_gold"] = 0 if ( plugin_settings.get("cmd") is not None and plugin_name not in plugin_settings["cmd"] @@ -99,9 +101,7 @@ def init_plugins_settings(data_path: str): ) else: try: - plugin_type = _module.__getattribute__( - "__plugin_type__" - ) + plugin_type = _module.__getattribute__("__plugin_type__") except AttributeError: plugin_type = ("normal",) if plugin_settings and matcher.plugin_name: diff --git a/configs/utils/__init__.py b/configs/utils/__init__.py index 6bd86bba..4ee7ce08 100644 --- a/configs/utils/__init__.py +++ b/configs/utils/__init__.py @@ -94,7 +94,7 @@ class ConfigsManager: del self._data[module] self.save() - def set_config(self, module: str, key: str, value: Any , save_simple_data: bool = False): + def set_config(self, module: str, key: str, value: Any, save_simple_data: bool = False): """ 设置配置值 :param module: 模块名 @@ -109,7 +109,7 @@ class ConfigsManager: ): self._data[module][key]["value"] = value self._simple_data[module][key] = value - self.save(save_simple_data = save_simple_data) + self.save(save_simple_data=save_simple_data) def set_help(self, module: str, key: str, help_: str): """ @@ -145,12 +145,18 @@ class ConfigsManager: :param default: 没有key值内容的默认返回值 """ key = key.upper() - if module in self._data.keys(): + # 优先使用simple_data + if module in self._simple_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 self._simple_data[module].get(key) is not None: + return self._simple_data[module][key] + # if module in self._data.keys(): + # 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]["value"] + # return self._data[module][key]["default_value"] if default is not None: return default return None @@ -200,13 +206,12 @@ class ConfigsManager: 重新加载配置文件 """ _yaml = YAML() - temp_file = Path() / "configs" / "config.yaml" - if temp_file.exists(): - with open(temp_file, "r", encoding="utf8") as f: - temp = _yaml.load(f) - for key in temp.keys(): - for k in temp[key].keys(): - self._data[key][k]["value"] = temp[key][k] + 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): diff --git a/plugins/word_bank/_model.py b/plugins/word_bank/_model.py index b236c711..67ee7f27 100644 --- a/plugins/word_bank/_model.py +++ b/plugins/word_bank/_model.py @@ -238,14 +238,14 @@ class WordBank(db.Model): return query.where(cls.problem == problem) # 正则匹配 if await db.first( - db.text(sql_text + f" and word_type = 2 and '{problem}' ~ problem;") + db.text(sql_text + f" and word_type = 2 and word_scope != 999 and '{problem}' ~ problem;") ): - return sql_text + f" and word_type = 2 and '{problem}' ~ problem;" + return sql_text + f" and word_type = 2 and word_scope != 999 and '{problem}' ~ problem;" # 模糊匹配 if await db.first( - db.text(sql_text + f" and word_type = 1 and '{problem}' ~ problem;") + db.text(sql_text + f" and word_type = 1 and word_scope != 999 and '{problem}' ~ problem;") ): - return sql_text + f" and word_type = 1 and '{problem}' ~ problem;" + return sql_text + f" and word_type = 1 and word_scope != 999 and '{problem}' ~ problem;" return None @classmethod From d1839039172b111660b6de5f4ab219cb5d6d9244 Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Sun, 21 Aug 2022 18:15:18 +0800 Subject: [PATCH 2/6] update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 11a22ccf..94b2b25e 100644 --- a/README.md +++ b/README.md @@ -281,7 +281,7 @@ PS: **ARM平台** 请使用全量版 同时 **如果你的机器 RAM < 1G 可能 * 开箱提供重置开箱命令,重置今日所有开箱数据(重置次数,并不会删除今日已开箱记录) * 提供全局字典GDict,通过from utils.manager import GDict导入 * 适配omega 13w张图的数据结构表(建议删表重导) -* 除首次启动外将配置替换加入单次定时任务,提高启动速度 +* 除首次启动外将配置替换加入单次定时任务,加快启动速度 * fix: WordBank.check() [@pull/1008](https://github.com/HibiKier/zhenxun_bot/pull/1008) * 改进插件 `我有一个朋友`,避免触发过于频繁 [@pull/1001](https://github.com/HibiKier/zhenxun_bot/pull/1001) * 原神便笺新增洞天宝钱和参量质变仪提示 [@pull/1005](https://github.com/HibiKier/zhenxun_bot/pull/1005) From 2051e8183c74f0e7d6361a1e2d82125813366fcd Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Sun, 21 Aug 2022 18:32:24 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E8=AF=8D=E6=9D=A1=E6=A8=A1=E7=B3=8A?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E4=BD=BF=E7=94=A8contains=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/coser/__init__.py | 4 ++-- plugins/quotations.py | 4 ++-- plugins/word_bank/_model.py | 14 ++++++++------ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/plugins/coser/__init__.py b/plugins/coser/__init__.py index cb8c98ff..6bf55eed 100755 --- a/plugins/coser/__init__.py +++ b/plugins/coser/__init__.py @@ -36,7 +36,7 @@ __plugin_configs__ = { }, } -coser = on_regex(r"^(\d?)连?(cos|COS|coser|括丝)$", priority=5, block=True) +coser = on_regex(r"^(\d)?连?(cos|COS|coser|括丝)$", priority=5, block=True) # 纯cos,较慢:https://picture.yinux.workers.dev # 比较杂,有福利姬,较快:https://api.jrsgslb.cn/cos/url.php?return=img @@ -44,7 +44,7 @@ url = "https://picture.yinux.workers.dev/" @coser.handle() -async def _(bot: Bot, event: MessageEvent, reg_group: Tuple[Any, ...] = RegexGroup()): +async def _(event: MessageEvent, reg_group: Tuple[Any, ...] = RegexGroup()): num = reg_group[0] or 1 for _ in range(int(num)): try: diff --git a/plugins/quotations.py b/plugins/quotations.py index d3c5f96e..af4ee144 100755 --- a/plugins/quotations.py +++ b/plugins/quotations.py @@ -1,4 +1,4 @@ -from nonebot import on_command +from nonebot import on_regex from services.log import logger from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent from nonebot.typing import T_State @@ -24,7 +24,7 @@ __plugin_settings__ = { } -quotations = on_command("语录", aliases={"二次元", "二次元语录"}, priority=5, block=True) +quotations = on_regex("^[语录|二次元]$", priority=5, block=True) url = "https://international.v1.hitokoto.cn/?c=a" diff --git a/plugins/word_bank/_model.py b/plugins/word_bank/_model.py index 67ee7f27..c200c9c9 100644 --- a/plugins/word_bank/_model.py +++ b/plugins/word_bank/_model.py @@ -236,17 +236,19 @@ class WordBank(db.Model): # 完全匹配 if await query.where(cls.problem == problem).gino.first(): return query.where(cls.problem == problem) + # 模糊匹配 + if await query.where(cls.problem.contains(problem)).gino.first(): + return query.where(cls.problem.contains(problem)) # 正则匹配 if await db.first( db.text(sql_text + f" and word_type = 2 and word_scope != 999 and '{problem}' ~ problem;") ): return sql_text + f" and word_type = 2 and word_scope != 999 and '{problem}' ~ problem;" - # 模糊匹配 - if await db.first( - db.text(sql_text + f" and word_type = 1 and word_scope != 999 and '{problem}' ~ problem;") - ): - return sql_text + f" and word_type = 1 and word_scope != 999 and '{problem}' ~ problem;" - return None + # if await db.first( + # db.text(sql_text + f" and word_type = 1 and word_scope != 999 and '{problem}' ~ problem;") + # ): + # return sql_text + f" and word_type = 1 and word_scope != 999 and '{problem}' ~ problem;" + # return None @classmethod async def get_answer( From 482cc242cbdb5ae542c8ab9146668b875a7611a1 Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Sun, 21 Aug 2022 18:41:13 +0800 Subject: [PATCH 4/6] UPDATE README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 94b2b25e..7dd216e2 100644 --- a/README.md +++ b/README.md @@ -252,8 +252,10 @@ PS: **ARM平台** 请使用全量版 同时 **如果你的机器 RAM < 1G 可能 ### 感谢名单 (可以告诉我你的 __github__ 地址,我偷偷换掉0v|) -[爱发电用户_b9S4](https://afdian.net/u/3d8f30581a2911edba6d52540025c377) -[爱发电用户_c58s](https://afdian.net/u/a6ad8dda195e11ed9a4152540025c377) +[烟寒若雨](https://afdian.net/u/067bd2161eec11eda62b52540025c377) +[ln](https://afdian.net/u/b51914ba1c6611ed8a4e52540025c377) +[爱发电用户_b9S4](https://afdian.net/u/3d8f30581a2911edba6d52540025c377) +[爱发电用户_c58s](https://afdian.net/u/a6ad8dda195e11ed9a4152540025c377) [爱发电用户_eNr9](https://afdian.net/u/05fdb41c0c9a11ed814952540025c377) [MangataAkihi](https://github.com/Sakuracio) [炀](https://afdian.net/u/69b76e9ec77b11ec874f52540025c377) From 64d8543af9927d2cba438df90d4715eae99fcc3f Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Sun, 21 Aug 2022 18:42:16 +0800 Subject: [PATCH 5/6] UPDATE __version__ --- __version__ | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__version__ b/__version__ index 40fdec5e..55b98167 100644 --- a/__version__ +++ b/__version__ @@ -1 +1 @@ -__version__: v0.1.6.2 +__version__: v0.1.6.3 From 8697670fe1ef7ecd3e3a86ae540adb43001016d3 Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Sun, 21 Aug 2022 18:43:58 +0800 Subject: [PATCH 6/6] UPDATE README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7dd216e2..6897db24 100644 --- a/README.md +++ b/README.md @@ -275,7 +275,7 @@ PS: **ARM平台** 请使用全量版 同时 **如果你的机器 RAM < 1G 可能 ## 更新 -### 2022/8/21 +### 2022/8/21 \[v0.1.6.3] * 重构群词条,改为词库Plus,增加 精准|模糊|正则 问题匹配,问题与回答均支持at,image,face,超级用户额外提供 全局|私聊 词库设置,数据迁移目前只提供了问题和回答都是纯文本的词条 * 修复b站转发解析av号无法解析