1
0
mirror of https://github.com/mamoe/mirai.git synced 2025-04-24 20:43:33 +08:00

Merge pull request from sandtechnology/showImage

Support detect show image, also update pb
This commit is contained in:
HelloWorld 2021-01-26 22:26:59 +08:00 committed by GitHub
commit 1df5479c0b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 87 additions and 18 deletions
binary-compatibility-validator/api
mirai-core-api/src/commonMain/kotlin/message/data
mirai-core/src/commonMain/kotlin
message
network/protocol/data/proto

View File

@ -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;

View File

@ -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"
}

View File

@ -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()) {

View File

@ -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(

View File

@ -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,