From 04b71514e62f73a4a36ce0742d1e595cc8d280ad Mon Sep 17 00:00:00 2001
From: ryoii <ryoii@foxmail.com>
Date: Tue, 4 Feb 2020 20:06:15 +0800
Subject: [PATCH] update MessageDTO

---
 .../mamoe/mirai/api/http/dto/MessageDTO.kt    | 91 ++++++++++---------
 1 file changed, 48 insertions(+), 43 deletions(-)

diff --git a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/dto/MessageDTO.kt b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/dto/MessageDTO.kt
index 75454633f..2afc10172 100644
--- a/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/dto/MessageDTO.kt
+++ b/mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/dto/MessageDTO.kt
@@ -6,11 +6,13 @@ import net.mamoe.mirai.message.FriendMessage
 import net.mamoe.mirai.message.GroupMessage
 import net.mamoe.mirai.message.MessagePacket
 import net.mamoe.mirai.message.data.*
+import net.mamoe.mirai.utils.MiraiInternalAPI
 
 /*
-    DTO data class
- */
+*   DTO data class
+* */
 
+// MessagePacket
 @Serializable
 @SerialName("FriendMessage")
 data class FriendMessagePacketDTO(val sender: QQDTO) : MessagePacketDTO()
@@ -19,68 +21,71 @@ data class FriendMessagePacketDTO(val sender: QQDTO) : MessagePacketDTO()
 @SerialName("GroupMessage")
 data class GroupMessagePacketDTO(val sender: MemberDTO) : MessagePacketDTO()
 
+// Message
 @Serializable
-data class MessageDTO(val type: MessageType, val data: String) : DTO
+@SerialName("At")
+data class AtDTO(val target: Long, val display: String) : MessageDTO()
+@Serializable
+@SerialName("Face")
+data class FaceDTO(val faceID: Int) : MessageDTO()
+@Serializable
+@SerialName("Plain")
+data class PlainDTO(val text: String) : MessageDTO()
+@Serializable
+@SerialName("Image")
+data class ImageDTO(val path: String) : MessageDTO()
+@Serializable
+@SerialName("Xml")
+data class XmlDTO(val xml: String) : MessageDTO()
+@Serializable
+@SerialName("Unknown")
+data class UnknownMessageDTO(val text: String) : MessageDTO()
+
+/*
+*   Abstract Class
+* */
+@Serializable
+sealed class MessagePacketDTO : DTO {
+    lateinit var messageChain : MessageChainDTO
+}
 
 typealias MessageChainDTO = Array<MessageDTO>
 
 @Serializable
-abstract class MessagePacketDTO : DTO {
-    lateinit var messageChain : MessageChainDTO
-
-    companion object {
-        val EMPTY = @SerialName("UnknownMessage") object : MessagePacketDTO() {}
-    }
-}
+sealed class MessageDTO : DTO
 
 
 /*
     Extend function
  */
-suspend fun MessagePacket<*, *>.toDTO(): MessagePacketDTO = when (this) {
+suspend fun MessagePacket<*, *>.toDTO(): MessagePacketDTO? = when (this) {
     is FriendMessage -> FriendMessagePacketDTO(QQDTO(sender))
     is GroupMessage -> GroupMessagePacketDTO(MemberDTO(sender, senderName))
-    else -> MessagePacketDTO.EMPTY
-}.apply { messageChain = Array(message.size){ message[it].toDTO() }}
+    else -> null
+}?.apply { messageChain = Array(message.size){ message[it].toDTO() }}
 
 fun MessageChainDTO.toMessageChain() =
     MessageChain().apply { this@toMessageChain.forEach { add(it.toMessage()) } }
 
 @UseExperimental(ExperimentalUnsignedTypes::class)
 fun Message.toDTO() = when (this) {
-    is At -> MessageDTO(MessageType.AT, target.toString())
-    is Face -> MessageDTO(MessageType.FACE, id.value.toString())
-    is PlainText -> MessageDTO(MessageType.PLAIN, stringValue)
-//    is Image -> MessageDTO(MessageType.IMAGE, ???)
-    is Image -> MessageDTO(MessageType.IMAGE, "NOT SUPPORT IMAGE NOW")
-    is XMLMessage -> MessageDTO(MessageType.XML, stringValue)
-    else -> MessageDTO(MessageType.UNKNOWN, "not support type")
+    is At -> AtDTO(target, display)
+    is Face -> FaceDTO(id.value.toInt())
+    is PlainText -> PlainDTO(stringValue)
+    is Image -> ImageDTO(this.toString())
+    is XMLMessage -> XmlDTO(stringValue)
+    else -> UnknownMessageDTO("未知消息类型")
 }
 
-@UseExperimental(ExperimentalUnsignedTypes::class)
-fun MessageDTO.toMessage() = when (type) {
-    MessageType.AT -> At(data.toLong())
-    MessageType.FACE -> Face(FaceId(data.toUByte()))
-    MessageType.PLAIN -> PlainText(data)
-//    MessageType.IMAGE -> Image(???)
-    MessageType.IMAGE -> PlainText(data)
-    MessageType.XML -> XMLMessage(data)
-    MessageType.UNKNOWN -> PlainText(data)
+@UseExperimental(ExperimentalUnsignedTypes::class, MiraiInternalAPI::class)
+fun MessageDTO.toMessage() = when (this) {
+    is AtDTO -> At(target, display)
+    is FaceDTO -> Face(FaceId(faceID.toUByte()))
+    is PlainDTO -> PlainText(text)
+    is ImageDTO -> PlainText("[暂时不支持图片]")
+    is XmlDTO -> XMLMessage(xml)
+    is UnknownMessageDTO -> PlainText("assert cannot reach")
 }
 
 
-/*
-    Enum
- */
-
-// TODO: will be replace by [net.mamoe.mirai.message.MessageType]
-enum class MessageType {
-    AT,
-    FACE,
-    PLAIN,
-    IMAGE,
-    XML,
-    UNKNOWN,
-}
-