From 5ec14b72d022f51642699a7dd832bad87db5006d Mon Sep 17 00:00:00 2001 From: FuQuan233 Date: Tue, 30 Jun 2026 15:32:12 +0800 Subject: [PATCH 1/2] feat: Add a configuration option to control whether parser is enabled by default --- README.md | 3 + src/nonebot_plugin_parser/config.py | 7 ++ src/nonebot_plugin_parser/matchers/filter.py | 99 ++++++++++++++------ 3 files changed, 80 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 883fe4c6..9e7cb196 100644 --- a/README.md +++ b/README.md @@ -262,6 +262,9 @@ parser_emoji_cdn="https://emojicdn.elk.sh" # [可选] emoji 渲染样式 "apple", "google", "twitter", "facebook"(默认) parser_emoji_style="facebook" + +# [可选] 是否默认在群聊中启用接卸,默认启用 +parser_enable_by_default=True ``` diff --git a/src/nonebot_plugin_parser/config.py b/src/nonebot_plugin_parser/config.py index a7da408a..f9fd723f 100644 --- a/src/nonebot_plugin_parser/config.py +++ b/src/nonebot_plugin_parser/config.py @@ -56,6 +56,8 @@ class Config(BaseModel): """Pilmoji 表情 CDN""" parser_emoji_style: EmojiStyle = EmojiStyle.FACEBOOK """Pilmoji 表情样式""" + parser_enable_by_default: bool = True + """是否默认启用解析器""" @property def nickname(self) -> str: @@ -181,6 +183,11 @@ def emoji_cdn(self) -> str: def emoji_style(self) -> EmojiStyle: """Pilmoji 表情样式""" return self.parser_emoji_style + + @property + def enable_by_default(self) -> bool: + """是否默认启用解析器""" + return self.parser_enable_by_default pconfig: Config = get_plugin_config(Config) diff --git a/src/nonebot_plugin_parser/matchers/filter.py b/src/nonebot_plugin_parser/matchers/filter.py index 43b51330..9dd8fd9e 100644 --- a/src/nonebot_plugin_parser/matchers/filter.py +++ b/src/nonebot_plugin_parser/matchers/filter.py @@ -1,7 +1,8 @@ import json +from dataclasses import dataclass, asdict from pathlib import Path -from nonebot import on_command +from nonebot import logger, on_command from nonebot.rule import to_me from nonebot.matcher import Matcher from nonebot.permission import SUPERUSER @@ -9,24 +10,66 @@ from ..config import pconfig -_DISABLED_GROUPS_PATH: Path = pconfig.data_dir / "disabled_groups.json" +@dataclass +class GroupConfig: + """群组配置""" + enabled: bool = True -def load_or_initialize_set() -> set[str]: - """加载或初始化关闭解析的名单""" - # 判断是否存在 - if not _DISABLED_GROUPS_PATH.exists(): - _DISABLED_GROUPS_PATH.write_text(json.dumps([])) - return set(json.loads(_DISABLED_GROUPS_PATH.read_text())) +_GROUP_CONFIG_PATH: Path = pconfig.data_dir / "group_config.json" +_DISABLED_GROUPS_PATH: Path = pconfig.data_dir / "disabled_groups.json" -def save_disabled_groups(): - """保存关闭解析的名单""" - _DISABLED_GROUPS_PATH.write_text(json.dumps(list(_DISABLED_GROUPS_SET))) +def load_or_initialize_group_config() -> dict[str, GroupConfig]: + """加载或初始化群组配置 -# 内存中关闭解析的名单,第一次先进行初始化 -_DISABLED_GROUPS_SET: set[str] = load_or_initialize_set() + 检测并迁移旧版的禁用群组配置(disabled_groups.json), + 迁移后删除旧版配置文件。 + """ + # 检测旧版禁用群组配置并迁移 + if _DISABLED_GROUPS_PATH.exists(): + old_disabled: list[str] = json.loads(_DISABLED_GROUPS_PATH.read_text()) + logger.info(f"检测到旧版禁用群组配置,共 {len(old_disabled)} 个群组,正在迁移...") + result: dict[str, GroupConfig] = {} + for group_key in old_disabled: + result[group_key] = GroupConfig(enabled=False) + # 保存为新版配置 + _save_group_config_to_file(result) + # 删除旧版配置文件 + _DISABLED_GROUPS_PATH.unlink() + logger.info("旧版禁用群组配置迁移完成,已删除旧文件") + return result + + if not _GROUP_CONFIG_PATH.exists(): + _GROUP_CONFIG_PATH.write_text(json.dumps({})) + return {} + + raw: dict = json.loads(_GROUP_CONFIG_PATH.read_text()) + return { + k: GroupConfig(**v) if isinstance(v, dict) else GroupConfig(enabled=v) + for k, v in raw.items() + } + + +def _save_group_config_to_file(group_config: dict[str, GroupConfig]): + """将群组配置写入文件""" + _GROUP_CONFIG_PATH.write_text( + json.dumps( + {k: asdict(v) for k, v in group_config.items()}, + indent=4, + ensure_ascii=False, + ) + ) + + +def save_group_config(group_config: dict[str, GroupConfig]): + """保存群组配置""" + _save_group_config_to_file(group_config) + + +# 群组配置,第一次先进行初始化 +_GROUP_CONFIG: dict[str, GroupConfig] = load_or_initialize_group_config() def get_group_key(session: Session) -> str: @@ -38,35 +81,33 @@ def get_group_key(session: Session) -> str: def is_enabled(session: Session = UniSession()) -> bool: - """判断当前会话是否在关闭解析的名单中""" + """判断当前会话是否启用解析""" if session.scene.is_private: return True group_key = get_group_key(session) - if group_key in _DISABLED_GROUPS_SET: - return False - return True + if group_key in _GROUP_CONFIG: + return _GROUP_CONFIG[group_key].enabled + return pconfig.parser_enable_by_default @on_command("开启解析", rule=to_me(), permission=SUPERUSER | ADMIN(), block=True).handle() -async def _(matcher: Matcher, session: Session = UniSession()): +async def _enable_parser(matcher: Matcher, session: Session = UniSession()): """开启解析""" group_key = get_group_key(session) - if group_key in _DISABLED_GROUPS_SET: - _DISABLED_GROUPS_SET.remove(group_key) - save_disabled_groups() - await matcher.finish("解析已开启") - else: + if group_key in _GROUP_CONFIG and _GROUP_CONFIG[group_key].enabled: await matcher.finish("解析已开启,无需重复开启") + _GROUP_CONFIG[group_key] = GroupConfig(enabled=True) + save_group_config(_GROUP_CONFIG) + await matcher.finish("解析已开启") @on_command("关闭解析", rule=to_me(), permission=SUPERUSER | ADMIN(), block=True).handle() -async def _(matcher: Matcher, session: Session = UniSession()): +async def _disable_parser(matcher: Matcher, session: Session = UniSession()): """关闭解析""" group_key = get_group_key(session) - if group_key not in _DISABLED_GROUPS_SET: - _DISABLED_GROUPS_SET.add(group_key) - save_disabled_groups() - await matcher.finish("解析已关闭") - else: + if group_key in _GROUP_CONFIG and not _GROUP_CONFIG[group_key].enabled: await matcher.finish("解析已关闭,无需重复关闭") + _GROUP_CONFIG[group_key] = GroupConfig(enabled=False) + save_group_config(_GROUP_CONFIG) + await matcher.finish("解析已关闭") From 4315cdcc1be99afae0cb521bea45abf4831570c3 Mon Sep 17 00:00:00 2001 From: FuQuan233 Date: Tue, 30 Jun 2026 15:52:09 +0800 Subject: [PATCH 2/2] chore: fix lint errors --- src/nonebot_plugin_parser/config.py | 2 +- src/nonebot_plugin_parser/matchers/filter.py | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/nonebot_plugin_parser/config.py b/src/nonebot_plugin_parser/config.py index f9fd723f..1d46c6fc 100644 --- a/src/nonebot_plugin_parser/config.py +++ b/src/nonebot_plugin_parser/config.py @@ -183,7 +183,7 @@ def emoji_cdn(self) -> str: def emoji_style(self) -> EmojiStyle: """Pilmoji 表情样式""" return self.parser_emoji_style - + @property def enable_by_default(self) -> bool: """是否默认启用解析器""" diff --git a/src/nonebot_plugin_parser/matchers/filter.py b/src/nonebot_plugin_parser/matchers/filter.py index 9dd8fd9e..28afa374 100644 --- a/src/nonebot_plugin_parser/matchers/filter.py +++ b/src/nonebot_plugin_parser/matchers/filter.py @@ -1,6 +1,6 @@ import json -from dataclasses import dataclass, asdict from pathlib import Path +from dataclasses import asdict, dataclass from nonebot import logger, on_command from nonebot.rule import to_me @@ -14,6 +14,7 @@ @dataclass class GroupConfig: """群组配置""" + enabled: bool = True @@ -46,10 +47,7 @@ def load_or_initialize_group_config() -> dict[str, GroupConfig]: return {} raw: dict = json.loads(_GROUP_CONFIG_PATH.read_text()) - return { - k: GroupConfig(**v) if isinstance(v, dict) else GroupConfig(enabled=v) - for k, v in raw.items() - } + return {k: GroupConfig(**v) if isinstance(v, dict) else GroupConfig(enabled=v) for k, v in raw.items()} def _save_group_config_to_file(group_config: dict[str, GroupConfig]):