From dd9439d50712c8b87b669561dc00d018761cbe49 Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 26 Jan 2021 21:22:46 +0800 Subject: [PATCH 1/2] Support detect show image, also update pb --- .../commonMain/kotlin/message/data/flags.kt | 19 +++++++ .../commonMain/kotlin/message/conversions.kt | 11 +++- .../kotlin/network/protocol/data/proto/Msg.kt | 15 ----- .../network/protocol/data/proto/PbReserve.kt | 55 ++++++++++++++++++- 4 files changed, 82 insertions(+), 18 deletions(-) create mode 100644 mirai-core-api/src/commonMain/kotlin/message/data/flags.kt diff --git a/mirai-core-api/src/commonMain/kotlin/message/data/flags.kt b/mirai-core-api/src/commonMain/kotlin/message/data/flags.kt new file mode 100644 index 000000000..829a1a54a --- /dev/null +++ b/mirai-core-api/src/commonMain/kotlin/message/data/flags.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2019-2021 Mamoe Technologies and contributors. + * + * 此源代码的使用受 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. + * + * https://github.com/mamoe/mirai/blob/master/LICENSE + */ + +package net.mamoe.mirai.message.data + +/** + * [MessageChain] 中包含秀图时的标记 + * + * 秀图已被 QQ 弃用, 仅作识别处理 + */ +public object ShowImageFlag : MessageMetadata { + override fun toString(): String = "ShowImageFlag" +} diff --git a/mirai-core/src/commonMain/kotlin/message/conversions.kt b/mirai-core/src/commonMain/kotlin/message/conversions.kt index 6c774bb8a..c0727730b 100644 --- a/mirai-core/src/commonMain/kotlin/message/conversions.kt +++ b/mirai-core/src/commonMain/kotlin/message/conversions.kt @@ -244,7 +244,7 @@ internal fun MessageChain.toRichTextElems( -> { } - is InternalFlagOnlyMessage -> { + is InternalFlagOnlyMessage, is ShowImageFlag -> { // ignore } else -> error("unsupported message type: ${currentMessage::class.simpleName}") @@ -483,7 +483,14 @@ internal fun List.joinToMessageChain( ) } element.notOnlineImage != null -> list.add(OnlineFriendImageImpl(element.notOnlineImage)) - element.customFace != null -> list.add(OnlineGroupImageImpl(element.customFace)) + element.customFace != null -> { + list.add(OnlineGroupImageImpl(element.customFace)) + element.customFace.pbReserve.let { + if (it.isNotEmpty() && it.loadAs(CustomFace.ResvAttr.serializer()).msgImageShow != null) { + list.add(ShowImageFlag) + } + } + } element.face != null -> list.add(Face(element.face.index)) element.text != null -> { if (element.text.attr6Buf.isEmpty()) { diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Msg.kt b/mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Msg.kt index 5eb1099b5..3c5912599 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Msg.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/data/proto/Msg.kt @@ -15,7 +15,6 @@ import kotlinx.serialization.protobuf.ProtoNumber import kotlinx.serialization.protobuf.ProtoType import net.mamoe.mirai.internal.network.protocol.packet.EMPTY_BYTE_ARRAY import net.mamoe.mirai.internal.utils.io.ProtoBuf -import net.mamoe.mirai.internal.utils.io.serialization.toByteArray @Serializable internal class ImCommon : ProtoBuf { @@ -711,20 +710,6 @@ internal class ImMsgBody : ProtoBuf { @ProtoNumber(29) @JvmField val pbReserve: ByteArray = EMPTY_BYTE_ARRAY ) : ProtoBuf, NotOnlineImageOrCustomFace - @Serializable // 非官方. - internal class PbReserve( - @ProtoNumber(1) @JvmField val unknown1: Int = 1, - @ProtoNumber(2) @JvmField val unknown2: Int = 0, - @ProtoNumber(6) @JvmField val unknown3: Int = 0, - @ProtoNumber(8) @JvmField val hint: String = "[动画表情]", - @ProtoNumber(10) @JvmField val unknown5: Int = 0, - @ProtoNumber(15) @JvmField val unknwon6: Int = 5 - ) : ProtoBuf { - companion object { - @JvmField - val DEFAULT: ByteArray = PbReserve().toByteArray(serializer()) - } - } @Serializable internal class OnlineImage( diff --git a/mirai-core/src/commonMain/kotlin/network/protocol/data/proto/PbReserve.kt b/mirai-core/src/commonMain/kotlin/network/protocol/data/proto/PbReserve.kt index bdb62d5fb..df36a37c6 100644 --- a/mirai-core/src/commonMain/kotlin/network/protocol/data/proto/PbReserve.kt +++ b/mirai-core/src/commonMain/kotlin/network/protocol/data/proto/PbReserve.kt @@ -14,9 +14,62 @@ import kotlinx.serialization.protobuf.ProtoNumber import net.mamoe.mirai.internal.network.protocol.packet.EMPTY_BYTE_ARRAY import net.mamoe.mirai.internal.utils.io.ProtoBuf +internal class NotOnlineImage { + @Serializable + internal class ResvAttr( + @JvmField @ProtoNumber(1) val imageBizType: Int = 0, + @JvmField @ProtoNumber(2) val customfaceType: Int = 0, + @JvmField @ProtoNumber(3) val emojiPackageid: Int = 0, + @JvmField @ProtoNumber(4) val emojiId: Int = 0, + @JvmField @ProtoNumber(5) val text: String = "", + @JvmField @ProtoNumber(6) val doutuSuppliers: String = "", + @JvmField @ProtoNumber(8) val textSummary: ByteArray = EMPTY_BYTE_ARRAY, + @JvmField @ProtoNumber(10) val emojiFrom: Int = 0, + @JvmField @ProtoNumber(11) val emojiSource: String = "", + @JvmField @ProtoNumber(12) val emojiWebUrl: String = "", + @JvmField @ProtoNumber(13) val emojiIconUrl: String = "", + @JvmField @ProtoNumber(14) val emojiMarketFaceName: String = "", + @JvmField @ProtoNumber(15) val source: Int = 0, + @JvmField @ProtoNumber(16) val cameraCaptureTemplateinfo: String = "", + @JvmField @ProtoNumber(17) val cameraCaptureMaterialname: String = "", + @JvmField @ProtoNumber(18) val adEmoJumpUrl: String = "", + @JvmField @ProtoNumber(19) val adEmoDescStr: String = "" + ) : ProtoBuf +} + +internal class CustomFace { + @Serializable + internal class AnimationImageShow( + @JvmField @ProtoNumber(1) val int32EffectId: Int = 0, + @JvmField @ProtoNumber(2) val animationParam: ByteArray = EMPTY_BYTE_ARRAY + ) : ProtoBuf + + @Serializable + internal class ResvAttr( + @JvmField @ProtoNumber(1) val imageBizType: Int = 0, + @JvmField @ProtoNumber(2) val customfaceType: Int = 0, + @JvmField @ProtoNumber(3) val emojiPackageid: Int = 0, + @JvmField @ProtoNumber(4) val emojiId: Int = 0, + @JvmField @ProtoNumber(5) val text: String = "", + @JvmField @ProtoNumber(6) val doutuSuppliers: String = "", + @JvmField @ProtoNumber(7) val msgImageShow: AnimationImageShow? = null, + @JvmField @ProtoNumber(9) val textSummary: ByteArray = EMPTY_BYTE_ARRAY, + @JvmField @ProtoNumber(10) val emojiFrom: Int = 0, + @JvmField @ProtoNumber(11) val emojiSource: String = "", + @JvmField @ProtoNumber(12) val emojiWebUrl: String = "", + @JvmField @ProtoNumber(13) val emojiIconUrl: String = "", + @JvmField @ProtoNumber(14) val emojiMarketFaceName: String = "", + @JvmField @ProtoNumber(15) val source: Int = 0, + @JvmField @ProtoNumber(16) val cameraCaptureTemplateinfo: String = "", + @JvmField @ProtoNumber(17) val cameraCaptureMaterialname: String = "", + @JvmField @ProtoNumber(18) val adEmoJumpUrl: String = "", + @JvmField @ProtoNumber(19) val adEmoDescStr: String = "" + ) : ProtoBuf +} + internal class Generalflags : ProtoBuf { @Serializable -internal class ResvAttr( + internal class ResvAttr( @ProtoNumber(1) @JvmField val globalGroupLevel: Int = 0, @ProtoNumber(2) @JvmField val nearbyCharmLevel: Int = 0, @ProtoNumber(3) @JvmField val redbagMsgSenderUin: Long = 0L, From 57f1e6f303f0b50a7e51d39af4b72fb8c98288fa Mon Sep 17 00:00:00 2001 From: sandtechnology Date: Tue, 26 Jan 2021 22:00:59 +0800 Subject: [PATCH 2/2] update api changes --- .../api/binary-compatibility-validator.api | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/binary-compatibility-validator/api/binary-compatibility-validator.api b/binary-compatibility-validator/api/binary-compatibility-validator.api index 2126f049c..95bf43ff0 100644 --- a/binary-compatibility-validator/api/binary-compatibility-validator.api +++ b/binary-compatibility-validator/api/binary-compatibility-validator.api @@ -5067,6 +5067,11 @@ public abstract interface class net/mamoe/mirai/message/data/ServiceMessage : ne public final class net/mamoe/mirai/message/data/ServiceMessage$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey { } +public final class net/mamoe/mirai/message/data/ShowImageFlag : net/mamoe/mirai/message/data/MessageMetadata { + public static final field INSTANCE Lnet/mamoe/mirai/message/data/ShowImageFlag; + public fun toString ()Ljava/lang/String; +} + public final class net/mamoe/mirai/message/data/SimpleServiceMessage : net/mamoe/mirai/message/data/ServiceMessage { public static final field Companion Lnet/mamoe/mirai/message/data/SimpleServiceMessage$Companion; public static final field SERIAL_NAME Ljava/lang/String;