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 408e3f7..ae35d22 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 @@ -1,5 +1,7 @@ package com.tencent.qqnt.kernel.nativeinterface; +import org.jetbrains.annotations.NotNull; + import java.util.ArrayList; import java.util.HashMap; @@ -16,6 +18,16 @@ public interface IKernelMsgService { void addLocalRecordMsg(Contact contact, long msgId, MsgElement elem, HashMap hashMap, boolean z, IOperateCallback callback); + long getMsgUniqueId(long time); + + void addSendMsg(long msgId, Contact contact, ArrayList msgList, HashMap hashMap); + + void getMsgs(@NotNull Contact contact, long startMsgId, int cnt, boolean queryOrder, @NotNull IMsgOperateCallback iMsgOperateCallback); + + void getMsgsIncludeSelf(Contact contact, long startMsgId, int count, boolean queryOrder, IMsgOperateCallback iMsgOperateCallback); + + void translatePtt2Text(long j2, Contact contact, MsgElement msgElement, IOperateCallback iOperateCallback); + void getMultiMsg(Contact contact, long rootMsgId, long parentMsgId, IGetMultiMsgCallback cb); void clearMsgRecords(Contact contact, IClearMsgRecordsCallback cb); 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 a16a3dd..1762f7f 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,7 +33,7 @@ internal object ActionManager { // MSG ACTIONS SendMessage, DeleteMessage, GetMsg, GetForwardMsg, SendGroupForwardMsg, SendGroupMessage, SendPrivateMessage, - ClearMsgs, + ClearMsgs, GetHistoryMsg, GetGroupMsgHistory, // RESOURCE ACTION GetRecord, GetImage, UploadGroupFile, CreateGroupFileFolder, DeleteGroupFolder, diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupMsgHistory.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupMsgHistory.kt new file mode 100644 index 0000000..631fbb8 --- /dev/null +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetGroupMsgHistory.kt @@ -0,0 +1,14 @@ +package moe.fuqiuluo.shamrock.remote.action.handlers + +import moe.fuqiuluo.shamrock.remote.action.ActionSession +import moe.fuqiuluo.shamrock.remote.action.IActionHandler + +internal object GetGroupMsgHistory: IActionHandler() { + override suspend fun internalHandle(session: ActionSession): String { + val groupId = session.getString("group_id") + val cnt = session.getIntOrNull("count") ?: 20 + return GetHistoryMsg("group", groupId, cnt, session.echo) + } + + override fun path(): String = "get_group_msg_history" +} \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetHistoryMsg.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetHistoryMsg.kt new file mode 100644 index 0000000..b2e28ea --- /dev/null +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetHistoryMsg.kt @@ -0,0 +1,76 @@ +package moe.fuqiuluo.shamrock.remote.action.handlers + +import com.tencent.qqnt.kernel.nativeinterface.MsgConstant +import com.tencent.qqnt.kernel.nativeinterface.MsgRecord +import kotlinx.serialization.json.JsonElement +import moe.fuqiuluo.qqinterface.servlet.msg.convert.MessageConvert +import moe.fuqiuluo.shamrock.helper.MessageHelper +import moe.fuqiuluo.shamrock.remote.action.ActionSession +import moe.fuqiuluo.shamrock.remote.action.IActionHandler +import moe.fuqiuluo.shamrock.remote.service.data.MessageDetail +import moe.fuqiuluo.shamrock.remote.service.data.MessageSender +import moe.fuqiuluo.shamrock.tools.EmptyJsonString +import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher +import java.util.ArrayList +import kotlin.coroutines.resume +import kotlin.coroutines.suspendCoroutine + +internal object GetHistoryMsg: 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") + val cnt = session.getIntOrNull("count") ?: 20 + return invoke(msgType, peerId, cnt, session.echo) + } + + suspend operator fun invoke( + msgType: String, + peerId: String, + cnt: Int, + echo: JsonElement = EmptyJsonString + ): String { + val msgService = NTServiceFetcher.kernelService.wrapperSession.msgService + val chatType = MessageHelper.obtainMessageTypeByDetailType(msgType) + val contact = MessageHelper.generateContact(chatType, peerId) + val result = suspendCoroutine { + msgService.getMsgs(contact, 0L, cnt, true) { code, why, msgs -> + it.resume(GetMsgResult(code, why, msgs)) + } + } + if (result.code != 0) { + return logic(result.msg ?: "获取历史消息失败", echo = echo) + } + + val msgList = result.data!!.map { msg -> + val msgHash = MessageHelper.generateMsgIdHash(msg.chatType, msg.msgId) + MessageDetail( + time = msg.msgTime.toInt(), + msgType = MessageHelper.obtainDetailTypeByMsgType(msg.chatType), + msgId = msgHash, + realId = msg.msgSeq.toInt(), + sender = MessageSender( + msg.senderUin, msg.sendNickName, "unknown", 0, msg.senderUid + ), + message = MessageConvert.convertMessageRecordToMsgSegment(msg).map { + it.toJson() + }, + peerId = msg.peerUin, + groupId = if (msg.chatType == MsgConstant.KCHATTYPEGROUP) msg.peerUin else 0, + targetId = if (msg.chatType != MsgConstant.KCHATTYPEGROUP) msg.peerUin else 0 + ) + } + + return ok(data = msgList, echo = echo) + } + + override val requiredParams: Array + get() = arrayOf("message_type") + + override fun path(): String = "get_history_msg" + + data class GetMsgResult( + val code: Int, + val msg: String?, + val data: ArrayList? + ) +} \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetVersionInfo.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetVersionInfo.kt index a7386f4..8a7251a 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetVersionInfo.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetVersionInfo.kt @@ -20,7 +20,7 @@ internal object GetVersionInfo : IActionHandler() { appVersion = ShamrockVersion, impl = "shamrock", version = ShamrockVersion, - onebotVersion = "12", + onebotVersion = "11", ), echo = 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 7e2c984..6cf1451 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,19 @@ import moe.fuqiuluo.shamrock.tools.isJsonData import moe.fuqiuluo.shamrock.tools.isJsonString fun Routing.messageAction() { + getOrPost("/get_group_msg_history") { + val peerId = fetchOrThrow("group_id") + val cnt = fetchOrNull("count")?.toInt() ?: 20 + call.respondText(GetHistoryMsg("group", peerId, cnt)) + } + + getOrPost("/get_history_msg") { + val msgType = fetchOrThrow("message_type") + val peerId = fetchOrThrow(if (msgType == "group") "group_id" else "user_id") + val cnt = fetchOrNull("count")?.toInt() ?: 20 + call.respondText(GetHistoryMsg(msgType, peerId, cnt)) + } + getOrPost("/clear_msgs") { val msgType = fetchOrThrow("message_type") val peerId = fetchOrThrow(if (msgType == "group") "group_id" else "user_id") 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 index 08d8203..99d6044 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/TestAction.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/TestAction.kt @@ -1,19 +1,77 @@ package moe.fuqiuluo.shamrock.remote.api +import com.tencent.qqnt.kernel.nativeinterface.Contact +import com.tencent.qqnt.kernel.nativeinterface.IMsgOperateCallback +import com.tencent.qqnt.kernel.nativeinterface.MsgConstant +import com.tencent.qqnt.kernel.nativeinterface.MsgElement +import com.tencent.qqnt.kernel.nativeinterface.MsgRecord +import com.tencent.qqnt.kernel.nativeinterface.TextElement 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.qqinterface.servlet.TicketSvc +import moe.fuqiuluo.qqinterface.servlet.msg.convert.toCQCode +import moe.fuqiuluo.shamrock.helper.Level +import moe.fuqiuluo.shamrock.helper.LogCenter +import moe.fuqiuluo.shamrock.helper.MessageHelper +import moe.fuqiuluo.shamrock.tools.ShamrockVersion import moe.fuqiuluo.shamrock.tools.fetch import moe.fuqiuluo.shamrock.tools.fetchOrThrow import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher +import java.util.ArrayList +import kotlin.coroutines.resume +import kotlin.coroutines.suspendCoroutine fun Routing.testAction() { + if(ShamrockVersion.contains("dev")) { + LogCenter.log("testAction is enabled.", Level.WARN) + } else { + return + } + /* get("/test/createUidFromTinyId") { val selfId = fetchOrThrow("selfId").toLong() val peerId = fetchOrThrow("peerId").toLong() call.respondText(NTServiceFetcher.kernelService.wrapperSession.msgService.createUidFromTinyId(selfId, peerId)) } + get("/test/addSendMsg") { + val msgService = NTServiceFetcher.kernelService.wrapperSession.msgService + val msgId = msgService.getMsgUniqueId(System.currentTimeMillis()) + msgService.addSendMsg(msgId, MessageHelper.generateContact(MsgConstant.KCHATTYPEC2C, TicketSvc.getUin()), arrayListOf( + MsgElement().apply { + elementType = MsgConstant.KELEMTYPETEXT + textElement = TextElement().apply { + content = "测试消息" + } + } + ), hashMapOf()) + call.respondText("ok") + }*/ + + /* + get("/test/getMsgs") { + kotlin.runCatching { + val msgService = NTServiceFetcher.kernelService.wrapperSession.msgService + val msgs = suspendCoroutine { + msgService.getMsgs(Contact(MsgConstant.KCHATTYPEGROUP, "884587317", ""), 0L, 20, true, object: IMsgOperateCallback{ + override fun onResult(code: Int, why: String?, msgs: ArrayList?) { + it.resume(msgs) + } + }) + } + if (msgs == null) { + call.respondText("failed") + return@get + } + + call.respondText("msg -> " + msgs.map { it.toCQCode() }.joinToString("\n")) + }.onFailure { + call.respondText("failed: ${it.stackTraceToString()}") + return@get + } + + }*/ } \ No newline at end of file