From 35c82fcc516e160a222f2242ed3cbf32d2d39e26 Mon Sep 17 00:00:00 2001 From: WhiteChi Date: Thu, 21 Dec 2023 00:55:56 +0800 Subject: [PATCH] `Shamrock`: fix #169 --- .../shamrock/remote/service/HttpService.kt | 118 +++++++++++------- 1 file changed, 74 insertions(+), 44 deletions(-) diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/HttpService.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/HttpService.kt index 4372005..1710f7b 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/HttpService.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/HttpService.kt @@ -7,6 +7,9 @@ import com.tencent.qqnt.kernel.nativeinterface.MsgRecord import moe.fuqiuluo.qqinterface.servlet.GroupSvc import moe.fuqiuluo.qqinterface.servlet.MsgSvc import io.ktor.client.statement.bodyAsText +import io.ktor.http.ContentType +import io.ktor.server.application.call +import io.ktor.server.response.respondText import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Job @@ -14,6 +17,7 @@ import kotlinx.coroutines.launch import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonPrimitive import moe.fuqiuluo.qqinterface.servlet.msg.* import moe.fuqiuluo.shamrock.remote.service.api.HttpTransmitServlet @@ -21,6 +25,11 @@ import moe.fuqiuluo.shamrock.remote.service.data.push.* import moe.fuqiuluo.shamrock.tools.* import moe.fuqiuluo.shamrock.helper.Level import moe.fuqiuluo.shamrock.helper.LogCenter +import moe.fuqiuluo.shamrock.remote.action.ActionManager +import moe.fuqiuluo.shamrock.remote.action.ActionSession +import moe.fuqiuluo.shamrock.remote.config.ECHO_KEY +import moe.fuqiuluo.shamrock.remote.entries.EmptyObject +import moe.fuqiuluo.shamrock.remote.entries.Status import moe.fuqiuluo.shamrock.remote.service.api.GlobalEventTransmitter internal object HttpService: HttpTransmitServlet() { @@ -66,65 +75,86 @@ internal object HttpService: HttpTransmitServlet() { private suspend fun handleQuicklyReply(record: MsgRecord, msgHash: Int, jsonText: String) { try { - val data = Json.parseToJsonElement(jsonText).asJsonObject - if (data.containsKey("reply")) { - LogCenter.log({ "quickly reply successfully" }, Level.DEBUG) - val autoEscape = data["auto_escape"].asBooleanOrNull ?: false - val atSender = data["at_sender"].asBooleanOrNull ?: false - val autoReply = data["auto_reply"].asBooleanOrNull ?: true - val message = data["reply"] - if (message is JsonPrimitive) { - if (autoEscape) { - val msgList = mutableSetOf() - msgList.add(mapOf( - "type" to "text", - "data" to mapOf( - "text" to message.asString + val data = Json.parseToJsonElement(jsonText) + + if (data is JsonObject) { + if (data.containsKey("reply")) { + LogCenter.log({ "quickly reply successfully" }, Level.DEBUG) + val autoEscape = data["auto_escape"].asBooleanOrNull ?: false + val atSender = data["at_sender"].asBooleanOrNull ?: false + val autoReply = data["auto_reply"].asBooleanOrNull ?: true + val message = data["reply"] + if (message is JsonPrimitive) { + if (autoEscape) { + val msgList = mutableSetOf() + msgList.add(mapOf( + "type" to "text", + "data" to mapOf( + "text" to message.asString + ) + ).json) + quicklyReply( + record, + msgList.jsonArray, + msgHash, + atSender, + autoReply ) - ).json) + } else { + val messageArray = MessageHelper.decodeCQCode(message.asString) + quicklyReply( + record, + messageArray, + msgHash, + atSender, + autoReply + ) + } + } else if (message is JsonArray) { quicklyReply( record, - msgList.jsonArray, - msgHash, - atSender, - autoReply - ) - } else { - val messageArray = MessageHelper.decodeCQCode(message.asString) - quicklyReply( - record, - messageArray, + message, msgHash, atSender, autoReply ) } - } else if (message is JsonArray) { - quicklyReply( - record, - message, - msgHash, - atSender, - autoReply - ) } - } - if (MsgConstant.KCHATTYPEGROUP == record.chatType && data.containsKey("delete") && data["delete"].asBoolean) { - MsgSvc.recallMsg(msgHash) - } - if (MsgConstant.KCHATTYPEGROUP == record.chatType && data.containsKey("kick") && data["kick"].asBoolean) { - GroupSvc.kickMember(record.peerUin, false, record.senderUin) - } - if (MsgConstant.KCHATTYPEGROUP == record.chatType && data.containsKey("ban") && data["ban"].asBoolean) { - val banTime = data["ban_duration"].asIntOrNull ?: (30 * 60) - if (banTime <= 0) return - GroupSvc.banMember(record.peerUin, record.senderUin, banTime) + if (MsgConstant.KCHATTYPEGROUP == record.chatType && data.containsKey("delete") && data["delete"].asBoolean) { + MsgSvc.recallMsg(msgHash) + } + if (MsgConstant.KCHATTYPEGROUP == record.chatType && data.containsKey("kick") && data["kick"].asBoolean) { + GroupSvc.kickMember(record.peerUin, false, record.senderUin) + } + if (MsgConstant.KCHATTYPEGROUP == record.chatType && data.containsKey("ban") && data["ban"].asBoolean) { + val banTime = data["ban_duration"].asIntOrNull ?: (30 * 60) + if (banTime <= 0) return + GroupSvc.banMember(record.peerUin, record.senderUin, banTime) + } + } else if (data is JsonArray) { + data.forEach { + handleQuicklyActions(it.asJsonObject) + } } } catch (e: Throwable) { LogCenter.log("处理快速操作错误: $e", Level.WARN) } } + private suspend fun handleQuicklyActions(data: JsonObject) { + val action = data["action"].asString + val echo = data["echo"] ?: EmptyJsonString + + val params = data["params"].asJsonObjectOrNull ?: EmptyJsonObject + + val handler = ActionManager[action] + if (handler == null) { + LogCenter.log("HTTP快速操作:不支持的Action: $action", Level.WARN) + } else { + handler.handle(ActionSession(params, echo)) + } + } + private suspend fun quicklyReply( record: MsgRecord, message: JsonArray,