Files
Mofox-Core/changelogs/changes.md
Windpicker-owo ca14904076 refactor(notice): 移除硬编码的notice作用域判定逻辑
- 重构notice系统,作用域完全由additional_config中的is_public_notice字段决定
- 移除_determine_notice_scope方法中的硬编码notice类型检查
- 提供更灵活和可控的notice管理方式,支持显式配置公共notice
- 更新相关文档说明新的使用方式

BREAKING CHANGE: 之前依赖特定notice类型自动成为公共notice的插件需要显式设置is_public_notice=true
2025-10-19 23:34:38 +08:00

6.4 KiB
Raw Permalink Blame History

Notice 系统重构 (2025-10-19)

🔧 核心改进

  1. 移除硬编码的 Notice 类型判定

    • 之前某些 notice_type 会被硬编码为公共 noticegroup_whole_bansystem_announcement 等)
    • 现在 notice 的作用域完全由 additional_config 中的 is_public_notice 字段决定
    • 提供了更灵活和可控的 notice 管理方式
  2. 修改的文件

    • src/chat/message_manager/message_manager.py: 移除 _determine_notice_scope 方法中的硬编码逻辑
    • src/chat/utils/prompt_params.py: 添加缺失的 notice_block 字段
  3. 新增文档

    • docs/guides/notice_system_guide.md: 完整的 Notice 系统使用指南

💡 使用方式

流级 Notice默认

additional_config = {
    "is_notice": True,
    "is_public_notice": False,  # 或者不设置
    "notice_type": "group_ban"
}

公共 Notice

additional_config = {
    "is_notice": True,
    "is_public_notice": True,  # 显式设置为公共
    "notice_type": "system_announcement"
}

⚠️ 迁移注意

如果你的插件依赖以下 notice 类型自动成为公共 notice

  • group_whole_ban
  • group_whole_lift_ban
  • system_announcement
  • platform_maintenance

请在 additional_config 中显式添加 "is_public_notice": True


插件API与规范修改

  1. 现在plugin_system__init__.py文件中包含了所有插件API的导入用户可以直接使用from src.plugin_system import *来导入所有API。

  2. register_plugin函数现在转移到了plugin_system.apis.plugin_register_api模块中,用户可以通过from src.plugin_system.apis.plugin_register_api import register_plugin来导入。

  • 顺便一提按照1中说法你可以这么用
    from src.plugin_system import register_plugin
    
  1. 现在强制要求的property如下即你必须覆盖的属性有
  • plugin_name: 插件名称,必须是唯一的。(与文件夹相同)
  • enable_plugin: 是否启用插件,默认为True
  • dependencies: 插件依赖的其他插件列表,默认为空。现在并不检查(也许)
  • python_dependencies: 插件依赖的Python包列表默认为空。现在并不检查
  • config_file_name: 插件配置文件名,默认为config.toml
  • config_schema: 插件配置文件的schema用于自动生成配置文件。
  1. 部分API的参数类型和返回值进行了调整
  • chat_api.py中获取流的参数中可以使用一个特殊的枚举类型来获得所有平台的 ChatStream 了。
  • config_api.py中的get_global_configget_plugin_config方法现在支持嵌套访问的配置键名。
  • database_api.py中的db_query方法调整了参数顺序以增强参数限制的同时保证了typing正确db_get方法增加了single_result参数,与db_query保持一致。
  1. 增加了logging_api,可以用get_logger来获取日志记录器。
  2. 增加了插件和组件管理的API。
  3. BaseCommandexecute方法现在返回一个三元组,包含是否执行成功、可选的回复消息和是否拦截消息。
  • 这意味着你终于可以动态控制是否继续后续消息的处理了。
  1. 移除了dependency_manager但是依然保留了python_dependencies属性,等待后续重构。
  • 一并移除了文档有关manager的内容。
  1. 增加了工具的有关api

插件系统修改

  1. 现在所有的匹配模式不再是关键字了,而是枚举类。(可能有遗漏)
  2. 修复了一下显示插件信息不显示的问题。同时精简了一下显示内容
  3. 修复了插件系统混用了plugin_namedisplay_name的问题。现在所有的插件信息都使用display_name来显示,而内部标识仍然使用plugin_name
  4. 现在增加了参数类型检查,完善了对应注释
  5. 现在插件抽象出了总基类 PluginBase
  • 基于ActionCommand的插件基类现在为BasePlugin
  • 基于Event的插件基类现在为BaseEventPlugin
  • 基于ActionCommandEvent的插件基类现在为BasePlugin,所有插件都应该继承此基类。
  • BasePlugin继承自PluginBase
  • 所有的插件类都由register_plugin装饰器注册。
  1. 现在我们终于可以让插件有自定义的名字了!
  • 真正实现了插件的plugin_name不受文件夹名称限制的功能。(吐槽:可乐你的某个小小细节导致我搞了好久……)
  • 通过在插件类中定义plugin_name属性来指定插件内部标识符。
  • 由于此更改一个文件中现在可以有多个插件类,但每个插件类必须有唯一的plugin_name
  • 在某些插件加载失败时,现在会显示包名而不是插件内部标识符。
    • 例如:MaiMBot.plugins.example_plugin而不是example_plugin
    • 仅在插件 import 失败时会如此,正常注册过程中失败的插件不会显示包名,而是显示插件内部标识符。(这是特性,但是基本上不可能出现这个情况)
  1. 现在不支持单文件插件了,加载方式已经完全删除。
  2. BaseEventPlugin合并到了BasePlugin中,所有插件都应该继承自BasePlugin
  3. BaseEventHandler现在有了get_config方法了。
  4. 修正了main.py中的错误输出。
  5. 修正了command所编译的Pattern注册时的错误输出。
  6. events_manager有了task相关逻辑了。
  7. 现在有了插件卸载和重载功能了,也就是热插拔。
  8. 实现了组件的全局启用和禁用功能。
  • 通过enable_componentdisable_component方法来启用或禁用组件。
  • 不过这个操作不会保存到配置文件~
  1. 实现了组件的局部禁用,也就是针对某一个聊天禁用的功能。
  • 通过disable_specific_chat_actionenable_specific_chat_actiondisable_specific_chat_commandenable_specific_chat_commanddisable_specific_chat_event_handlerenable_specific_chat_event_handler来操作
  • 同样不保存到配置文件~
  1. BaseTool一并合并进入了插件系统

官方插件修改

  1. HelloWorld插件现在有一个样例的EventHandler
  2. 内置插件增加了一个通过Command来管理插件的功能。具体是使用/pm命令唤起。(需要自行启用)
  3. HelloWorld插件现在有一个样例的CompareNumbersTool

执笔BGM

塞壬唱片!