From a64c0613776124218596d454537d36be4e43af79 Mon Sep 17 00:00:00 2001
From: Him188 <Him188@mamoe.net>
Date: Sun, 8 Mar 2020 22:14:59 +0800
Subject: [PATCH] Support `LightApp` message

---
 .../mamoe/mirai/qqandroid/message/messages.kt | 20 ++++++++++++++--
 .../net.mamoe.mirai/message/data/Json.kt      |  5 +---
 .../net.mamoe.mirai/message/data/LightApp.kt  | 24 +++++++++++++++++++
 .../message/data/MessageChain.kt              |  1 +
 .../message/data/RichMessage.kt               |  3 ---
 .../net.mamoe.mirai/message/data/XML.kt       |  2 +-
 6 files changed, 45 insertions(+), 10 deletions(-)
 create mode 100644 mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/LightApp.kt

diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/messages.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/messages.kt
index bed9a11b5..53b1486b8 100644
--- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/messages.kt
+++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/message/messages.kt
@@ -239,10 +239,21 @@ internal fun MessageChain.toRichTextElems(forGroup: Boolean): MutableList<ImMsgB
                 elements.add(ImMsgBody.Elem(text = it.toJceData()))
                 elements.add(ImMsgBody.Elem(text = ImMsgBody.Text(str = " ")))
             }
+            is LightApp -> elements.add(
+                ImMsgBody.Elem(
+                    lightApp = ImMsgBody.LightAppElem(
+                        data = byteArrayOf(1) + MiraiPlatformUtils.zip(it.content.toByteArray())
+                    )
+                )
+            )
             is RichMessage -> elements.add(
                 ImMsgBody.Elem(
                     richMsg = ImMsgBody.RichMsg(
-                        serviceId = it.serviceId,
+                        serviceId = when (it) {
+                            is XmlMessage -> 60
+                            is JsonMessage -> 1
+                            else -> error("unsupported RichMessage")
+                        },
                         template1 = byteArrayOf(1) + MiraiPlatformUtils.zip(it.content.toByteArray())
                     )
                 )
@@ -274,6 +285,7 @@ internal fun MessageChain.toRichTextElems(forGroup: Boolean): MutableList<ImMsgB
     this.forEach(::transformOneMessage)
 
     if (this.any<RichMessage>()) {
+        // 08 09 78 00 A0 01 81 DC 01 C8 01 00 F0 01 00 F8 01 00 90 02 00 98 03 00 A0 03 20 B0 03 00 C0 03 00 D0 03 00 E8 03 00 8A 04 02 08 03 90 04 80 80 80 10 B8 04 00 C0 04 00
         elements.add(ImMsgBody.Elem(generalFlags = ImMsgBody.GeneralFlags(pbReserve = "08 09 78 00 C8 01 00 F0 01 00 F8 01 00 90 02 00 C8 02 00 98 03 00 A0 03 20 B0 03 00 C0 03 00 D0 03 00 E8 03 00 8A 04 02 08 03 90 04 80 80 80 10 B8 04 00 C0 04 00".hexToBytes())))
     } else elements.add(ImMsgBody.Elem(generalFlags = ImMsgBody.GeneralFlags(pbReserve = "78 00 F8 01 00 C8 02 00".hexToBytes())))
 
@@ -343,7 +355,7 @@ internal class OnlineFriendImageImpl(
 internal fun MsgComm.Msg.toMessageChain(): MessageChain {
     val elements = this.msgBody.richText.elems
 
-    if (this.msgHead.fromUin == 1040400290L){
+    if (this.msgHead.fromUin == 1040400290L) {
         println(this._miraiContentToString())
     }
 
@@ -408,6 +420,10 @@ internal fun List<ImMsgBody.Elem>.joinToMessageChain(message: MessageChainBuilde
                     }
                 }
             }
+            it.lightApp != null -> {
+                val content = MiraiPlatformUtils.unzip(it.lightApp.data, 1).encodeToString()
+                message.add(LightApp(content))
+            }
             it.richMsg != null -> {
                 println(this._miraiContentToString())
                 val content = MiraiPlatformUtils.unzip(it.richMsg.template1, 1).encodeToString()
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Json.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Json.kt
index 98407774c..cb8619ca7 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Json.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/Json.kt
@@ -16,9 +16,6 @@ import net.mamoe.mirai.utils.SinceMirai
 @OptIn(MiraiExperimentalAPI::class)
 class JsonMessage(override val content: String) : RichMessage {
     companion object Key : Message.Key<JsonMessage>
-
-    override val serviceId: Int
-        get() = 1
-
+    // serviceId = 1
     override fun toString(): String = content
 }
\ No newline at end of file
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/LightApp.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/LightApp.kt
new file mode 100644
index 000000000..f5b187b38
--- /dev/null
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/LightApp.kt
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2020 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
+
+import net.mamoe.mirai.utils.MiraiExperimentalAPI
+import net.mamoe.mirai.utils.SinceMirai
+
+/**
+ * 小程序, 如音乐分享
+ */
+@OptIn(MiraiExperimentalAPI::class)
+@SinceMirai("0.27.0")
+class LightApp constructor(override val content: String) : RichMessage {
+    companion object Key : Message.Key<LightApp>
+
+    override fun toString(): String = content
+}
\ No newline at end of file
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt
index ea61fa3ed..a12e28029 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/MessageChain.kt
@@ -133,6 +133,7 @@ fun <M : Message> MessageChain.firstOrNull(key: Message.Key<M>): M? = when (key)
     XmlMessage -> first<XmlMessage>()
     JsonMessage -> first<JsonMessage>()
     RichMessage -> first<RichMessage>()
+    LightApp -> first<LightApp>()
     else -> null
 } as M?
 
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/RichMessage.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/RichMessage.kt
index 27601e147..2363e3dcb 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/RichMessage.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/RichMessage.kt
@@ -21,9 +21,6 @@ import net.mamoe.mirai.utils.SinceMirai
 interface RichMessage : MessageContent {
     companion object Key : Message.Key<RichMessage>
 
-    @MiraiExperimentalAPI
-    val serviceId: Int
-
     @MiraiExperimentalAPI
     val content: String
 }
\ No newline at end of file
diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/XML.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/XML.kt
index 55a55303c..a61c6d535 100644
--- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/XML.kt
+++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data/XML.kt
@@ -29,7 +29,7 @@ import kotlin.jvm.JvmName
 class XmlMessage constructor(override val content: String) : RichMessage {
     companion object Key : Message.Key<XmlMessage>
 
-    override val serviceId: Int get() = 60
+    // override val serviceId: Int get() = 60
 
     override fun toString(): String = content
 }