diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt index cda9fcc33..159082173 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/ContactImpl.kt @@ -501,6 +501,8 @@ internal class GroupImpl( checkBotPermissionOperator() } + source.ensureSequenceIdAvailable() + bot.network.run { val response = PbMessageSvc.PbMsgWithDraw.Group(bot.client, this@GroupImpl.id, source.sequenceId, source.messageUid.toInt()) .sendAndExpect() diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageSourceFromMsg.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageSourceFromMsg.kt index e0d351c50..f966bc71b 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageSourceFromMsg.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/MessageSourceFromMsg.kt @@ -23,6 +23,11 @@ internal inline class MessageSourceFromServer( ) : MessageSource { override val time: Long get() = delegate.time.toLong() and 0xFFFFFFFF override val sequenceId: Int get() = delegate.origSeqs?.firstOrNull() ?: error("cannot find sequenceId from ImMsgBody.SourceMsg") + + override suspend fun ensureSequenceIdAvailable() { + // nothing to do + } + override val messageUid: Long get() = delegate.pbReserve.loadAs(SourceMsg.ResvAttr.serializer()).origUids!! override val sourceMessage: MessageChain get() = delegate.toMessageChain() override val senderId: Long get() = delegate.senderUin @@ -36,6 +41,10 @@ internal inline class MessageSourceFromMsg( ) : MessageSource { override val time: Long get() = delegate.msgHead.msgTime.toLong() and 0xFFFFFFFF override val sequenceId: Int get() = delegate.msgHead.msgSeq + override suspend fun ensureSequenceIdAvailable() { + // nothing to do + } + override val messageUid: Long get() = delegate.msgBody.richText.attr!!.random.toLong() override val sourceMessage: MessageChain get() = delegate.toMessageChain() override val senderId: Long get() = delegate.msgHead.fromUin diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.kt index 1c0ea0752..b6f8fe122 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/protocol/packet/chat/receive/MessageSvc.kt @@ -294,6 +294,10 @@ internal class MessageSvc { override val sequenceId: Int get() = sequenceIdDeferred.getCompleted() + override suspend fun ensureSequenceIdAvailable() { + sequenceIdDeferred.join() + } + override fun toString(): String { return "" } diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageReceipt.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageReceipt.kt index d84aed165..3db21c6b2 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageReceipt.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/MessageReceipt.kt @@ -42,11 +42,6 @@ open class MessageReceipt( private val _isRecalled = atomic(false) - /** - * 判断消息是否已被撤回. - */ - val isRecalled: Boolean get() = _isRecalled.value - /** * 撤回这条消息. [recall] 或 [recallIn] 只能被调用一次. * diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSource.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSource.kt index e5962e5bf..e0b7239dc 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSource.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageSource.kt @@ -27,10 +27,17 @@ interface MessageSource : Message { companion object Key : Message.Key /** - * 序列号 + * 序列号. 若是机器人发出去的消息, 请先 [确保 sequenceId 可用][ensureSequenceIdAvailable] */ val sequenceId: Int + /** + * 等待 [sequenceId] 获取, 确保其可用. + * + * 若原消息发送失败, 这个方法会等待最多 3 秒随后抛出 [IllegalStateException] + */ + suspend fun ensureSequenceIdAvailable() + /** * 实际上是个随机数, 但服务器确实是用它当做 uid */