From 6b4a429821f09350943c04b2ff891752afaf84c1 Mon Sep 17 00:00:00 2001 From: Simplxs Date: Sun, 26 Nov 2023 22:06:26 +0800 Subject: [PATCH] `Shamrock`: fix forward msg nesting(x --- .../qqinterface/servlet/msg/MessageMaker.kt | 12 + .../fuqiuluo/shamrock/helper/MessageHelper.kt | 27 +- .../shamrock/remote/action/ActionManager.kt | 4 +- .../action/handlers/SendForwardMessage.kt | 169 +++++++++++++ .../remote/action/handlers/SendForwardMsg.kt | 233 ------------------ .../handlers/SendGroupForwardMessage.kt | 21 ++ .../handlers/SendPrivateForwardMessage.kt | 21 ++ .../action/handlers/SendPrivateMessage.kt | 8 +- .../shamrock/remote/api/MessageAction.kt | 18 +- .../shamrock/remote/service/data/Message.kt | 5 + 10 files changed, 258 insertions(+), 260 deletions(-) create mode 100644 xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendForwardMessage.kt delete mode 100644 xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendForwardMsg.kt create mode 100644 xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupForwardMessage.kt create mode 100644 xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateForwardMessage.kt diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/MessageMaker.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/MessageMaker.kt index a86814d..189788e 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/MessageMaker.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/MessageMaker.kt @@ -96,9 +96,21 @@ internal object MessageMaker { "touch" to MessageMaker::createTouchElem, "weather" to MessageMaker::createWeatherElem, "json" to MessageMaker::createJsonElem, + //"node" to MessageMaker::createNodeElem, //"multi_msg" to MessageMaker::createLongMsgStruct, ) +// private suspend fun createNodeElem( +// chatType: Int, +// msgId: Long, +// peerId: String, +// data: JsonObject +// ): Result { +// data.checkAndThrow("data") +// SendForwardMessage(MsgConstant.KCHATTYPEC2C, TicketSvc.getUin(), data["content"].asJsonArray) +// +// } + private suspend fun createJsonElem( chatType: Int, msgId: Long, diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MessageHelper.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MessageHelper.kt index 62ed859..9b12d6f 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MessageHelper.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MessageHelper.kt @@ -74,7 +74,7 @@ internal object MessageHelper { val nonMsg: Boolean = message.isEmpty() return if (!nonMsg) { val service = QRoute.api(IMsgService::class.java) - if(callback is MsgSvc.MessageCallback) { + if (callback is MsgSvc.MessageCallback) { callback.msgHash = uniseq.first } @@ -107,7 +107,7 @@ internal object MessageHelper { val nonMsg: Boolean = message.isEmpty() return if (!nonMsg) { val service = QRoute.api(IMsgService::class.java) - if(callback is MsgSvc.MessageCallback) { + if (callback is MsgSvc.MessageCallback) { callback.msgHash = uniseq.first } @@ -132,7 +132,7 @@ internal object MessageHelper { val nonMsg: Boolean = message.isEmpty() return if (!nonMsg) { val service = QRoute.api(IMsgService::class.java) - if(callback is MsgSvc.MessageCallback) { + if (callback is MsgSvc.MessageCallback) { callback.msgHash = uniseq.first } @@ -156,7 +156,7 @@ internal object MessageHelper { } fun obtainMessageTypeByDetailType(detailType: String): Int { - return when(detailType) { + return when (detailType) { "troop", "group" -> MsgConstant.KCHATTYPEGROUP "private" -> MsgConstant.KCHATTYPEC2C "less" -> MsgConstant.KCHATTYPETEMPC2CFROMUNKNOWN @@ -166,7 +166,7 @@ internal object MessageHelper { } fun obtainDetailTypeByMsgType(msgType: Int): String { - return when(msgType) { + return when (msgType) { MsgConstant.KCHATTYPEGROUP -> "group" MsgConstant.KCHATTYPEC2C -> "private" MsgConstant.KCHATTYPEGUILD -> "guild" @@ -180,9 +180,9 @@ internal object MessageHelper { var hasActionMsg = false messageList.forEach { val msg = it.jsonObject - try { - val maker = MessageMaker[msg["type"].asString] - if (maker != null) { + val maker = MessageMaker[msg["type"].asString] + if (maker != null) { + try { val data = msg["data"].asJsonObjectOrNull ?: EmptyJsonObject maker(chatType, msgId, targetUin, data).onSuccess { msgElem -> msgList.add(msgElem) @@ -193,18 +193,19 @@ internal object MessageHelper { hasActionMsg = true } } - } else { - LogCenter.log("不支持的消息类型: ${msg["type"].asString}", Level.ERROR) + } catch (e: Throwable) { + LogCenter.log(e.stackTraceToString(), Level.ERROR) } - } catch (e: Throwable) { - LogCenter.log(e.stackTraceToString(), Level.ERROR) + } else { + LogCenter.log("不支持的消息类型: ${msg["type"].asString}", Level.ERROR) + return false to arrayListOf() } } return hasActionMsg to msgList } fun generateMsgIdHash(chatType: Int, msgId: Long): Int { - val key = when (chatType) { + val key = when (chatType) { MsgConstant.KCHATTYPEGROUP -> "grp$msgId" MsgConstant.KCHATTYPEC2C -> "c2c$msgId" MsgConstant.KCHATTYPETEMPC2CFROMGROUP -> "tmpgrp$msgId" diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt index 075a860..bdbe629 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt @@ -34,8 +34,8 @@ internal object ActionManager { GetGroupSystemMsg, GetProhibitedMemberList, GetEssenceMessageList, GetGroupNotice, SendGroupNotice, // MSG ACTIONS - SendMessage, DeleteMessage, GetMsg, GetForwardMsg, SendGroupForwardMsg, SendGroupMessage, SendPrivateMessage, - ClearMsgs, GetHistoryMsg, GetGroupMsgHistory, SendPrivateForwardMsg, + SendMessage, DeleteMessage, GetMsg, GetForwardMsg, SendPrivateForwardMessage, SendGroupMessage, SendPrivateMessage, + ClearMsgs, GetHistoryMsg, GetGroupMsgHistory, SendGroupForwardMessage, // RESOURCE ACTION GetRecord, GetImage, UploadGroupFile, CreateGroupFileFolder, DeleteGroupFolder, diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendForwardMessage.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendForwardMessage.kt new file mode 100644 index 0000000..8401921 --- /dev/null +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendForwardMessage.kt @@ -0,0 +1,169 @@ +package moe.fuqiuluo.shamrock.remote.action.handlers + +import com.tencent.qqnt.kernel.nativeinterface.MsgConstant +import com.tencent.qqnt.kernel.nativeinterface.MultiMsgInfo +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import kotlinx.serialization.json.JsonArray +import kotlinx.serialization.json.JsonElement +import moe.fuqiuluo.qqinterface.servlet.MsgSvc +import moe.fuqiuluo.qqinterface.servlet.TicketSvc +import moe.fuqiuluo.qqinterface.servlet.msg.convert.toSegments +import moe.fuqiuluo.shamrock.helper.Level +import moe.fuqiuluo.shamrock.helper.LogCenter +import moe.fuqiuluo.shamrock.helper.MessageHelper +import moe.fuqiuluo.shamrock.helper.ParamsException +import moe.fuqiuluo.shamrock.remote.action.ActionSession +import moe.fuqiuluo.shamrock.remote.action.IActionHandler +import moe.fuqiuluo.shamrock.remote.service.data.ForwardMessageResult +import moe.fuqiuluo.shamrock.tools.* +import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher +import kotlin.coroutines.resume +import kotlin.coroutines.suspendCoroutine + +sealed interface ForwardMsgNode { + class MessageIdNode( + val id: Int + ) : ForwardMsgNode + + open class MessageNode( + val name: String, + val content: JsonElement? + ) : ForwardMsgNode + + object EmptyNode : MessageNode("", null) +} + +internal object SendForwardMessage : IActionHandler() { + override suspend fun internalHandle(session: ActionSession): String { + val detailType = session.getStringOrNull("detail_type") ?: session.getStringOrNull("message_type") + try { + val chatType = detailType?.let { + MessageHelper.obtainMessageTypeByDetailType(it) + } ?: run { + if (session.has("user_id")) { + MsgConstant.KCHATTYPEC2C + } else if (session.has("group_id")) { + MsgConstant.KCHATTYPEGROUP + } else { + return noParam("detail_type/message_type", session.echo) + } + } + val peerId = when (chatType) { + MsgConstant.KCHATTYPEGROUP -> session.getStringOrNull("group_id") ?: return noParam( + "group_id", + session.echo + ) + + MsgConstant.KCHATTYPEC2C -> session.getStringOrNull("user_id") ?: return noParam( + "user_id", + session.echo + ) + + else -> error("unknown chat type: $chatType") + } + if (session.isArray("messages")) { + val messages = session.getArray("messages") + invoke(chatType, peerId, messages, echo = session.echo) + } + return logic("未知格式合并转发消息", session.echo) + } catch (e: ParamsException) { + return noParam(e.message!!, session.echo) + } catch (e: Throwable) { + return logic(e.message ?: e.toString(), session.echo) + } + } + + suspend operator fun invoke( + chatType: Int, + peerId: String, + message: JsonArray, + echo: JsonElement = EmptyJsonString + ): String { + kotlin.runCatching { + val kernelService = NTServiceFetcher.kernelService + val sessionService = kernelService.wrapperSession + val msgService = sessionService.msgService + val selfUin = TicketSvc.getUin() + + val msgs = message.map { + if (it.asJsonObject["type"].asStringOrNull != "node") return@map ForwardMsgNode.EmptyNode // 过滤非node类型消息段 + it.asJsonObject["data"].asJsonObject.let { data -> + if (data.containsKey("content")) { + data["content"].asJsonArray.forEach { msg -> + if (msg.asJsonObject["type"].asStringOrNull == "node") { + LogCenter.log("合并转发消息不支持嵌套", Level.ERROR) + return@map ForwardMsgNode.EmptyNode + } + } + ForwardMsgNode.MessageNode( + name = data["name"].asStringOrNull ?: "", + content = data["content"] + ) + } + else ForwardMsgNode.MessageIdNode(data["id"].asInt) + } + }.map { + if (it is ForwardMsgNode.MessageIdNode) { + val recordResult = MsgSvc.getMsg(it.id) + if (!recordResult.isFailure) { + ForwardMsgNode.EmptyNode + } else { + val record = recordResult.getOrThrow() + ForwardMsgNode.MessageNode( + name = record.sendMemberName + .ifBlank { record.sendNickName } + .ifBlank { record.sendRemarkName } + .ifBlank { record.peerName }, + content = record.toSegments().map { segment -> + segment.toJson() + }.json + ) + } + } else { + it as ForwardMsgNode.MessageNode + } + }.filter { + it.content != null + } + + val multiNodes = msgs.map { node -> + suspendCoroutine { + GlobalScope.launch { + var msgId: Long = 0 + msgId = MessageHelper.sendMessageWithMsgId(MsgConstant.KCHATTYPEC2C, selfUin, node.content!!.let { msg -> + if (msg is JsonArray) msg else MessageHelper.decodeCQCode(msg.asString) + }, + { code, why -> + if (code != 0) { + error("合并转发消息节点消息发送失败:$code($why)") + } + it.resume(node.name to msgId) + }).first + } + } + } + + val from = MessageHelper.generateContact(MsgConstant.KCHATTYPEC2C, selfUin) + val to = MessageHelper.generateContact(chatType, peerId) + + val uniseq = MessageHelper.generateMsgId(chatType) + msgService.multiForwardMsg(ArrayList().apply { + multiNodes.forEach { add(MultiMsgInfo(it.second, it.first)) } + }.also { it.reverse() }, from, to, MsgSvc.MessageCallback(peerId, uniseq.first)) + + return ok( + ForwardMessageResult( + msgId = uniseq.first, + forwardId = "" + ), echo = echo) + }.onFailure { + return error("error: $it", echo) + } + return logic("合并转发消息失败(unknown error)", echo) + } + + override val requiredParams: Array = arrayOf("message") + + override fun path(): String = "send_forward_msg" +} \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendForwardMsg.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendForwardMsg.kt deleted file mode 100644 index 33439ad..0000000 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendForwardMsg.kt +++ /dev/null @@ -1,233 +0,0 @@ -@file:OptIn(DelicateCoroutinesApi::class) - -package moe.fuqiuluo.shamrock.remote.action.handlers - -import com.tencent.qqnt.kernel.nativeinterface.MsgConstant -import com.tencent.qqnt.kernel.nativeinterface.MultiMsgInfo -import kotlinx.coroutines.DelicateCoroutinesApi -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch -import kotlinx.serialization.json.JsonArray -import kotlinx.serialization.json.JsonElement -import moe.fuqiuluo.qqinterface.servlet.MsgSvc -import moe.fuqiuluo.shamrock.remote.action.ActionSession -import moe.fuqiuluo.shamrock.remote.action.IActionHandler -import moe.fuqiuluo.qqinterface.servlet.TicketSvc -import moe.fuqiuluo.qqinterface.servlet.msg.convert.toSegments -import moe.fuqiuluo.shamrock.helper.Level -import moe.fuqiuluo.shamrock.helper.LogCenter -import moe.fuqiuluo.shamrock.helper.MessageHelper -import moe.fuqiuluo.shamrock.tools.EmptyJsonObject -import moe.fuqiuluo.shamrock.tools.EmptyJsonString -import moe.fuqiuluo.shamrock.tools.asInt -import moe.fuqiuluo.shamrock.tools.asJsonObject -import moe.fuqiuluo.shamrock.tools.asString -import moe.fuqiuluo.shamrock.tools.asStringOrNull -import moe.fuqiuluo.shamrock.tools.json -import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher -import kotlin.coroutines.resume -import kotlin.coroutines.suspendCoroutine - -/** - * 合并转发消息节点数据类 - */ -sealed interface ForwardMsgNode { - class MessageIdNode( - val id: Int - ): ForwardMsgNode - - open class MessageNode( - val name: String, - val content: JsonElement? - ): ForwardMsgNode - - object EmptyNode: MessageNode("", null) -} - -/** - * 私聊合并转发 - */ -internal object SendPrivateForwardMsg: IActionHandler() { - override suspend fun internalHandle(session: ActionSession): String { - val groupId = session.getString("user_id") - if (session.isArray("messages")) { - val messages = session.getArray("messages") - return invoke(messages, groupId, session.echo) - } - return logic("未知格式合并转发消息", session.echo) - } - - suspend operator fun invoke( - message: JsonArray, - userId: String, - echo: JsonElement = EmptyJsonString - ): String { - kotlin.runCatching { - val kernelService = NTServiceFetcher.kernelService - val sessionService = kernelService.wrapperSession - val msgService = sessionService.msgService - val selfUin = TicketSvc.getUin() - - val msgs = message.map { - if (it.asJsonObject["type"].asStringOrNull != "node") return@map ForwardMsgNode.EmptyNode // 过滤非node类型消息段 - it.asJsonObject["data"].asJsonObject.let { data -> - if (data.containsKey("content")) - ForwardMsgNode.MessageNode( - name = data["name"].asStringOrNull ?: "", - content = data["content"] - ) - else ForwardMsgNode.MessageIdNode(data["id"].asInt) - } - }.map { - if (it is ForwardMsgNode.MessageIdNode) { - val recordResult = MsgSvc.getMsg(it.id) - if (recordResult.isFailure) { - ForwardMsgNode.EmptyNode - } else { - val record = recordResult.getOrThrow() - ForwardMsgNode.MessageNode( - name = record.sendMemberName - .ifBlank { record.sendNickName } - .ifBlank { record.sendRemarkName } - .ifBlank { record.peerName }, - content = record.toSegments().map { segment -> - segment.toJson() - }.json - ) - } - } else { - it as ForwardMsgNode.MessageNode - } - }.filter { - it.content != null - } - - val multiNodes = msgs.map { node -> - suspendCoroutine { - GlobalScope.launch { - var msgId: Long = 0 - msgId = MessageHelper.sendMessageWithMsgId(MsgConstant.KCHATTYPEC2C, selfUin, node.content!!.let { msg -> - if (msg is JsonArray) msg else MessageHelper.decodeCQCode(msg.asString) - }, { code, why -> - if (code != 0) { - LogCenter.log("合并转发消息节点消息发送失败:$code($why)", Level.WARN) - } - it.resume(node.name to msgId) - }).first - } - } - } - - val from = MessageHelper.generateContact(MsgConstant.KCHATTYPEC2C, selfUin) - val to = MessageHelper.generateContact(MsgConstant.KCHATTYPEC2C, userId) - msgService.multiForwardMsg(ArrayList().apply { - multiNodes.forEach { add(MultiMsgInfo(it.second, it.first)) } - }.also { it.reverse() }, from, to) { code, why -> - if (code != 0) - LogCenter.log("合并转发消息:$code($why)", Level.WARN) - } - return ok(data = EmptyJsonObject, echo = echo) - }.onFailure { - return error("error: $it", echo) - } - return logic("合并转发消息失败(unknown error)", echo) - } - - override val requiredParams: Array = arrayOf("user_id") - - override fun path(): String = "send_private_forward_msg" -} - -/** - * 群聊合并转发 - */ -internal object SendGroupForwardMsg: IActionHandler() { - override suspend fun internalHandle(session: ActionSession): String { - val groupId = session.getString("group_id") - if (session.isArray("messages")) { - val messages = session.getArray("messages") - return invoke(messages, groupId, session.echo) - } - return logic("未知格式合并转发消息", session.echo) - } - - suspend operator fun invoke( - message: JsonArray, - groupId: String, - echo: JsonElement = EmptyJsonString - ): String { - kotlin.runCatching { - val kernelService = NTServiceFetcher.kernelService - val sessionService = kernelService.wrapperSession - val msgService = sessionService.msgService - val selfUin = TicketSvc.getUin() - - val msgs = message.map { - if (it.asJsonObject["type"].asStringOrNull != "node") return@map ForwardMsgNode.EmptyNode // 过滤非node类型消息段 - it.asJsonObject["data"].asJsonObject.let { data -> - if (data.containsKey("content")) - ForwardMsgNode.MessageNode( - name = data["name"].asStringOrNull ?: "", - content = data["content"] - ) - else ForwardMsgNode.MessageIdNode(data["id"].asInt) - } - }.map { - if (it is ForwardMsgNode.MessageIdNode) { - val recordResult = MsgSvc.getMsg(it.id) - if (recordResult.isFailure) { - ForwardMsgNode.EmptyNode - } else { - val record = recordResult.getOrThrow() - ForwardMsgNode.MessageNode( - name = record.sendMemberName - .ifBlank { record.sendNickName } - .ifBlank { record.sendRemarkName } - .ifBlank { record.peerName }, - content = record.toSegments().map { segment -> - segment.toJson() - }.json - ) - } - } else { - it as ForwardMsgNode.MessageNode - } - }.filter { - it.content != null - } - - val multiNodes = msgs.map { node -> - suspendCoroutine { - GlobalScope.launch { - var msgId: Long = 0 - msgId = MessageHelper.sendMessageWithMsgId(MsgConstant.KCHATTYPEC2C, selfUin, node.content!!.let { msg -> - if (msg is JsonArray) msg else MessageHelper.decodeCQCode(msg.asString) - }, { code, why -> - if (code != 0) { - LogCenter.log("合并转发消息节点消息发送失败:$code($why)", Level.WARN) - } - it.resume(node.name to msgId) - }).first - } - } - } - - val from = MessageHelper.generateContact(MsgConstant.KCHATTYPEC2C, selfUin) - val to = MessageHelper.generateContact(MsgConstant.KCHATTYPEGROUP, groupId) - msgService.multiForwardMsg(ArrayList().apply { - multiNodes.forEach { add(MultiMsgInfo(it.second, it.first)) } - }.also { it.reverse() }, from, to) { code, why -> - if (code != 0) - LogCenter.log("合并转发消息:$code($why)", Level.WARN) - } - return ok(data = EmptyJsonObject, echo = echo) - }.onFailure { - return error("error: $it", echo) - } - return logic("合并转发消息失败(unknown error)", echo) - } - - override val requiredParams: Array = arrayOf("group_id") - - override fun path(): String = "send_group_forward_msg" -} \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupForwardMessage.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupForwardMessage.kt new file mode 100644 index 0000000..87452dc --- /dev/null +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendGroupForwardMessage.kt @@ -0,0 +1,21 @@ +package moe.fuqiuluo.shamrock.remote.action.handlers; + +import com.tencent.qqnt.kernel.nativeinterface.MsgConstant +import moe.fuqiuluo.shamrock.remote.action.ActionSession +import moe.fuqiuluo.shamrock.remote.action.IActionHandler + +internal object SendGroupForwardMessage: IActionHandler() { + override suspend fun internalHandle(session: ActionSession): String { + val groupId = session.getString("group_id") + return if (session.isArray("messages")) { + val messages = session.getArray("messages") + SendForwardMessage(MsgConstant.KCHATTYPEGROUP, groupId, messages, session.echo) + } else { + logic("未知格式合并转发消息", session.echo) + } + } + + override val requiredParams: Array = arrayOf("messages", "group_id") + + override fun path(): String = "send_group_forward_msg" +} \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateForwardMessage.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateForwardMessage.kt new file mode 100644 index 0000000..4468ba2 --- /dev/null +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateForwardMessage.kt @@ -0,0 +1,21 @@ +package moe.fuqiuluo.shamrock.remote.action.handlers; + +import com.tencent.qqnt.kernel.nativeinterface.MsgConstant +import moe.fuqiuluo.shamrock.remote.action.ActionSession +import moe.fuqiuluo.shamrock.remote.action.IActionHandler + +internal object SendPrivateForwardMessage : IActionHandler() { + override suspend fun internalHandle(session: ActionSession): String { + val userId = session.getString("user_id") + return if (session.isArray("messages")) { + val messages = session.getArray("messages") + SendForwardMessage(MsgConstant.KCHATTYPEC2C, userId, messages, session.echo) + } else { + logic("未知格式合并转发消息", session.echo) + } + } + + override val requiredParams: Array = arrayOf("messages", "user_id") + + override fun path(): String = "send_private_forward_msg" +} \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateMessage.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateMessage.kt index 823bfb9..4f20d72 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateMessage.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/SendPrivateMessage.kt @@ -9,12 +9,12 @@ internal object SendPrivateMessage: IActionHandler() { override suspend fun internalHandle(session: ActionSession): String { val userId = session.getString("user_id") val groupId = session.getStringOrNull("group_id") - val chatTYpe = if (groupId == null) MsgConstant.KCHATTYPEC2C else MsgConstant.KCHATTYPETEMPC2CFROMGROUP + val chatType = if (groupId == null) MsgConstant.KCHATTYPEC2C else MsgConstant.KCHATTYPETEMPC2CFROMGROUP return if (session.isString("message")) { val autoEscape = session.getBooleanOrDefault("auto_escape", false) val message = session.getString("message") SendMessage.invoke( - chatType = chatTYpe, + chatType = chatType, peerId = userId, message = message, autoEscape = autoEscape, @@ -24,7 +24,7 @@ internal object SendPrivateMessage: IActionHandler() { } else if (session.isArray("message")) { val message = session.getArray("message") SendMessage( - chatType = chatTYpe, + chatType = chatType, peerId = userId, message = message, echo = session.echo, @@ -33,7 +33,7 @@ internal object SendPrivateMessage: IActionHandler() { } else { val message = session.getObject("message") SendMessage( - chatType = chatTYpe, + chatType = chatType, peerId = userId, message = listOf( message ).jsonArray, echo = session.echo, diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/MessageAction.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/MessageAction.kt index c9ed7eb..0e32a18 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/MessageAction.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/MessageAction.kt @@ -33,20 +33,22 @@ fun Routing.messageAction() { post { val groupId = fetchPostOrNull("group_id") val messages = fetchPostJsonArray("messages") - call.respondText(SendGroupForwardMsg(messages, groupId ?: ""), ContentType.Application.Json) + call.respondText(SendForwardMessage(MsgConstant.KCHATTYPEGROUP, groupId ?: "", messages), ContentType.Application.Json) } get { respond(false, Status.InternalHandlerError, "Not support GET method") } } - post("/send_group_forward_msg") { - } - - post("/send_private_forward_msg") { - val userId = fetchPostOrNull("user_id") - val messages = fetchPostJsonArray("messages") - call.respondText(SendPrivateForwardMsg(messages, userId ?: ""), ContentType.Application.Json) + route("/send_private_forward_msg") { + post { + val userId = fetchPostOrNull("user_id") + val messages = fetchPostJsonArray("messages") + call.respondText(SendForwardMessage(MsgConstant.KCHATTYPEC2C, userId ?: "", messages), ContentType.Application.Json) + } + get { + respond(false, Status.InternalHandlerError, "Not support GET method") + } } getOrPost("/get_forward_msg") { diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/data/Message.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/data/Message.kt index 8880583..42c8068 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/data/Message.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/data/Message.kt @@ -9,6 +9,11 @@ internal data class MessageResult( @SerialName("message_id") val msgId: Int, @SerialName("time") val time: Long ) +@Serializable +internal data class ForwardMessageResult( + @SerialName("message_id") val msgId: Int, + @SerialName("forward_id") val forwardId: String +) @Serializable internal data class MessageDetail(