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()
}
source.ensureSequenceIdAvailable()
bot.network.run {
val response = PbMessageSvc.PbMsgWithDraw.Group(bot.client, this@GroupImpl.id, source.sequenceId, source.messageUid.toInt())
.sendAndExpect<PbMessageSvc.PbMsgWithDraw.Response>()

View File

@ -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

View File

@ -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 ""
}

View File

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

View File

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