跳到主要内容
版本:3.3.0

BOT管理器

在simbot3中,所有的 Bot 都应该由 BotManager 进行管理,所有的 BotManager 都应由 OriginBotManager 进行管理。

OriginBotManager​

OriginBotManager 是所有 BotManager 实例的统一管理类,在正常情况下,所有的 BotManager 实现类在新建实例的时候(new)都会将自身交由 OriginBotManager 进行统一管理。
OriginBotManager 内部不会持有这些manager,当一个 BotManager 执行了 cancel 或被垃圾回收后,OriginBotManager 中将无法再获取到它。

通过 OriginBotManager,使用者可以在任何事件获取到目前处于活跃状态中的任何 BotManager,进而得到任何活跃状态的 Bot 实例。

OriginBotManager 本身实现了 Set<BotManager<*>>,因此你可以将其视为一个 Set 使用 —— 当然,你不能直接对它进行修改操作。

OriginBotManager.forEach {
println("BotManager: $it")
}

除了Set提供的api以外,OriginBotManager 提供了一些额外的API使得可能更快捷的进行某些操作:

// 根据组件获取所有的管理器。假设这里获取所有的Mirai组件。
val managers: List<BotManager<*>> = OriginBotManager.getManagers(MiraiComponent.component)


// 通过ID和组件信息直接定位一个Bot对象。
val bot: Bot = OriginBotManager.getBot(123.ID, TencentGuildComponent.component)


// 进行关闭操作。注意!关闭操作将会关闭所有被管理的botManager,并且将无法在继续构建新的管理器。
// 除非必要,否则你不需要关心这个方法,这一般是在系统关闭的hook之类的地方使用。
OriginBotManager.cancel()
警告

OriginBotManager 无关任何环境,属于 全局 性API。你应该谨慎考虑是否应该使用任何 全局 相关的API,并且这些API未来都有可能发生变更。

我们建议你在更合适的环境中获取并使用 BotManager。 在simbot3中,BotManager 与 Bot, 或者说整个启动流程(在基础的 core 模块的角度上) 息息相关。

因此你可以通过 Bot 很轻易地得到其对应/所属的 BotManager,并在尽量避免使用 OriginBotManager 的情况下进行操作:

/** 处理一个群消息事件 */
suspend fun GroupMessageEvent.processEvent() {
// 得到事件中bot所属的manager
val manager: BotManager<out Bot> = bot.manager
// 得到当前管理器的所有bot
val all: List<Bot> = manager.all()
}

BotManager​

BotManager<B extends Bot> 顾名思义即对 Bot 的管理器,每个bot都应属于一个 BotManager。

获取API​

BotManager 提供了一些用于获取 Bot 的API: all 和 get。

val manager: BotManager<*> = ...

// 获取所有Bot,以序列Sequence的形式返回
val all: List<Bot> = manager.all()

// 获取指定的Bot
val bot: Bot = manager.get(123.ID)

注册API​

所有的BotManager都至少提供了一个注册函数 register(BotVerifyInfo)。但实际上并不推荐使用者通过这个函数来注册BOT。 此函数中的参数 BotVerifyInfo 是通过读取 *.bot 文件而得到的以Json配置为主的信息类,但是很多情况下注册一个Bot并不需要一个Json配置。

那么该如何注册呢?因为simbot3支持多组件协同,因此首先你需要知道你要注册bot的目标组件下的BotManager的具体类型,然后获取它。这里以 Mirai组件 为例:

val miraiManager = OriginBotManager.filterIsInstance<MiraiBotManager>().first()