Shamrock: 履歴メッセージの取得をサポート

This commit is contained in:
WhiteChi 2023-11-07 09:09:29 +08:00
parent 3988ad3811
commit 7584390408
7 changed files with 175 additions and 2 deletions

View File

@ -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<Integer, MsgAttributeInfo> hashMap, boolean z, IOperateCallback callback);
long getMsgUniqueId(long time);
void addSendMsg(long msgId, Contact contact, ArrayList<MsgElement> msgList, HashMap<Integer, MsgAttributeInfo> 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);

View File

@ -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,

View File

@ -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"
}

View File

@ -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<String>
get() = arrayOf("message_type")
override fun path(): String = "get_history_msg"
data class GetMsgResult(
val code: Int,
val msg: String?,
val data: ArrayList<MsgRecord>?
)
}

View File

@ -20,7 +20,7 @@ internal object GetVersionInfo : IActionHandler() {
appVersion = ShamrockVersion,
impl = "shamrock",
version = ShamrockVersion,
onebotVersion = "12",
onebotVersion = "11",
),
echo = echo
)

View File

@ -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")

View File

@ -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<MsgRecord>?) {
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
}
}*/
}