Browse Source

Merge pull request #921 from sandtechnology/showImage

Support detect show image, also update pb
HelloWorld 4 years ago
parent
commit
1df5479c0b

+ 5 - 0
binary-compatibility-validator/api/binary-compatibility-validator.api

@@ -5069,6 +5069,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;

+ 19 - 0
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"
+}

+ 9 - 2
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<ImMsgBody.Elem>.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()) {

+ 0 - 15
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(

+ 54 - 1
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,