总所周知,腾讯服务器给你返回的 QuoteReply 的源消息并不是富文本消息,也就是说,图片会“退化”为[图片]
等等。如果我们想做回复消息搜图之类的功能,这给我们带来了比较多的麻烦。
但是,我们可以取到源消息的 MessageSource,只要你本地存了聊天记录,就能够通过 MessageSource 获取相应消息。按照这个思路,我们只要跟QQ客户端一样,把消息存到本地,需要时获取即可。
具体实现
本帖中将使用 Mirai Hibernate Plugin 插件储存聊天记录,演示获取回复消息原文的方法。
引用依赖
// build.gradle(.kts)
repositories {
mavenCentral()
}
dependencies {
compileOnly("xyz.cssxsh.mirai:mirai-hibernate-plugin:依赖版本")
}
// hibernate 6 和 HikariCP 5 需要 jdk11
mirai {
jvmTarget = JavaVersion.VERSION_11
}
//author("MrXiaoM")
// 在主类插件信息处声明插件依赖关系
dependsOn("xyz.cssxsh.mirai.plugin.mirai-hibernate-plugin", false)
Kotlin
val QuoteReply.originalMessageFromLocal: MessageChain
get() = MiraiHibernateRecorder[source].firstOrNull()?.toMessageChain() ?: source.originalMessage
// 使用示例
@EventHandler
fun GroupMessageEvent.listen() {
// 检测回复消息
message[QuoteReply.Key]?.run {
val original = originalMessageFromLocal
// do sth.
}
}
Java
public static MessageChain getOriginalMessageFromLocal(QuoteReply quote) {
Optional<MessageRecord> record = MiraiHibernateRecorder.INSTANCE.get(quote.getSource()).stream().findFirst();
return record.map(MessageRecord::toMessageChain).orElseGet(() -> quote.getSource().getOriginalMessage());
}
// 使用示例
@EventHandler
public void onGroupMessage(GroupMessageEvent event) {
// 检测回复消息
QuoteReply quote = event.getMessage().get(QuoteReply.Key);
if (quote != null) {
MessageChain original = getOriginalMessageFromLocal(quote);
// do sth.
}
}