mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-13 14:50:43 +08:00
Ensure sequenceId
available
This commit is contained in:
parent
29a7878ee4
commit
97da6fce60
@ -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>()
|
||||||
|
@ -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
|
||||||
|
@ -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 ""
|
||||||
}
|
}
|
||||||
|
@ -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] 只能被调用一次.
|
||||||
*
|
*
|
||||||
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user