5.0 KiB
5.0 KiB
插件API与规范修改
-
现在
plugin_system的__init__.py文件中包含了所有插件API的导入,用户可以直接使用from src.plugin_system import *来导入所有API。 -
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
- 现在强制要求的property如下,即你必须覆盖的属性有:
plugin_name: 插件名称,必须是唯一的。(与文件夹相同)enable_plugin: 是否启用插件,默认为True。dependencies: 插件依赖的其他插件列表,默认为空。现在并不检查(也许)python_dependencies: 插件依赖的Python包列表,默认为空。现在并不检查config_file_name: 插件配置文件名,默认为config.toml。config_schema: 插件配置文件的schema,用于自动生成配置文件。
- 部分API的参数类型和返回值进行了调整
chat_api.py中获取流的参数中可以使用一个特殊的枚举类型来获得所有平台的 ChatStream 了。config_api.py中的get_global_config和get_plugin_config方法现在支持嵌套访问的配置键名。database_api.py中的db_query方法调整了参数顺序以增强参数限制的同时,保证了typing正确;db_get方法增加了single_result参数,与db_query保持一致。
- 增加了
logging_api,可以用get_logger来获取日志记录器。 - 增加了插件和组件管理的API。
插件系统修改
- 现在所有的匹配模式不再是关键字了,而是枚举类。(可能有遗漏)
- 修复了一下显示插件信息不显示的问题。同时精简了一下显示内容
- 修复了插件系统混用了
plugin_name和display_name的问题。现在所有的插件信息都使用display_name来显示,而内部标识仍然使用plugin_name。 - 现在增加了参数类型检查,完善了对应注释
- 现在插件抽象出了总基类
PluginBase
基于Action和Command的插件基类现在为BasePlugin。基于Event的插件基类现在为BaseEventPlugin。- 基于
Action,Command和Event的插件基类现在为BasePlugin,所有插件都应该继承此基类。 BasePlugin继承自PluginBase。- 所有的插件类都由
register_plugin装饰器注册。
- 现在我们终于可以让插件有自定义的名字了!
- 真正实现了插件的
plugin_name不受文件夹名称限制的功能。(吐槽:可乐你的某个小小细节导致我搞了好久……) - 通过在插件类中定义
plugin_name属性来指定插件内部标识符。 - 由于此更改一个文件中现在可以有多个插件类,但每个插件类必须有唯一的
plugin_name。 - 在某些插件加载失败时,现在会显示包名而不是插件内部标识符。
- 例如:
MaiMBot.plugins.example_plugin而不是example_plugin。 - 仅在插件 import 失败时会如此,正常注册过程中失败的插件不会显示包名,而是显示插件内部标识符。(这是特性,但是基本上不可能出现这个情况)
- 例如:
- 现在不支持单文件插件了,加载方式已经完全删除。
- 把
BaseEventPlugin合并到了BasePlugin中,所有插件都应该继承自BasePlugin。 BaseEventHandler现在有了get_config方法了。- 修正了
main.py中的错误输出。 - 修正了
command所编译的Pattern注册时的错误输出。 events_manager有了task相关逻辑了。- 现在有了插件卸载和重载功能了,也就是热插拔。
- 实现了组件的全局启用和禁用功能。
- 通过
enable_component和disable_component方法来启用或禁用组件。 - 不过这个操作不会保存到配置文件~
- 实现了组件的局部禁用,也就是针对某一个聊天禁用的功能。
- 通过
disable_specific_chat_action,enable_specific_chat_action,disable_specific_chat_command,enable_specific_chat_command,disable_specific_chat_event_handler,enable_specific_chat_event_handler来操作 - 同样不保存到配置文件~
官方插件修改
HelloWorld插件现在有一个样例的EventHandler。- 内置插件增加了一个通过
Command来管理插件的功能。具体是使用/pm命令唤起。
TODO
把这个看起来就很别扭的config获取方式改一下
吐槽
plugin_path = Path(plugin_file)
if plugin_path.parent.name != "plugins":
# 插件包格式:parent_dir.plugin
module_name = f"plugins.{plugin_path.parent.name}.plugin"
else:
# 单文件格式:plugins.filename
module_name = f"plugins.{plugin_path.stem}"
plugin_path = Path(plugin_file)
module_name = ".".join(plugin_path.parent.parts)
这两个区别很大的。
执笔BGM
塞壬唱片!