Serialization support for MusicShare;

Rename MusicShare.type to kind;
Rename MusicType to MusicKind;
This commit is contained in:
Him188 2021-01-24 00:39:05 +08:00
parent 9d77382b6d
commit 8da048af63
6 changed files with 97 additions and 74 deletions

View File

@ -4661,39 +4661,61 @@ public final class net/mamoe/mirai/message/data/MessageUtils {
public static final synthetic fun toPlainText (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/PlainText;
}
public final class net/mamoe/mirai/message/data/MusicShare : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageContent {
public static final field Key Lnet/mamoe/mirai/message/data/MusicShare$Key;
public fun <init> (Lnet/mamoe/mirai/message/data/MusicType;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
public fun <init> (Lnet/mamoe/mirai/message/data/MusicType;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
public synthetic fun <init> (Lnet/mamoe/mirai/message/data/MusicType;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun contentToString ()Ljava/lang/String;
public fun equals (Ljava/lang/Object;)Z
public final fun getBrief ()Ljava/lang/String;
public final fun getJumpUrl ()Ljava/lang/String;
public fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;
public final fun getMusicUrl ()Ljava/lang/String;
public final fun getPictureUrl ()Ljava/lang/String;
public final fun getSummary ()Ljava/lang/String;
public final fun getTitle ()Ljava/lang/String;
public final fun getType ()Lnet/mamoe/mirai/message/data/MusicType;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}
public final class net/mamoe/mirai/message/data/MusicShare$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {
}
public final class net/mamoe/mirai/message/data/MusicType : java/lang/Enum {
public static final field MiguMusic Lnet/mamoe/mirai/message/data/MusicType;
public static final field NeteaseCloudMusic Lnet/mamoe/mirai/message/data/MusicType;
public static final field QQMusic Lnet/mamoe/mirai/message/data/MusicType;
public final class net/mamoe/mirai/message/data/MusicKind : java/lang/Enum {
public static final field MiguMusic Lnet/mamoe/mirai/message/data/MusicKind;
public static final field NeteaseCloudMusic Lnet/mamoe/mirai/message/data/MusicKind;
public static final field QQMusic Lnet/mamoe/mirai/message/data/MusicKind;
public final fun getAppId ()J
public final fun getPackageName ()Ljava/lang/String;
public final fun getPlatform ()I
public final fun getSdkVersion ()Ljava/lang/String;
public final fun getSignature ()Ljava/lang/String;
public static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MusicType;
public static fun values ()[Lnet/mamoe/mirai/message/data/MusicType;
public static fun valueOf (Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MusicKind;
public static fun values ()[Lnet/mamoe/mirai/message/data/MusicKind;
}
public final class net/mamoe/mirai/message/data/MusicShare : net/mamoe/mirai/message/data/ConstrainSingle, net/mamoe/mirai/message/data/MessageContent {
public static final field Key Lnet/mamoe/mirai/message/data/MusicShare$Key;
public synthetic fun <init> (ILnet/mamoe/mirai/message/data/MusicKind;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V
public fun <init> (Lnet/mamoe/mirai/message/data/MusicKind;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
public fun <init> (Lnet/mamoe/mirai/message/data/MusicKind;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
public final fun component1 ()Lnet/mamoe/mirai/message/data/MusicKind;
public final fun component2 ()Ljava/lang/String;
public final fun component3 ()Ljava/lang/String;
public final fun component4 ()Ljava/lang/String;
public final fun component5 ()Ljava/lang/String;
public final fun component6 ()Ljava/lang/String;
public final fun component7 ()Ljava/lang/String;
public fun contentToString ()Ljava/lang/String;
public final fun copy (Lnet/mamoe/mirai/message/data/MusicKind;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lnet/mamoe/mirai/message/data/MusicShare;
public static synthetic fun copy$default (Lnet/mamoe/mirai/message/data/MusicShare;Lnet/mamoe/mirai/message/data/MusicKind;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lnet/mamoe/mirai/message/data/MusicShare;
public fun equals (Ljava/lang/Object;)Z
public final fun getBrief ()Ljava/lang/String;
public final fun getJumpUrl ()Ljava/lang/String;
public fun getKey ()Lnet/mamoe/mirai/message/data/MessageKey;
public final fun getKind ()Lnet/mamoe/mirai/message/data/MusicKind;
public final fun getMusicUrl ()Ljava/lang/String;
public final fun getPictureUrl ()Ljava/lang/String;
public final fun getSummary ()Ljava/lang/String;
public final fun getTitle ()Ljava/lang/String;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
public static final fun write$Self (Lnet/mamoe/mirai/message/data/MusicShare;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
}
public final class net/mamoe/mirai/message/data/MusicShare$$serializer : kotlinx/serialization/internal/GeneratedSerializer {
public static final field INSTANCE Lnet/mamoe/mirai/message/data/MusicShare$$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/MusicShare;
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/MusicShare;)V
public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer;
}
public final class net/mamoe/mirai/message/data/MusicShare$Key : net/mamoe/mirai/message/data/AbstractPolymorphicMessageKey {
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}
public abstract class net/mamoe/mirai/message/data/OfflineMessageSource : net/mamoe/mirai/message/data/MessageSource {

View File

@ -100,6 +100,8 @@ private val builtInSerializersModule by lazy {
contextual(VipFace::class, VipFace.serializer())
contextual(FlashImage::class, FlashImage.serializer())
contextual(MusicShare::class, MusicShare.serializer())
contextual(MessageSource::class, MessageSource.serializer())
fun PolymorphicModuleBuilder<MessageMetadata>.messageMetadataSubclasses() {
@ -127,6 +129,8 @@ private val builtInSerializersModule by lazy {
subclass(PokeMessage::class, PokeMessage.serializer())
subclass(VipFace::class, VipFace.serializer())
subclass(FlashImage::class, FlashImage.serializer())
subclass(MusicShare::class, MusicShare.serializer())
}
contextual(SingleMessage::class, SingleMessage.Serializer)
@ -169,6 +173,8 @@ private val builtInSerializersModule by lazy {
}
}
// Tests:
// net.mamoe.mirai.internal.message.data.MessageSerializationTest
internal object MessageSerializersImpl : MessageSerializers {
@Volatile
private var serializersModuleField: SerializersModule? = null

View File

@ -11,7 +11,7 @@
package net.mamoe.mirai.message.data
import net.mamoe.mirai.utils.MiraiExperimentalApi
import kotlinx.serialization.Serializable
import net.mamoe.mirai.utils.MiraiInternalApi
import net.mamoe.mirai.utils.safeCast
@ -20,12 +20,12 @@ import net.mamoe.mirai.utils.safeCast
*
* @since 2.1
*/
@MiraiExperimentalApi
public class MusicShare @JvmOverloads constructor(
@Serializable
public data class MusicShare(
/**
* 音乐应用类型
*/
public val type: MusicType,
public val kind: MusicKind, // 'type' is reserved by serialization
/**
* 消息卡片标题
*/
@ -49,59 +49,53 @@ public class MusicShare @JvmOverloads constructor(
/**
* 在消息列表显示
*/
public val brief: String = "[分享]$title",
public val brief: String,
) : MessageContent, ConstrainSingle {
public constructor(
/**
* 音乐应用类型
*/
kind: MusicKind,
/**
* 消息卡片标题
*/
title: String,
/**
* 消息卡片内容
*/
summary: String,
/**
* 点击卡片跳转网页 URL
*/
jumpUrl: String,
/**
* 消息卡片图片 URL
*/
pictureUrl: String,
/**
* 音乐文件 URL
*/
musicUrl: String,
) : this(kind, title, summary, jumpUrl, pictureUrl, musicUrl, "[分享]$title")
// kotlinx serialization doesn't support default arguments.
override val key: MessageKey<*> get() = Key
override fun contentToString(): String =
brief.takeIf { it.isNotBlank() } ?: "[分享]$title" // empty content is not accepted by `sendMessage`
// MusicShare(type=NeteaseCloudMusic, title='ファッション', summary='rinahamu/Yunomi', brief='', url='http://music.163.com/song/1338728297/?userid=324076307', pictureUrl='http://p2.music.126.net/y19E5SadGUmSR8SZxkrNtw==/109951163785855539.jpg', musicUrl='http://music.163.com/song/media/outer/url?id=1338728297&userid=324076307')
override fun toString(): String {
return "MusicShare(type=$type, title='$title', summary='$summary', brief='$brief', url='$jumpUrl', pictureUrl='$pictureUrl', musicUrl='$musicUrl')"
}
// don't make this class 'data' unless we made it stable.
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as MusicShare
if (type != other.type) return false
if (title != other.title) return false
if (summary != other.summary) return false
if (brief != other.brief) return false
if (jumpUrl != other.jumpUrl) return false
if (pictureUrl != other.pictureUrl) return false
if (musicUrl != other.musicUrl) return false
return true
}
override fun hashCode(): Int {
var result = type.hashCode()
result = 31 * result + title.hashCode()
result = 31 * result + summary.hashCode()
result = 31 * result + brief.hashCode()
result = 31 * result + jumpUrl.hashCode()
result = 31 * result + pictureUrl.hashCode()
result = 31 * result + musicUrl.hashCode()
return result
}
public companion object Key :
AbstractPolymorphicMessageKey<MessageContent, MusicShare>(MessageContent, { it.safeCast() })
}
/**
* @see MusicShare.kind
* @since 2.1
*/
public enum class MusicType constructor(
public enum class MusicKind constructor(
@MiraiInternalApi public val appId: Long,
@MiraiInternalApi public val platform: Int,
@MiraiInternalApi public val sdkVersion: String,

View File

@ -13,8 +13,8 @@ import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import net.mamoe.mirai.message.data.LightApp
import net.mamoe.mirai.message.data.MusicKind
import net.mamoe.mirai.message.data.MusicShare
import net.mamoe.mirai.message.data.MusicType
import net.mamoe.mirai.message.data.SingleMessage
private val json = Json {
@ -34,10 +34,10 @@ internal fun LightApp.refine(): SingleMessage {
val struct = tryDeserialize() ?: return this
struct.run {
if (meta.music != null) {
MusicType.values().find { it.appId.toInt() == meta.music.appid }?.let { musicType ->
MusicKind.values().find { it.appId.toInt() == meta.music.appid }?.let { musicType ->
meta.music.run {
return MusicShare(
type = musicType, title = title, summary = desc,
kind = musicType, title = title, summary = desc,
jumpUrl = jumpUrl, pictureUrl = preview, musicUrl = musicUrl, brief = prompt
)
}

View File

@ -49,7 +49,7 @@ internal object MusicSharePacket :
targetKind: MessageSourceKind
) = buildOutgoingUniPacket(client) {
with(musicShare) {
val musicType = musicShare.type
val musicType = musicShare.kind
writeProtoBuf(
OidbSso.OIDBSSOPkg.serializer(),
OidbSso.OIDBSSOPkg(

View File

@ -28,7 +28,7 @@ internal class MessageSerializationTest {
private val format
get() = Json {
serializersModule = module
useArrayPolymorphism = false // ?
useArrayPolymorphism = false
ignoreUnknownKeys = true
}
@ -101,6 +101,7 @@ internal class MessageSerializationTest {
LightApp("lightApp"),
image.flash(),
image.toForwardMessage(1L, "test"),
MusicShare(MusicKind.NeteaseCloudMusic, "123", "123", "123", "123", "123", "123")
)
companion object {