Skip to content

RFC: 统一插件元数据声明 #1015

@mnixry

Description

@mnixry

为什么

现在, NoneBot社区内有各种类型的插件, 为了对这些插件查询帮助等, 需要一个统一的规范.
目前存在大量插件自己写了帮助, 导致一个帮助可能会触发大量插件响应, 并且格式不统一

怎么做

目前, 社区对于插件规范有了多种实现, 包括以下两种

所以, 我们可以在插件根中使用字段指定一部分插件元数据

具体规范

字段规范(已部分实现)

以下字段应作为插件根中的全局变量被声明.

初版设计(未使用)
__plugin_adapters__ = [OneBotV11Adapter] #插件支持的Adapter, 如果不写就默认支持所有Adapter, 可以考虑根据这个字段进行adapter加载检测
__plugin_name__ = PluginName('unique_name',human='插件人类阅读名称') #如果没有unique name就用插件包名代替
__plugin_name__ = 'unique_name [插件人类阅读名称]' #这样也行, 就不用定义结构体了

__plugin_des__ = '插件介绍' #简短介绍插件的功能(不包括使用方法), 可以给个字数限制?

__plugin_usage__ = '插件用法' #插件使用方法, 可能需要支持很多种定义方式
__plugin_usage__:Dict[Adapter,str] #这样应该也可以被接受
__plugin_usage__:Dict[Type[Matcher],str] #这样可能也得需要支持, 就是直接根据命令生成

__plugin_settings__: Config #插件的配置, 读env出来的那些

__plugin_version__:str #插件版本, 如果没有就从包元数据读取
__plugin_author__ = 'Author <mail@example.com>'  #插件作者声明, 不写就没有
@dataclass(eq=False)
class PluginMetadata:
    """插件元信息,由插件编写者提供"""

    name: str
    """插件名称"""
    description: str
    """插件功能介绍"""
    usage: str
    """插件使用方法"""
    type: Optional[str] = None
    """插件类型,用于商店分类"""
    homepage: Optional[str] = None
    """插件主页"""
    config: Optional[Type[BaseModel]] = None
    """插件配置项"""
    supported_adapters: Optional[Set[str]] = None
    """插件支持的适配器模块路径

    格式为 `<module>[:<Adapter>]`,`~` 为 `nonebot.adapters.` 的缩写。

    `None` 表示支持**所有适配器**。
    """
    extra: Dict[Any, Any] = field(default_factory=dict)
    """插件额外信息,可由插件编写者自由扩展定义"""

__plugin_meta__ = PluginMetadata(...)

API规范(未确定)

添加一个钩子, 在插件加载完成后调用, 返回包含上述字段的函数

def plugin_load_callback(plugin_name:str,plugin:Module)->Optional[PluginMetadata]:
	"""
	如果返回None就不管了, 如果返回了元数据就取, 如果异常阻止该插件加载并记录该异常
	如果有多个返回元数据的行为呢?
	"""
    	...

添加能够读取全部插件元数据的API

添加一个内建插件叫nonebot.plugin.help提供最简单的帮助支持, 即: 将nonebot-plugin-help合并进来

兼容性

理论上不会break, 如果__plugin_meta__没写就代表没有声明元数据

其他

可以考虑为适配了以上信息的插件在插件商店中优先推荐, 或者进行标识

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions