Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
Him188 2021-01-09 14:54:02 +08:00
commit 989cd3292e
2 changed files with 33 additions and 8 deletions

View File

@ -1,10 +1,10 @@
/* /*
* Copyright 2020 Mamoe Technologies and contributors. * Copyright 2019-2021 Mamoe Technologies and contributors.
* *
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
* *
* https://github.com/mamoe/mirai/blob/master/LICENSE * https://github.com/mamoe/mirai/blob/master/LICENSE
*/ */
package net.mamoe.mirai.internal.message package net.mamoe.mirai.internal.message
@ -46,7 +46,10 @@ public open class MessageSourceSerializerImpl(serialName: String) :
resultantDescriptor = buildClassSerialDescriptor(serialName) { resultantDescriptor = buildClassSerialDescriptor(serialName) {
takeElementsFrom(SerialData.serializer().descriptor) takeElementsFrom(SerialData.serializer().descriptor)
}, },
serialize = { SerialData(kind, botId, ids, internalIds, time, fromId, targetId, originalMessage) }, serialize = {
// TODO: 2021-01-09 解决因为 originMessage 中 MessageSource 与 this 相同造成的死循环
SerialData(kind, botId, ids, internalIds, time, fromId, targetId, originalMessage)
},
deserialize = { deserialize = {
Mirai.constructMessageSource(botId, kind, fromId, targetId, ids, time, internalIds, originalMessage) Mirai.constructMessageSource(botId, kind, fromId, targetId, ids, time, internalIds, originalMessage)
} }

View File

@ -25,19 +25,20 @@ import net.mamoe.mirai.utils.mapToIntArray
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
@Serializable(OfflineMessageSourceImplData.Serializer::class) @Serializable(OfflineMessageSourceImplData.Serializer::class)
internal data class OfflineMessageSourceImplData( internal class OfflineMessageSourceImplData(
override val kind: MessageSourceKind, override val kind: MessageSourceKind,
override val ids: IntArray, override val ids: IntArray,
override val botId: Long, override val botId: Long,
override val time: Int, override val time: Int,
override val fromId: Long, override val fromId: Long,
override val targetId: Long, override val targetId: Long,
override val originalMessage: MessageChain, originalMessageLazy: Lazy<MessageChain>,
override val internalIds: IntArray, override val internalIds: IntArray,
) : OfflineMessageSource(), MessageSourceInternal { ) : OfflineMessageSource(), MessageSourceInternal {
object Serializer : MessageSourceSerializerImpl("OfflineMessageSource") object Serializer : MessageSourceSerializerImpl("OfflineMessageSource")
override val sequenceIds: IntArray get() = ids override val sequenceIds: IntArray get() = ids
override val originalMessage: MessageChain by originalMessageLazy
// for override. // for override.
// if provided, no need to serialize from message // if provided, no need to serialize from message
@ -81,6 +82,7 @@ internal data class OfflineMessageSourceImplData(
if (time != other.time) return false if (time != other.time) return false
if (fromId != other.fromId) return false if (fromId != other.fromId) return false
if (targetId != other.targetId) return false if (targetId != other.targetId) return false
// TODO: 2021-01-09: 解决 QuoteReply 的 MessageSource 因为 originalMessage 造成的死循环
if (originalMessage != other.originalMessage) return false if (originalMessage != other.originalMessage) return false
if (!internalIds.contentEquals(other.internalIds)) return false if (!internalIds.contentEquals(other.internalIds)) return false
@ -94,6 +96,7 @@ internal data class OfflineMessageSourceImplData(
result = 31 * result + time result = 31 * result + time
result = 31 * result + fromId.hashCode() result = 31 * result + fromId.hashCode()
result = 31 * result + targetId.hashCode() result = 31 * result + targetId.hashCode()
// TODO: 2021-01-09: 解决 QuoteReply 的 MessageSource 因为 originalMessage 造成的死循环
result = 31 * result + originalMessage.hashCode() result = 31 * result + originalMessage.hashCode()
result = 31 * result + internalIds.contentHashCode() result = 31 * result + internalIds.contentHashCode()
return result return result
@ -139,6 +142,25 @@ internal fun OfflineMessageSourceImplData(
} }
} }
internal fun OfflineMessageSourceImplData(
kind: MessageSourceKind,
ids: IntArray,
botId: Long,
time: Int,
fromId: Long,
targetId: Long,
originalMessage: MessageChain,
internalIds: IntArray,
): OfflineMessageSourceImplData = OfflineMessageSourceImplData(
kind = kind,
ids = ids,
botId = botId,
time = time,
fromId = fromId,
targetId = targetId,
originalMessageLazy = lazyOf(originalMessage),
internalIds = internalIds
)
internal fun OfflineMessageSourceImplData( internal fun OfflineMessageSourceImplData(
delegate: ImMsgBody.SourceMsg, delegate: ImMsgBody.SourceMsg,
@ -151,7 +173,7 @@ internal fun OfflineMessageSourceImplData(
internalIds = delegate.pbReserve.loadAs(SourceMsg.ResvAttr.serializer()) internalIds = delegate.pbReserve.loadAs(SourceMsg.ResvAttr.serializer())
.origUids?.mapToIntArray { it.toInt() } ?: intArrayOf(), .origUids?.mapToIntArray { it.toInt() } ?: intArrayOf(),
time = delegate.time, time = delegate.time,
originalMessage = delegate.toMessageChain(botId, groupIdOrZero), originalMessageLazy = lazy { delegate.toMessageChain(botId, groupIdOrZero) },
fromId = delegate.senderUin, fromId = delegate.senderUin,
targetId = when { targetId = when {
groupIdOrZero != 0L -> groupIdOrZero groupIdOrZero != 0L -> groupIdOrZero