From ea6d0bb41b53af292ae32e499e2171246006da80 Mon Sep 17 00:00:00 2001 From: PeratX <1215714524@qq.com> Date: Thu, 13 Aug 2020 21:37:51 +0800 Subject: [PATCH] CQCode: implement sending LightApp RichMessage --- Docs.md | 6 ++++-- .../mirainative/message/ChainCodeConverter.kt | 21 +++++++++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/Docs.md b/Docs.md index e96ba48..742ed97 100644 --- a/Docs.md +++ b/Docs.md @@ -30,8 +30,10 @@ - 发送抖一抖 `[CQ:shake]` - 发送各类戳一戳 `[CQ:poke,id=xxx,type=xxx]`,ID和Type见 `mirai` 的 `HummerMessage.kt`,必须在该文件中定义的id和type才能发送 - 接收`VipFace` `[CQ:vipface,id=xxx,name=xxx,count=xxx]` - - 发送 `Xml` 消息 `[CQ:xml,data=xxxx]` - - 发送 `Json` 消息 `[CQ:json,data=xxxx]` + - 发送 `XML` 消息 `[CQ:xml,data=xxxx]` + - 发送 `JSON` 消息 `[CQ:json,data=xxxx]`,少部分 JSON 消息为此类型 + - 发送 `LightApp` 消息 `[CQ:app,data=xxxx]`,大部分 JSON 消息为此类型 + - 接收未知类型 `Rich` 消息 `[CQ:rich,data=xxxx,id=xx]` ## 酷Q API diff --git a/src/main/kotlin/org/itxtech/mirainative/message/ChainCodeConverter.kt b/src/main/kotlin/org/itxtech/mirainative/message/ChainCodeConverter.kt index c3ccbcb..4c9617a 100644 --- a/src/main/kotlin/org/itxtech/mirainative/message/ChainCodeConverter.kt +++ b/src/main/kotlin/org/itxtech/mirainative/message/ChainCodeConverter.kt @@ -56,7 +56,7 @@ object ChainCodeConverter { private fun String.toMap() = HashMap().apply { this@toMap.split(",").forEach { val parts = it.split(delimiters = *arrayOf("="), limit = 2) - this[parts[0]] = parts[1].unescape(true) + this[parts[0].trim()] = parts[1].unescape(true).trim() } } @@ -157,6 +157,12 @@ object ChainCodeConverter { "json" -> { return JsonMessage(args["data"]!!) } + "app" -> { + return LightApp(args["data"]!!) + } + "rich" -> { + return ServiceMessage(args["id"]!!.toInt(), args["data"]!!) + } else -> { MiraiNative.logger.debug("不支持的 CQ码:${parts[0]}") } @@ -175,7 +181,18 @@ object ChainCodeConverter { is Face -> "[CQ:face,id=${it.id}]" is VipFace -> "[CQ:vipface,id=${it.kind.id},name=${it.kind.name},count=${it.count}]" is Image -> "[CQ:image,file=${it.imageId}.mnimg]" // Real file not supported - is RichMessage -> "[CQ:rich,data=${it.content.escape(true)}]" + is RichMessage -> { + val content = it.content.escape(true) + return@joinToString when (it) { + is LightApp -> "[CQ:app,data=$content]" + is ServiceMessage -> when (it.serviceId) { + 60 -> "[CQ:xml,data=$content]" + 1 -> "[CQ:json,data=$content]" + else -> "[CQ:rich,data=${content},id=${it.serviceId}]" + } + else -> "[CQ:rich,data=$content]" // Which is impossible + } + } is Voice -> "[CQ:voice,url=${it.url},md5=${it.md5},file=${it.fileName}]" is PokeMessage -> "[CQ:poke,id=${it.id},type=${it.type},name=${it.name}]" is FlashImage -> "[CQ:image,file=${it.image.imageId}.mning,type=flash]"