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

Generalize RichMessageOrigin, add origin and kind. Add RichMessageKind.

This commit is contained in:
Him188 2021-02-03 08:42:02 +08:00
parent e381a2b33f
commit 54050523c3
3 changed files with 91 additions and 16 deletions
binary-compatibility-validator/api
mirai-core-api/src/commonMain/kotlin/message/data
mirai-core/src/commonMain/kotlin/message

View File

@ -5075,21 +5075,40 @@ public final class net/mamoe/mirai/message/data/RichMessage$Key : net/mamoe/mira
public static synthetic fun share$default (Lnet/mamoe/mirai/message/data/RichMessage$Key;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/ServiceMessage;
}
public final class net/mamoe/mirai/message/data/RichMessageKind : java/lang/Enum {
public static final field FORWARD Lnet/mamoe/mirai/message/data/RichMessageKind;
public static final field LONG Lnet/mamoe/mirai/message/data/RichMessageKind;
public static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/RichMessageKind;
public static fun values ()[Lnet/mamoe/mirai/message/data/RichMessageKind;
}
public final class net/mamoe/mirai/message/data/RichMessageOrigin : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageMetadata {
public static final field Key Lnet/mamoe/mirai/message/data/RichMessageOrigin$Key;
public fun <init> (Ljava/lang/String;)V
public final fun component1 ()Ljava/lang/String;
public final fun copy (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/RichMessageOrigin;
public static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/RichMessageOrigin;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/RichMessageOrigin;
public fun equals (Ljava/lang/Object;)Z
public synthetic fun <init> (ILnet/mamoe/mirai/message/data/RichMessage;Ljava/lang/String;Lnet/mamoe/mirai/message/data/RichMessageKind;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V
public fun <init> (Lnet/mamoe/mirai/message/data/RichMessage;Ljava/lang/String;Lnet/mamoe/mirai/message/data/RichMessageKind;)V
public fun contentToString ()Ljava/lang/String;
public synthetic fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;
public fun getKey ()Lnet/mamoe/mirai/message/data/RichMessageOrigin$Key;
public final fun getKind ()Lnet/mamoe/mirai/message/data/RichMessageKind;
public final fun getOrigin ()Lnet/mamoe/mirai/message/data/RichMessage;
public final fun getResourceId ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
public static final fun write$Self (Lnet/mamoe/mirai/message/data/RichMessageOrigin;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
}
public final class net/mamoe/mirai/message/data/RichMessageOrigin$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
public static final field INSTANCE Lnet/mamoe/mirai/message/data/RichMessageOrigin$$serializer;
public fun childSerializers ()[Lkotlinx/serialization/KSerializer;
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lnet/mamoe/mirai/message/data/RichMessageOrigin;
public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lnet/mamoe/mirai/message/data/RichMessageOrigin;)V
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
}
public final class net/mamoe/mirai/message/data/RichMessageOrigin$Key : net/mamoe/mirai/message/data/AbstractMessageKey {
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public abstract interface class net/mamoe/mirai/message/data/ServiceMessage : net/mamoe/mirai/message/code/CodableMessage, net/mamoe/mirai/message/data/RichMessage {

View File

@ -7,30 +7,86 @@
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
@file:Suppress("MemberVisibilityCanBePrivate", "unused")
package net.mamoe.mirai.message.data
import kotlinx.serialization.Polymorphic
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import net.mamoe.mirai.IMirai
import net.mamoe.mirai.utils.MiraiExperimentalApi
import net.mamoe.mirai.utils.safeCast
/**
* 标识一个长消息.
* 标识来源 [RichMessage], 存在于接收的 [MessageChain] . 在发送消息时会被忽略.
*
* 一些 [RichMessage] 会被 mirai 解析成特定的更易使用的类型, :
* - 长消息会被协议内部转化为 [ServiceMessage] `serviceId=35` 通过独立通道上传和下载并获得一个 [resourceId]. mirai 会自动下载长消息并把他们解析为 [MessageChain].
* - 合并转发也使用长消息通道传输, 拥有 [resourceId], mirai 解析为 [ForwardMessage]
* - [MusicShare] 也有特殊通道上传, 但会作为 [LightApp] 接收.
*
* 消息过长后会通过特殊的通道上传和下载, 每条消息都会获得一个 resourceId.
* 这些经过转换的类型的来源 [RichMessage] 会被包装为 [RichMessageOrigin] 并加入消息链中.
*
* 可以通过 resourceId 下载消息 [IMirai.downloadLongMessage].
* 但不保证 resourceId 一直有效.
* 如一条被 mirai 解析的长消息的消息链组成为, 第一个元素为 [MessageSource], 第二个元素为 [RichMessageOrigin], 随后为长消息内容.
*
* 又如一条被 mirai 解析的 [MusicShare] 的消息链组成为, 第一个元素为 [MessageSource], 第二个元素为 [RichMessageOrigin], 第三个元素为 [MusicShare].
*
* @suppress **注意**: 这是实验性 API: 类名, 类的类型, 构造, 属性等所有 API 均不稳定. 可能会在未来任意时刻变更.
*
* @since 2.3
*/
@MiraiExperimentalApi
public data class RichMessageOrigin(
val resourceId: String
@Serializable
@SerialName("RichMessageOrigin")
@MiraiExperimentalApi("RichMessageOrigin 不稳定")
public class RichMessageOrigin(
/**
* [RichMessage].
*/
public val origin: @Polymorphic RichMessage,
/**
* 如果来自长消息或转发消息, 则会有 [resourceId], 否则为 `null`.
*
* - 下载长消息 [IMirai.downloadLongMessage]
* - 下载合并转发消息 [IMirai.downloadForwardMessage]
*/
public val resourceId: String?,
/**
* 来源类型
*/
public val kind: RichMessageKind,
) : MessageMetadata, ConstrainSingle {
override val key: Key get() = Key
override fun toString(): String = ""
override fun toString(): String {
val resourceId = resourceId
return if (resourceId == null) "[mirai:origin:$kind]"
else "[mirai:origin:$kind,$resourceId]"
}
override fun contentToString(): String = ""
public companion object Key : AbstractMessageKey<RichMessageOrigin>({ it.safeCast() })
}
/**
* 消息来源
*
* @suppress 随着更新, 元素数量会增加. 类名不稳定.
*
* @since 2.3
*/
@MiraiExperimentalApi("RichMessageKind 类名不稳定")
public enum class RichMessageKind {
/**
* 长消息
*/
LONG,
/**
* 合并转发
*/
FORWARD,
// TODO: 2021/2/3 MusicShare RichMessageKind
}

View File

@ -24,7 +24,7 @@ internal data class LongMessageInternal internal constructor(override val conten
val bot = contact.bot.asQQAndroidBot()
val long = Mirai.downloadLongMessage(bot, resId)
return RichMessageOrigin(resId) + long
return RichMessageOrigin(SimpleServiceMessage(serviceId, content), resId, RichMessageKind.LONG) + long
}
companion object Key :
@ -59,7 +59,7 @@ internal data class ForwardMessageInternal(override val content: String, val res
val preview = titles
val source = xmlFoot.findField("name")
return RichMessageOrigin(resId) + ForwardMessage(
return RichMessageOrigin(SimpleServiceMessage(serviceId, content), resId, RichMessageKind.FORWARD) + ForwardMessage(
preview = preview,
title = title,
brief = brief,