Ensure sequenceId available

This commit is contained in:
Him188 2020-02-21 19:04:29 +08:00
parent 29a7878ee4
commit 97da6fce60
5 changed files with 23 additions and 6 deletions

View File

@ -501,6 +501,8 @@ internal class GroupImpl(
checkBotPermissionOperator() checkBotPermissionOperator()
} }
source.ensureSequenceIdAvailable()
bot.network.run { bot.network.run {
val response = PbMessageSvc.PbMsgWithDraw.Group(bot.client, this@GroupImpl.id, source.sequenceId, source.messageUid.toInt()) val response = PbMessageSvc.PbMsgWithDraw.Group(bot.client, this@GroupImpl.id, source.sequenceId, source.messageUid.toInt())
.sendAndExpect<PbMessageSvc.PbMsgWithDraw.Response>() .sendAndExpect<PbMessageSvc.PbMsgWithDraw.Response>()

View File

@ -23,6 +23,11 @@ internal inline class MessageSourceFromServer(
) : MessageSource { ) : MessageSource {
override val time: Long get() = delegate.time.toLong() and 0xFFFFFFFF 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 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 messageUid: Long get() = delegate.pbReserve.loadAs(SourceMsg.ResvAttr.serializer()).origUids!!
override val sourceMessage: MessageChain get() = delegate.toMessageChain() override val sourceMessage: MessageChain get() = delegate.toMessageChain()
override val senderId: Long get() = delegate.senderUin override val senderId: Long get() = delegate.senderUin
@ -36,6 +41,10 @@ internal inline class MessageSourceFromMsg(
) : MessageSource { ) : MessageSource {
override val time: Long get() = delegate.msgHead.msgTime.toLong() and 0xFFFFFFFF override val time: Long get() = delegate.msgHead.msgTime.toLong() and 0xFFFFFFFF
override val sequenceId: Int get() = delegate.msgHead.msgSeq 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 messageUid: Long get() = delegate.msgBody.richText.attr!!.random.toLong()
override val sourceMessage: MessageChain get() = delegate.toMessageChain() override val sourceMessage: MessageChain get() = delegate.toMessageChain()
override val senderId: Long get() = delegate.msgHead.fromUin override val senderId: Long get() = delegate.msgHead.fromUin

View File

@ -294,6 +294,10 @@ internal class MessageSvc {
override val sequenceId: Int override val sequenceId: Int
get() = sequenceIdDeferred.getCompleted() get() = sequenceIdDeferred.getCompleted()
override suspend fun ensureSequenceIdAvailable() {
sequenceIdDeferred.join()
}
override fun toString(): String { override fun toString(): String {
return "" return ""
} }

View File

@ -42,11 +42,6 @@ open class MessageReceipt<C : Contact>(
private val _isRecalled = atomic(false) private val _isRecalled = atomic(false)
/**
* 判断消息是否已被撤回.
*/
val isRecalled: Boolean get() = _isRecalled.value
/** /**
* 撤回这条消息. [recall] [recallIn] 只能被调用一次. * 撤回这条消息. [recall] [recallIn] 只能被调用一次.
* *

View File

@ -27,10 +27,17 @@ interface MessageSource : Message {
companion object Key : Message.Key<MessageSource> companion object Key : Message.Key<MessageSource>
/** /**
* 序列号 * 序列号. 若是机器人发出去的消息, 请先 [确保 sequenceId 可用][ensureSequenceIdAvailable]
*/ */
val sequenceId: Int val sequenceId: Int
/**
* 等待 [sequenceId] 获取, 确保其可用.
*
* 若原消息发送失败, 这个方法会等待最多 3 秒随后抛出 [IllegalStateException]
*/
suspend fun ensureSequenceIdAvailable()
/** /**
* 实际上是个随机数, 但服务器确实是用它当做 uid * 实际上是个随机数, 但服务器确实是用它当做 uid
*/ */