fix get_group_msg_history

This commit is contained in:
Simplxs 2024-02-24 18:58:09 +08:00
parent 0bca46bba3
commit 5584a41af0
No known key found for this signature in database
GPG Key ID: E23537FF14DD6507
6 changed files with 39 additions and 16 deletions

View File

@ -297,7 +297,7 @@ internal object MsgSvc : BaseSvc() {
time = msg.contentHead?.msgTime?.toInt() ?: 0, time = msg.contentHead?.msgTime?.toInt() ?: 0,
msgType = MessageHelper.obtainDetailTypeByMsgType(chatType), msgType = MessageHelper.obtainDetailTypeByMsgType(chatType),
msgId = 0, // MessageHelper.generateMsgIdHash(chatType, msg.content!!.msgViaRandom), msgViaRandom 为空 msgId = 0, // MessageHelper.generateMsgIdHash(chatType, msg.content!!.msgViaRandom), msgViaRandom 为空
realId = msg.contentHead!!.msgSeq?.toInt() ?: 0, msgSeq = msg.contentHead!!.msgSeq ?: 0,
sender = MessageSender( sender = MessageSender(
msg.msgHead?.peer ?: 0, msg.msgHead?.peer ?: 0,
msg.msgHead?.responseGrp?.memberCard?.ifEmpty { msg.msgHead?.forward?.friendName } msg.msgHead?.responseGrp?.memberCard?.ifEmpty { msg.msgHead?.forward?.friendName }

View File

@ -1,5 +1,6 @@
package moe.fuqiuluo.shamrock.remote.action.handlers package moe.fuqiuluo.shamrock.remote.action.handlers
import com.tencent.qqnt.kernel.nativeinterface.MsgConstant
import moe.fuqiuluo.shamrock.helper.db.MessageDB import moe.fuqiuluo.shamrock.helper.db.MessageDB
import moe.fuqiuluo.shamrock.remote.action.ActionSession import moe.fuqiuluo.shamrock.remote.action.ActionSession
import moe.fuqiuluo.shamrock.remote.action.IActionHandler import moe.fuqiuluo.shamrock.remote.action.IActionHandler
@ -10,11 +11,16 @@ internal object GetGroupMsgHistory: IActionHandler() {
override suspend fun internalHandle(session: ActionSession): String { override suspend fun internalHandle(session: ActionSession): String {
val groupId = session.getLong("group_id") val groupId = session.getLong("group_id")
val cnt = session.getIntOrNull("count") ?: 20 val cnt = session.getIntOrNull("count") ?: 20
val startId = session.getIntOrNull("message_seq")?.let { val startId = session.getIntOrNull("message_id")?.let {
if (it == 0) return@let 0L if (it == 0) return@let 0L
MessageDB.getInstance() MessageDB.getInstance()
.messageMappingDao() .messageMappingDao()
.queryByMsgHashId(it)?.qqMsgId .queryByMsgHashId(it)?.qqMsgId
} ?: session.getIntOrNull("message_seq")?.let {
if (it == 0) return@let 0L
MessageDB.getInstance()
.messageMappingDao()
.queryByMsgSeq(MsgConstant.KCHATTYPEGROUP, groupId.toString(), it)?.qqMsgId
} ?: 0L } ?: 0L
return GetHistoryMsg("group", groupId.toString(), cnt, startId, session.echo) return GetHistoryMsg("group", groupId.toString(), cnt, startId, session.echo)
} }

View File

@ -28,11 +28,16 @@ internal object GetHistoryMsg : IActionHandler() {
val peerId = session.getLong(if (msgType == "group") "group_id" else "user_id").toString() val peerId = session.getLong(if (msgType == "group") "group_id" else "user_id").toString()
val cnt = session.getIntOrNull("count") ?: 20 val cnt = session.getIntOrNull("count") ?: 20
val startId = session.getIntOrNull("message_seq")?.let { val startId = session.getIntOrNull("message_id")?.let {
if (it == 0) return@let 0L if (it == 0) return@let 0L
MessageDB.getInstance() MessageDB.getInstance()
.messageMappingDao() .messageMappingDao()
.queryByMsgHashId(it)?.qqMsgId .queryByMsgHashId(it)?.qqMsgId
} ?: session.getIntOrNull("message_seq")?.let {
if (it == 0) return@let 0L
MessageDB.getInstance()
.messageMappingDao()
.queryByMsgSeq(MessageHelper.obtainMessageTypeByDetailType(msgType), peerId, it)?.qqMsgId
} ?: 0L } ?: 0L
return invoke(msgType, peerId, cnt, startId, echo = session.echo) return invoke(msgType, peerId, cnt, startId, echo = session.echo)
@ -74,7 +79,7 @@ internal object GetHistoryMsg : IActionHandler() {
time = msg.msgTime.toInt(), time = msg.msgTime.toInt(),
msgType = MessageHelper.obtainDetailTypeByMsgType(msg.chatType), msgType = MessageHelper.obtainDetailTypeByMsgType(msg.chatType),
msgId = msgHash, msgId = msgHash,
realId = msg.msgSeq.toInt(), msgSeq = msg.msgSeq,
sender = MessageSender( sender = MessageSender(
msg.senderUin, msg.sendNickName, "unknown", 0, msg.senderUid, msg.senderUid msg.senderUin, msg.sendNickName, "unknown", 0, msg.senderUid, msg.senderUid
), ),
@ -92,12 +97,11 @@ internal object GetHistoryMsg : IActionHandler() {
val msg = MsgSvc.getMsgByQMsgId(chatType, peerId, startMsgId).onFailure { val msg = MsgSvc.getMsgByQMsgId(chatType, peerId, startMsgId).onFailure {
return logic("Obtain msg failed, please check your msg_id.", echo) return logic("Obtain msg failed, please check your msg_id.", echo)
}.getOrThrow() }.getOrThrow()
val seq = msg.clientSeq.toInt()
add(MessageDetail( add(MessageDetail(
time = msg.msgTime.toInt(), time = msg.msgTime.toInt(),
msgType = MessageHelper.obtainDetailTypeByMsgType(msg.chatType), msgType = MessageHelper.obtainDetailTypeByMsgType(msg.chatType),
msgId = MessageHelper.generateMsgIdHash(msg.chatType, msg.msgId), msgId = MessageHelper.generateMsgIdHash(msg.chatType, msg.msgId),
realId = seq, msgSeq = msg.msgSeq,
sender = MessageSender( sender = MessageSender(
msg.senderUin, msg.sendNickName msg.senderUin, msg.sendNickName
.ifEmpty { msg.sendMemberName } .ifEmpty { msg.sendMemberName }
@ -107,7 +111,8 @@ internal object GetHistoryMsg : IActionHandler() {
message = msg.elements.toSegments( message = msg.elements.toSegments(
chatType, chatType,
if (chatType == MsgConstant.KCHATTYPEGUILD) msg.guildId else msg.peerUin.toString(), if (chatType == MsgConstant.KCHATTYPEGUILD) msg.guildId else msg.peerUin.toString(),
msg.channelId ?: peerId).toListMap(), msg.channelId ?: peerId
).toListMap(),
peerId = msg.peerUin, peerId = msg.peerUin,
groupId = if (msg.chatType == MsgConstant.KCHATTYPEGROUP) msg.peerUin else 0, groupId = if (msg.chatType == MsgConstant.KCHATTYPEGROUP) msg.peerUin else 0,
targetId = if (msg.chatType != MsgConstant.KCHATTYPEGROUP) msg.peerUin else 0 targetId = if (msg.chatType != MsgConstant.KCHATTYPEGROUP) msg.peerUin else 0

View File

@ -25,12 +25,11 @@ internal object GetMsg: IActionHandler() {
val msg = MsgSvc.getMsg(msgHash).onFailure { val msg = MsgSvc.getMsg(msgHash).onFailure {
return logic("Obtain msg failed, please check your msg_id.", echo) return logic("Obtain msg failed, please check your msg_id.", echo)
}.getOrThrow() }.getOrThrow()
val seq = msg.msgSeq.toInt()
return ok(MessageDetail( return ok(MessageDetail(
time = msg.msgTime.toInt(), time = msg.msgTime.toInt(),
msgType = MessageHelper.obtainDetailTypeByMsgType(msg.chatType), msgType = MessageHelper.obtainDetailTypeByMsgType(msg.chatType),
msgId = msgHash, msgId = msgHash,
realId = seq, msgSeq = msg.msgSeq,
sender = MessageSender( sender = MessageSender(
msg.senderUin, msg.sendNickName msg.senderUin, msg.sendNickName
.ifEmpty { msg.sendMemberName } .ifEmpty { msg.sendMemberName }

View File

@ -95,11 +95,18 @@ fun Routing.messageAction() {
getOrPost("/get_group_msg_history") { getOrPost("/get_group_msg_history") {
val peerId = fetchOrThrow("group_id") val peerId = fetchOrThrow("group_id")
val cnt = fetchOrNull("count")?.toInt() ?: 20 val cnt = fetchOrNull("count")?.toInt() ?: 20
val startId = fetchOrNull("message_seq")?.toInt()?.let { val startId = fetchOrNull("message_id")?.let {
if (it == 0) return@let 0L val messageId = it.toInt()
if (messageId == 0) return@let 0L
MessageDB.getInstance() MessageDB.getInstance()
.messageMappingDao() .messageMappingDao()
.queryByMsgHashId(it)?.qqMsgId .queryByMsgHashId(messageId)?.qqMsgId
} ?: fetchOrNull("message_seq")?.let {
val messageSeq = it.toInt()
if (messageSeq == 0) return@let 0L
MessageDB.getInstance()
.messageMappingDao()
.queryByMsgSeq(MsgConstant.KCHATTYPEGROUP, peerId, messageSeq)?.qqMsgId
} ?: 0L } ?: 0L
call.respondText(GetHistoryMsg("group", peerId, cnt, startId), ContentType.Application.Json) call.respondText(GetHistoryMsg("group", peerId, cnt, startId), ContentType.Application.Json)
} }
@ -173,7 +180,9 @@ fun Routing.messageAction() {
SendMessage( SendMessage(
chatType = chatType, chatType = chatType,
peerId = peerId, peerId = peerId,
message = if (isJsonObject("message")) listOf(fetchPostJsonObject("message")).jsonArray else fetchPostJsonArray("message"), message = if (isJsonObject("message")) listOf(fetchPostJsonObject("message")).jsonArray else fetchPostJsonArray(
"message"
),
fromId = groupId ?: userId ?: "", fromId = groupId ?: userId ?: "",
retryCnt = retryCnt, retryCnt = retryCnt,
recallDuration = recallDuration recallDuration = recallDuration
@ -235,7 +244,9 @@ fun Routing.messageAction() {
SendMessage( SendMessage(
chatType = MsgConstant.KCHATTYPEGROUP, chatType = MsgConstant.KCHATTYPEGROUP,
peerId = groupId, peerId = groupId,
message = if (isJsonObject("message")) listOf(fetchPostJsonObject("message")).jsonArray else fetchPostJsonArray("message"), message = if (isJsonObject("message")) listOf(fetchPostJsonObject("message")).jsonArray else fetchPostJsonArray(
"message"
),
retryCnt = retryCnt, retryCnt = retryCnt,
recallDuration = recallDuration recallDuration = recallDuration
) )
@ -298,7 +309,9 @@ fun Routing.messageAction() {
SendMessage( SendMessage(
chatType = chatType, chatType = chatType,
peerId = userId, peerId = userId,
message = if (isJsonObject("message")) listOf(fetchPostJsonObject("message")).jsonArray else fetchPostJsonArray("message"), message = if (isJsonObject("message")) listOf(fetchPostJsonObject("message")).jsonArray else fetchPostJsonArray(
"message"
),
fromId = groupId ?: userId ?: "", fromId = groupId ?: userId ?: "",
retryCnt = retryCnt, retryCnt = retryCnt,
recallDuration = recallDuration recallDuration = recallDuration

View File

@ -20,7 +20,7 @@ internal data class MessageDetail(
@SerialName("time") val time: Int, @SerialName("time") val time: Int,
@SerialName("message_type") val msgType: String, @SerialName("message_type") val msgType: String,
@SerialName("message_id") val msgId: Int, @SerialName("message_id") val msgId: Int,
@SerialName("real_id") val realId: Int, @SerialName("message_seq") val msgSeq: Long,
@SerialName("sender") val sender: MessageSender, @SerialName("sender") val sender: MessageSender,
@SerialName("message") val message: List<Map<String, JsonElement>>, @SerialName("message") val message: List<Map<String, JsonElement>>,
@SerialName("group_id") val groupId: Long = 0, @SerialName("group_id") val groupId: Long = 0,