Simple Robot v4.6.0 Help

概述

此处会针对“组件、插件、组件库” 等概念进行简单的介绍。

组件

一个代码中的 "组件" ,也可称为一个 "组件标识" ,即代表一个 接口 Component 的实现类型。

也可以将其理解为狭义的组件。

比如:

interface FooComponent : Component { // 省略内部实现... } class BarComponentImpl : Component { // 省略内部实现... }

代码示例中的 FooComponentBarComponentImpl 都可被称为 "组件标识" 的实现。

"组件标识"的作用是为一个或多个 插件 提供一个"身份"、向 Application提供序列化信息 、以及可以在多个插件间共享的一些配置。

我们来看看 Component 接口的定义:

public interface Component { /** * 一个组件的ID。 * 组件id建议使用类似于Java包路径的格式, * 例如 `org.example.Sample` 并尽量避免重复。 */ public val id: String /** * 组件对外提供的统合所有所需的序列化信息。 * 通常为 message 类型的序列化或文件配置类的序列化信息。 */ public val serializersModule: SerializersModule }

Component 中主要定义了一个用作标识的字符串ID id: String, 和提供序列化信息的 serializersModule: SerializersModule。 其中,向 Application 中提供序列化信息是 Component 最基本的主要职责。

组件标识在某些情况下并不是必要的, 对于一些简单的插件实现来讲,组件标识的实现是可以省略的。 比如一个插件,即不需要一个可共享的配置实现,也没有需要提供的序列化信息,也没有任何地方需要提供 Component 属性, 那么它就可以没有对应的 组件标识 实现。

插件

插件 是可以安装在 Application 中的功能单位。 一个插件的实现就是指实现了接口 Plugin 的某个类型。

例如:

interface MyPlugin : Plugin { // 省略内部实现... } class FooPluginImpl : Plugin { // 省略内部实现... }

代码示例中的 MyPluginFooPluginImpl 都可被称为 "插件" 的实现。

何为功能单位 ?就是在构建 Application 的过程中,可以额外添加/修改一些信息、或执行一些逻辑。

举个例子,你可以在 Application 启动过程中注册一个事件处理器,或者保存事件调度器 EventDispatcher 并在后续(比如在异步中)推送一些事件。

我们来看看 Plugin 接口的定义:

public interface Plugin

非常简单对吧? Plugin 接口内没有任何约束,也就是说 Plugin 的实现可以非常自由。

一般来讲,一个插件可能"属于"某个 组件标识 ,但是也正如上文所说, 组件标识 并不是必要的。 实际上,这种"所属关系"更多的是一种约定 ,而并非限制

这也是为什么 Plugin 接口的定义中实际上并没有要求有一个 Component 类型的属性。

一般情况下,为了严谨 ,可以在构建 Plugin 过程中去校验某个 Component 是否存在, 并获取到它、保存下来。但是如果你的 Plugin 实现的确就是用不到 Component ,那么就不需要理会它。

组件库

组件库, 在部分文档内容中也会被称为 组件 (一般会带个名字,比如"xxx组件"),它是一个比较宏观的说法, 通常指代一整个仓库或一整个依赖的统称。

一个仓库,其中包含了一个或多个组件和插件的实现,就可以将其统称为组件库。 而后为组件库起个名字,便可称之为xxx组件或xxx组件库。

也可以将其理解为广义的组件。

因此 "组件库" 是一个抽象的统称,并不是某个具体的代码、某个具体的接口实现。

Bot管理器

Bot管理器即指接口类型 BotManager ,它继承了 Plugin ,是 插件 的一个特殊子类型, 用来定义针对 Bot 的管理行为。

BotManager 中定义了对 Bot 的创建、寻找等功能,一般实现 BotManager 就会需要一个配套的 Bot 实现, 比如 FooBotFooBotManager

与单纯的 Plugin 不同, Bot 是明确要求一个具体的 Component 的, 而 Bot 又是通过 BotManager 创建的,因此 BotManager 通常需要一个对应的 Component 实现, 并需要在构建的时候从 Application 中寻找、校验。

事件

"事件"即代表一个实现了接口 Event (或其子类型) 的类型。 例如:

interface MyEvent : Event { // ... } class FooEvent : BotEvent { // ... }

代码示例中的 MyEventFooEvent 都是一种事件类型。 其中,simbot标准库的 simbot-api 模块 (也就是 Event 接口所在的模块) 定义了一些基础的事件类型, 可以借助 IDE 的提示、 API文档 或前往文档章节 事件 Event 查阅。

Last modified: 19 September 2024