From 3988ad3811f304419306eef73782c45e7637c697 Mon Sep 17 00:00:00 2001 From: WhiteChi Date: Mon, 6 Nov 2023 00:18:24 +0800 Subject: [PATCH] =?UTF-8?q?`Shamrock`:=20=E3=83=AD=E3=83=BC=E3=82=AB?= =?UTF-8?q?=E3=83=AB=E3=82=AD=E3=83=A3=E3=83=83=E3=82=B7=E3=83=A5=E3=83=A1?= =?UTF-8?q?=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E3=81=AE=E5=89=8A=E9=99=A4?= =?UTF-8?q?=E3=82=92=E3=82=B5=E3=83=9D=E3=83=BC=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IClearMsgRecordsCallback.java | 5 ++ .../nativeinterface/IKernelMsgService.java | 6 ++- .../servlet/msg/convert/MessageConvert.kt | 4 +- .../msg/convert/MessageElemConverter.kt | 47 ++++++++++++++++++- .../fuqiuluo/shamrock/remote/HTTPServer.kt | 1 + .../shamrock/remote/action/ActionManager.kt | 1 + .../remote/action/handlers/ClearMsgs.kt | 32 +++++++++++++ .../remote/action/handlers/GetForwardMsg.kt | 2 + .../shamrock/remote/api/MessageAction.kt | 6 +++ .../shamrock/remote/api/TestAction.kt | 19 ++++++++ 10 files changed, 119 insertions(+), 4 deletions(-) create mode 100644 qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IClearMsgRecordsCallback.java create mode 100644 xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ClearMsgs.kt create mode 100644 xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/TestAction.kt diff --git a/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IClearMsgRecordsCallback.java b/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IClearMsgRecordsCallback.java new file mode 100644 index 0000000..cdae70d --- /dev/null +++ b/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IClearMsgRecordsCallback.java @@ -0,0 +1,5 @@ +package com.tencent.qqnt.kernel.nativeinterface; + +public interface IClearMsgRecordsCallback { + void onResult(int code, String reason, long lastMsgId); +} diff --git a/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IKernelMsgService.java b/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IKernelMsgService.java index d42865e..408e3f7 100644 --- a/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IKernelMsgService.java +++ b/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IKernelMsgService.java @@ -16,7 +16,11 @@ public interface IKernelMsgService { void addLocalRecordMsg(Contact contact, long msgId, MsgElement elem, HashMap hashMap, boolean z, IOperateCallback callback); - void getMultiMsg(Contact contact, long msgId, long uniseq, IGetMultiMsgCallback cb); + void getMultiMsg(Contact contact, long rootMsgId, long parentMsgId, IGetMultiMsgCallback cb); + + void clearMsgRecords(Contact contact, IClearMsgRecordsCallback cb); + + String createUidFromTinyId(long j2, long j3); void switchBackGround(BackGroundInfo backGroundInfo, IOperateCallback cb); diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/convert/MessageConvert.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/convert/MessageConvert.kt index d9e1cc7..7234f73 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/convert/MessageConvert.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/convert/MessageConvert.kt @@ -52,7 +52,9 @@ internal object MessageConvert { MsgConstant.KELEMTYPEARKSTRUCT to MessageElemConverter.StructJsonConverter, MsgConstant.KELEMTYPEREPLY to MessageElemConverter.ReplyConverter, MsgConstant.KELEMTYPEGRAYTIP to MessageElemConverter.GrayTipsConverter, - MsgConstant.KELEMTYPEFILE to MessageElemConverter.FileConverter + MsgConstant.KELEMTYPEFILE to MessageElemConverter.FileConverter, + MsgConstant.KELEMTYPEMULTIFORWARD to MessageElemConverter.XmlMultiMsgConverter, + MsgConstant.KELEMTYPESTRUCTLONGMSG to MessageElemConverter.XmlLongMsgConverter, ) } diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/convert/MessageElemConverter.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/convert/MessageElemConverter.kt index ed3922f..b1fbc7e 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/convert/MessageElemConverter.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/msg/convert/MessageElemConverter.kt @@ -2,7 +2,6 @@ package moe.fuqiuluo.qqinterface.servlet.msg.convert import com.tencent.qqnt.kernel.nativeinterface.MsgConstant import com.tencent.qqnt.kernel.nativeinterface.MsgElement -import moe.fuqiuluo.qqinterface.servlet.MsgSvc import moe.fuqiuluo.qqinterface.servlet.transfile.RichProtoSvc import moe.fuqiuluo.shamrock.helper.ContactHelper import moe.fuqiuluo.shamrock.helper.Level @@ -195,6 +194,15 @@ internal sealed class MessageElemConverter: IMessageConvert { ): MessageSegment { val data = element.arkElement.bytesData.asJsonObject return when (data["app"].asString) { + "com.tencent.multimsg" -> { + val info = data["meta"].asJsonObject["detail"].asJsonObject + MessageSegment( + type = "forward", + data = mapOf( + "id" to info["resid"].asString + ) + ) + } "com.tencent.troopsharecard" -> { val info = data["meta"].asJsonObject["contact"].asJsonObject MessageSegment( @@ -230,7 +238,7 @@ internal sealed class MessageElemConverter: IMessageConvert { else -> MessageSegment( type = "json", data = mapOf( - "data" to element.arkElement.bytesData.asJsonObject + "data" to element.arkElement.bytesData.asJsonObject.toString() ) ) } @@ -317,6 +325,41 @@ internal sealed class MessageElemConverter: IMessageConvert { } } + /** + * 老板QQ的合并转发信息 + */ + object XmlMultiMsgConverter: MessageElemConverter() { + override suspend fun convert( + chatType: Int, + peerId: String, + element: MsgElement + ): MessageSegment { + val multiMsg = element.multiForwardMsgElement + return MessageSegment( + type = "forward", + data = mapOf( + "id" to multiMsg.resId + ) + ) + } + } + + object XmlLongMsgConverter: MessageElemConverter() { + override suspend fun convert( + chatType: Int, + peerId: String, + element: MsgElement + ): MessageSegment { + val longMsg = element.structLongMsgElement + return MessageSegment( + type = "forward", + data = mapOf( + "id" to longMsg.resId + ) + ) + } + } + protected fun unknownChatType(chatType: Int) { throw UnsupportedOperationException("Not supported chat type: $chatType") } diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/HTTPServer.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/HTTPServer.kt index 7ef6509..1f7cb87 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/HTTPServer.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/HTTPServer.kt @@ -62,6 +62,7 @@ internal object HTTPServer { weatherAction() otherAction() guildAction() + testAction() if (ShamrockConfig.isDev()) { qsign() obtainProtocolData() 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 55267e4..a16a3dd 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 @@ -33,6 +33,7 @@ internal object ActionManager { // MSG ACTIONS SendMessage, DeleteMessage, GetMsg, GetForwardMsg, SendGroupForwardMsg, SendGroupMessage, SendPrivateMessage, + ClearMsgs, // RESOURCE ACTION GetRecord, GetImage, UploadGroupFile, CreateGroupFileFolder, DeleteGroupFolder, diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ClearMsgs.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ClearMsgs.kt new file mode 100644 index 0000000..d3e7216 --- /dev/null +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/ClearMsgs.kt @@ -0,0 +1,32 @@ +package moe.fuqiuluo.shamrock.remote.action.handlers + +import kotlinx.serialization.json.JsonElement +import moe.fuqiuluo.shamrock.helper.MessageHelper +import moe.fuqiuluo.shamrock.remote.action.ActionSession +import moe.fuqiuluo.shamrock.remote.action.IActionHandler +import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher + +internal object ClearMsgs: IActionHandler() { + override suspend fun internalHandle(session: ActionSession): String { + val msgType = session.getString("message_type") + val peerId = session.getString(if (msgType == "group") "group_id" else "user_id") + return invoke(msgType, peerId, session.echo) + } + + suspend operator fun invoke( + msgType: String, + peerId: String, + echo: JsonElement = EmptyJsonString + ): String { + val chatType = MessageHelper.obtainMessageTypeByDetailType(msgType) + val contact = MessageHelper.generateContact(chatType, peerId, "") + NTServiceFetcher.kernelService.wrapperSession.msgService.clearMsgRecords(contact, null) + return ok(echo = echo) + } + + override val requiredParams: Array + get() = arrayOf("message_type") + + override fun path(): String = "clear_msgs" +} \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetForwardMsg.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetForwardMsg.kt index 93e53be..d946426 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetForwardMsg.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetForwardMsg.kt @@ -12,6 +12,8 @@ internal object GetForwardMsg: IActionHandler() { val sessionService = kernelService.wrapperSession val msgService = sessionService.msgService + //msgService.getMultiMsg() + return error("不支持实现,请提交ISSUE!", 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 93a1e83..7e2c984 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 @@ -22,6 +22,12 @@ import moe.fuqiuluo.shamrock.tools.isJsonData import moe.fuqiuluo.shamrock.tools.isJsonString fun Routing.messageAction() { + getOrPost("/clear_msgs") { + val msgType = fetchOrThrow("message_type") + val peerId = fetchOrThrow(if (msgType == "group") "group_id" else "user_id") + call.respondText(ClearMsgs(msgType, peerId)) + } + getOrPost("/delete_msg") { val msgHash = fetchOrThrow("message_id").toInt() call.respondText(DeleteMessage(msgHash)) diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/TestAction.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/TestAction.kt new file mode 100644 index 0000000..08d8203 --- /dev/null +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/TestAction.kt @@ -0,0 +1,19 @@ +package moe.fuqiuluo.shamrock.remote.api + +import io.ktor.server.application.call +import io.ktor.server.response.respondText +import io.ktor.server.routing.Routing +import io.ktor.server.routing.get +import moe.fuqiuluo.shamrock.tools.fetch +import moe.fuqiuluo.shamrock.tools.fetchOrThrow +import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher + +fun Routing.testAction() { + + get("/test/createUidFromTinyId") { + val selfId = fetchOrThrow("selfId").toLong() + val peerId = fetchOrThrow("peerId").toLong() + call.respondText(NTServiceFetcher.kernelService.wrapperSession.msgService.createUidFromTinyId(selfId, peerId)) + } + +} \ No newline at end of file