From 83fa78b50d34a55eb6885371769455c8419f2f94 Mon Sep 17 00:00:00 2001 From: Karlatemp Date: Sat, 17 Apr 2021 09:28:11 +0800 Subject: [PATCH] Find nick from source; fix #1137 --- .../src/commonMain/kotlin/message/atImpl.kt | 36 ++++++++++++++++--- .../kotlin/message/messageToElems.kt | 13 +++++-- .../network/protocol/packet/chat/MultiMsg.kt | 6 +++- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/mirai-core/src/commonMain/kotlin/message/atImpl.kt b/mirai-core/src/commonMain/kotlin/message/atImpl.kt index 6abff7cac..0d4360e48 100644 --- a/mirai-core/src/commonMain/kotlin/message/atImpl.kt +++ b/mirai-core/src/commonMain/kotlin/message/atImpl.kt @@ -14,12 +14,40 @@ import kotlinx.io.core.readBytes import net.mamoe.mirai.contact.Group import net.mamoe.mirai.contact.nameCardOrNick import net.mamoe.mirai.internal.network.protocol.data.proto.ImMsgBody -import net.mamoe.mirai.message.data.At -import net.mamoe.mirai.message.data.AtAll +import net.mamoe.mirai.message.data.* +import net.mamoe.mirai.utils.safeCast -internal fun At.toJceData(group: Group?): ImMsgBody.Text { - val text = "@${group?.members?.get(this.target)?.nameCardOrNick ?: target}" +internal fun At.toJceData( + group: Group?, + source: MessageSource?, + isForward: Boolean, +): ImMsgBody.Text { + fun findFromGroup(g: Group?): String? { + return g?.members?.get(this.target)?.nameCardOrNick + } + + fun findFromSource(): String? { + return when (source) { + is OnlineMessageSource -> { + return findFromGroup(source.target.safeCast()) + } + is OfflineMessageSource -> { + if (source.kind == MessageSourceKind.GROUP) { + return findFromGroup(group?.bot?.getGroup(source.targetId)) + } else null + } + else -> null + } + } + + val text = "@${ + if (isForward) { + findFromSource() ?: findFromGroup(group) + } else { + findFromGroup(group) ?: findFromSource() + } ?: target + }" return ImMsgBody.Text( str = text, attr6Buf = buildPacket { diff --git a/mirai-core/src/commonMain/kotlin/message/messageToElems.kt b/mirai-core/src/commonMain/kotlin/message/messageToElems.kt index b620b897d..085de5ca4 100644 --- a/mirai-core/src/commonMain/kotlin/message/messageToElems.kt +++ b/mirai-core/src/commonMain/kotlin/message/messageToElems.kt @@ -34,7 +34,8 @@ internal val UNSUPPORTED_VOICE_MESSAGE_PLAIN = PlainText("收到语音消息, @Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") internal fun MessageChain.toRichTextElems( messageTarget: ContactOrBot?, - withGeneralFlags: Boolean + withGeneralFlags: Boolean, + isForward: Boolean = false, ): MutableList { val forGroup = messageTarget is Group val elements = ArrayList(this.size) @@ -114,7 +115,15 @@ internal fun MessageChain.toRichTextElems( ) } is At -> { - elements.add(ImMsgBody.Elem(text = currentMessage.toJceData(messageTarget.safeCast()))) + elements.add( + ImMsgBody.Elem( + text = currentMessage.toJceData( + messageTarget.safeCast(), + this[MessageSource], + isForward, + ) + ) + ) // elements.add(ImMsgBody.Elem(text = ImMsgBody.Text(str = " "))) // removed by https://github.com/mamoe/mirai/issues/524 // 发送 QuoteReply 消息时无可避免的产生多余空格 #524 diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/MultiMsg.kt b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/MultiMsg.kt index 031197f0a..e5331d4f0 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/MultiMsg.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/packet/chat/MultiMsg.kt @@ -86,7 +86,11 @@ internal fun Collection.calculateValidationData( msgBody = ImMsgBody.MsgBody( richText = ImMsgBody.RichText( elems = chain.messageChain.toMessageChain() - .toRichTextElems(handler.contact, withGeneralFlags = false).toMutableList() + .toRichTextElems( + handler.contact, + withGeneralFlags = false, + isForward = true, + ).toMutableList() ) ) )