使用标准库
stdlib(标准库)模块 在 API
模块的基础上提供简单而轻量级的事件订阅能力。
前提准备
首先你应当准备至少一个可用的 QQ频道机器人。
安装
// 不要忘记使用 Gradle 的 kotlin 插件来允许自动选择对应平台,比如JVM或JS等。
implementation("love.forte.simbot.component:simbot-component-qq-guild-stdlib:3.2.0.0") // 或参考下文所述的 Releases
// 不要忘记使用 Gradle 的 kotlin 插件来允许自动选择对应平台,比如JVM或JS等。
implementation 'love.forte.simbot.component:simbot-component-qq-guild-stdlib:3.2.0.0' // 版本参考下文所述的 Releases
<dependency>
<groupId>love.forte.simbot.component</groupId>
<!-- 在Maven中使用 '-jvm' 后缀来选择使用JVM平台库 -->
<artifactId>simbot-component-qq-guild-stdlib-jvm</artifactId>
<!-- 参考下文所述的 Releases -->
<version>3.2.0.0</version>
</dependency>
BOT配置&注册
环境准备完毕后,接下来我们注册一个bot。
val bot = BotFactory.create("APP ID", "secret", "token") {
// config
this.wsClientEngine = ... // 进行事件订阅所使用的 Ktor client 引擎,默认情况下会**尝试**自动加载,或直接手动指定一个支持ws连接的引擎。
this.apiClientEngine = ... // 使用API时所使用的 Ktor client 引擎,默认情况下会**尝试**自动加载,或直接手动指定一个支持 HTTP API 的引擎。
this.serverUrl = QQGuild.URL // 使用正式环境,默认即为正式环境
this.useSandboxServerUrl() // 使用沙箱环境
this.intents = ... // 要订阅的事件标记。默认订阅 频道、频道成员、公域消息 三种事件
// 其他配置...
}
bot.start() // 启动bot
bot.join() // 挂起bot直到bot终止
Bot bot = BotFactory.create("APP ID", "secret", "token", (configuration) -> {
configuration.setWsClientEngine(...); // 进行事件订阅所使用的 Ktor client 引擎,默认情况下会**尝试**自动加载,或直接手动指定一个支持ws连接的引擎。
configuration.setApiClientEngine(...); // 使用API时所使用的 Ktor client 引擎,默认情况下会**尝试**自动加载,或直接手动指定一个支持 HTTP API 的引擎。
configuration.setServerUrl(QQGuild.URL); // 使用正式环境,默认即为正式环境
configuration.useSandboxServerUrl(); // 使用沙箱环境
configuration.setIntentsValue(...); // 要订阅的事件标记值。默认订阅 频道、频道成员、公域消息 三种事件
// 其他配置...
return Unit.INSTANCE; // 结束配置
});
bot.startBlocking(); // 启动bot
bot.joinBlocking(); // 阻塞t直到bot终止
Bot bot = BotFactory.create("APP ID", "secret", "token", (configuration) -> {
configuration.setWsClientEngine(...); // 进行事件订阅所使用的 Ktor client 引擎,默认情况下会**尝试**自动加载,或直接手动指定一个支持ws连接的引擎。
configuration.setApiClientEngine(...); // 使用API时所使用的 Ktor client 引擎,默认情况下会**尝试**自动加载,或直接手动指定一个支持 HTTP API 的引擎。
configuration.setServerUrl(QQGuild.URL); // 使用正式环境,默认即为正式环境
configuration.useSandboxServerUrl(); // 使用沙箱环境
configuration.setIntentsValue(...); // 要订阅的事件标记。默认订阅 频道、频道成员、公域消息 三种事件
// 其他配置...
return Unit.INSTANCE; // 结束配置
});
// 阻塞直到bot终止
bot.startAsync().thenCompose(__ -> bot.joinAsync()).join();
事件监听(订阅)
在启动创建bot、启动bot这个过程中间,你可以注册一些事件处理器来对订阅的事件进行处理。
val bot = BotFactory.create("APP ID", "secret", "token") {
// ...
}
// 订阅所有类型的事件
// highlight-start
bot.registerProcessor { raw -> // this: Signal.Dispatch
// ...
}
// highlight-end
// 订阅具体的事件类型
// highlight-start
bot.registerProcessor<GuildMemberAdd> { raw -> // this: GuildMemberAdd
// ...
}
// highlight-end
bot.start() // 启动bot
bot.join() // 挂起bot直到bot终止
Bot bot = BotFactory.create("APP ID", "secret", "token", (configuration) -> {
// ...
return Unit.INSTANCE; // 结束配置
});
// 订阅所有事件类型
// highlight-start
bot.registerBlockingProcessor((Signal.Dispatch event, String raw) -> {
// ...
});
// highlight-end
// 订阅具体的事件类型
// highlight-start
bot.registerBlockingProcessor(GuildMemberAdd.class, (GuildMemberAdd event, String raw) -> {
// ...
});
// highlight-end
bot.startBlocking(); // 启动bot
bot.joinBlocking(); // 阻塞直到bot终止
Bot bot = BotFactory.create("APP ID", "secret", "token", (configuration) -> {
// ...
return Unit.INSTANCE; // 结束配置
});
// 订阅所有事件类型
// highlight-start
bot.registerAsyncProcessor((Signal.Dispatch event, String raw) -> {
// ...
return CompletableFuture.completedFuture(null); // 异步事件处理器要求返回 CompletionStage<Void?> 类型的结果
});
// highlight-end
// 订阅具体的事件类型
// highlight-start
bot.registerAsyncProcessor(GuildMemberAdd.class, (GuildMemberAdd event, String raw) -> {
// ...
return CompletableFuture.completedFuture(null); // 异步事件处理器要求返回 CompletionStage<Void?> 类型的结果
});
// highlight-end
// 阻塞直到bot终止
bot.startAsync().thenCompose(__ -> bot.joinAsync()).join();
可以看到,在进行事件处理的时候,你可以得到两个参数: 一个是接收到的事件类型 event
,它是类型 Signal.Dispatch
的字类; 另外一个是字符串 raw
,它代表是这个事件原始的JSON字符串。
在事件监听的过程中,配合使用 API
来实现你的功能。
举个例子,当监听到 子频道更新事件 (ChannelUpdate
) 时,查询一下这个子频道所属的 频道服务器 (Guild
) 是什么。
val bot = BotFactory.create("APP ID", "secret", "token") {
// ...
}
// 订阅 ChannelUpdate
// highlight-start
bot.registerProcessor<ChannelUpdate> { raw -> // this: ChannelUpdate
// 查询这个子频道所属的频道服务器
val guild = GetGuildApi.create(this.data.guildId).requestBy(bot)
println("guild: $guild")
}
// highlight-end
bot.start() // 启动bot
bot.join() // 挂起bot直到bot终止
Bot bot = BotFactory.create("APP ID", "secret", "token", (configuration) -> {
// ...
return Unit.INSTANCE; // 结束配置
});
// 订阅 ChannelUpdate
// highlight-start
bot.registerBlockingProcessor(ChannelUpdate.class, (event, raw) -> {
// 查询这个子频道所属的频道服务器
GetGuildApi getGuildApi = GetGuildApi.create(event.getData().getGuildId());
SimpleGuild guild = BotRequestUtil.requestBlocking(bot, getGuildApi);
System.out.println("guild: " + guild);
});
// highlight-end
bot.startBlocking(); // 启动bot
bot.joinBlocking(); // 阻塞直到bot终止
Bot bot = BotFactory.create("APP ID", "secret", "token", (configuration) -> {
// ...
return Unit.INSTANCE; // 结束配置
});
// 订阅 ChannelUpdate
// highlight-start
bot.registerAsyncProcessor(ChannelUpdate.class, (event, raw) -> {
// 查询这个子频道所属的频道服务器
GetGuildApi getGuildApi = GetGuildApi.create(event.getData().getGuildId());
return BotRequestUtil.requestAsync(bot, getGuildApi).thenAccept(guild -> {
System.out.println("guild: " + guild);
});
});
// highlight-end
// 阻塞直到bot终止
bot.startAsync().thenCompose(__ -> bot.joinAsync()).join();
启动
接下来,启动程序并试试看吧。
当然,如果遇到了预期外的问题也不要慌,积极反馈问题才能使我们变得更好,可以前往 Issues 反馈问题、 社区 提出疑问。
Last modified: 15 July 2024