QGBot
作为一个QQ频道的 Bot 库,有一个用于描述机器人的 Bot
想必肯定是很正常的。
API?
在 API 模块 (simbot-component-qq-guild-api
) 中,你可能找不到太多有关 Bot
的身影。 毕竟 API 模块仅是针对QQ频道中的 API 的封装与实现,本身是不包括对 Bot
的描述的。
标准库 Bot
在标准库模块 (simbot-component-qq-guild-stdlib
) 中, 你可以发现一个类型 love.forte.simbot.qguild.Bot
,它便是对一个QQ频道机器人的描述, 可以用来订阅并处理事件等。
创建 Bot
使用工厂类 BotFactory.create(..)
可创建一个尚未启动的 Bot
实例。
使用 Ticket
直接作为参数
也可以直接将这三个必要信息作为参数使用。
直接提供配置类
作为 DSL 的配置类也可以独立构建后直接提供。
直接作为参数
也可以直接将这三个必要信息作为参数使用。
直接提供配置类
作为 DSL 的配置类也可以独立构建后直接提供。
订阅事件
你可以通过 subscribe
来订阅全部或指定类型的事件。
订阅全部事件
使用 subscribe
注册一个普通的事件处理器,此处理器会接收并处理所有类型的事件。
订阅指定类型的事件
使用扩展函数 subscribe
注册一个针对具体 Signal.Dispatch
事件类型的事件处理器, 它只有在接收到的 Signal.Dispatch
与目标类型一致时才会处理。
此示例展示处理 AtMessageCreate
也就公域是消息事件, 并在对方发送了包含 "stop"
的文本时终止 bot。
订阅全部事件
使用 subscribe
注册一个普通的事件处理器,此处理器会接收并处理所有类型的事件。
订阅指定类型的事件
使用 subscribe
注册一个指定了具体类型的事件处理器, 它只有在接收到的 Signal.Dispatch
与目标类型一致时才会处理。
此示例展示处理 AtMessageCreate
也就公域是消息事件, 并在对方发送了包含 "stop"
的文本时终止 bot。
启动 Bot
在 Bot
被启动之前,它不会与服务器建立连接,也不会收到并处理事件。
关闭 Bot
使用 cancel
即可关闭一个 Bot。被关闭的 Bot 不能再次启动。
组件库 QGBot
当你在配合 simbot 使用组件库(simbot-component-qq-guild-core
)的时候, 你可能会更需要了解 love.forte.simbot.component.qguild.bot.QGBot
。 它是作为一个 simbot 组件库的 Bot
的实现 (simbot标准API中的 Bot
接口,不是上面提到的 stdlib bot)。
源 stdlib Bot
组件库的 QGBot
是在上文提到过的 标准库 Bot 的基础上进行构建与扩展的。
你可以在 QGBot
中通过属性 source
获取到其对应的源 Bot
。
构建 QGBot
在 Application
中安装 QQGuildBotManager
后即可使用其注册、启动一个 QGBot
了。
安装 QQGuildBotManager
Kotlin 中可以选择使用扩展函数 useQQGuild
来简化代码:
你可以可选地进行一些配置。
构建完 Application
后,我们寻找 QQGuildBotManager
,并注册、启动一个 bot。
Kotlin 中也可以使用扩展函数 qgGuildBots
来简化操作。
监听事件
实际上,在组件库中监听事件与某个具体的 Bot 无关。 你可以前往参考 Simple Robot 应用手册: 事件监听与处理。
你可以在 组件模块的标准 Event 实现 或API文档中找到所有可用于 simbot 中的事件类型。它们大多与 API 模块中定义的事件类型有一些对应规则。
此处使用 公域消息事件 QGAtMessageCreateEvent
作为例子:
频道操作
对频道 (QGGuild
) 以及之下的子频道(QGChannel
)、频道成员(QGMember
) 的操作, 都是在 QGBot
的 guildRelation
中开始的。
通过获取到的 QGGuildRelation
,可以用来获取 QGGuild
、 QGChannel
等信息。
消息发送
除了使用频道中获取到的子频道对象 QGChannel
的 send
直接发送、 使用消息事件中的 reply
发送消息等方式以外, QGBot
本身提供了一些可以跳过获取频道这一环节、直接根据 ID
发送消息的 API QGBot.sendTo
。
或者有顺序地执行这两个任务:
如果希望在事件处理器中,处理器需要等待所有异步任务完成后再进行下一个处理器,则返回这个 future, 否则会不会等待。