simple-robot / simpler-robot

Simple Robot,一个bot风格的Kotlin多平台事件调度框架,异步高效、Java友好!/ A Bot-style Kotlin Multiplatform event scheduling framework, asynchronous and high-performance, java-friendly! 🐱😼😻😸
https://simbot.forte.love
GNU Lesser General Public License v3.0
521 stars 43 forks source link

qq频道发送含未审核链接消息会导致kook无法发送消息 #715

Closed axiangcoding closed 1 year ago

axiangcoding commented 1 year ago

版本号

v3.1.0

附加版本

// https://mvnrepository.com/artifact/love.forte.simbot.boot/simboot-core-spring-boot-starter
implementation("love.forte.simbot.boot:simboot-core-spring-boot-starter:3.1.0")
// https://mvnrepository.com/artifact/love.forte.simbot.component/simbot-component-kook-core
implementation("love.forte.simbot.component:simbot-component-kook-core:3.0.0.0-alpha.7-SNAPSHOT")
// https://mvnrepository.com/artifact/love.forte.simbot.component/simbot-component-qq-guild-core
implementation("love.forte.simbot.component:simbot-component-qq-guild-core:3.0.0.0-alpha.8")

涉及的编程语言

Java

项目构建工具

Gradle

涉及的组件库

KOOK, QQ频道

问题描述

复现方式

  1. 同一个simbot实例,对接kook和qq频道
  2. 在qq频道的回复中添加url,比如github.com,并确保对接的机器人没配置这个域名审核
  3. 触发qq频道回复该消息,然后再触发kook的回复
  4. kook回复功能无效,未出现报错

相关日志

无报错日志

其他补充

有收到频道消息,但是调用的方法event.replyAsync()失效

ForteScarlet commented 1 year ago

目前已基本确认是由于 核心模块 中全局的异步调度器中的缺陷导致当 xxxAsync 抛出异常时导致调度作用域被错误关闭而导致的,会在核心版本 v3.2.0 中修复,不影响组件。

Note: 如果希望临时解决,则可直接将异步函数 xxxAsync 更替为阻塞函数 xxxBlocking


kook回复功能无效,未出现报错

但是关于 "未出现报错" 实际上是对 async 函数的错误应用。xxxAsync 函数返回的均为 CompletableFuture 类型结果,需要使用 .exceptionally.whenComplete 等方式来感知到结果的异常,否则它们将会被“遗弃”。

一个最简单的例子:

// 直接创建一个立刻抛出异常的future
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
   throw new RuntimeException();
});

// 不管怎么等待,你也不会得到这个异常的任何信息
Thread.sleep(50);

// 通过 whenComplete 得知异常
future.whenComplete((value, ex) -> {
    System.out.println("得到异常: " + ex);
});

// 或通过 exceptionally 处理异常
future.exceptionally(e -> {
    System.out.println("处理异常: " + e);
    return "ex value";
}).thenAccept(value -> {
    System.out.println("结果: " + value);
});

Warning

  1. 不建议使用 CompletableFuturegetjoin 等会造成阻塞的API,这样还不如使用 xxxBlocking API 。
  2. 如果使用异步函数,建议全局均使用异步函数且函数返回值也使用 CompletableFuture,参见文档 事件监听:异步性与返回值