Shamrock: 自発メッセージメッセージIDエラーの修正

Signed-off-by: WhiteChi <whitechi73@outlook.com>
This commit is contained in:
WhiteChi 2023-11-01 21:24:16 +08:00
parent e41b7515d3
commit 6f1ba71664
4 changed files with 63 additions and 7 deletions

View File

@ -50,6 +50,36 @@ internal object MsgSvc: BaseSvc() {
}
}
suspend fun getMsgByQMsgId(
chatType: Int,
peerId: String,
qqMsgId: Long
): Result<MsgRecord> {
val contact = MessageHelper.generateContact(chatType, peerId)
val msg = withTimeoutOrNull(5000) {
val service = QRoute.api(IMsgService::class.java)
suspendCancellableCoroutine { continuation ->
service.getMsgsByMsgId(contact, arrayListOf(qqMsgId)) { code, _, msgRecords ->
if (code == 0 && msgRecords.isNotEmpty()) {
continuation.resume(msgRecords.first())
} else {
continuation.resume(null)
}
}
continuation.invokeOnCancellation {
continuation.resume(null)
}
}
}
return if (msg != null) {
Result.success(msg)
} else {
Result.failure(Exception("获取消息失败"))
}
}
/**
* 什么鸟屎都获取不到
*/
@ -59,7 +89,7 @@ internal object MsgSvc: BaseSvc() {
seq: Long
): Result<MsgRecord> {
val contact = MessageHelper.generateContact(chatType, peerId)
val msg = withTimeoutOrNull(60 * 1000) {
val msg = withTimeoutOrNull(1000) {
val service = QRoute.api(IMsgService::class.java)
suspendCancellableCoroutine { continuation ->
service.getMsgsBySeqs(contact, arrayListOf(seq)) { code, _, msgRecords ->

View File

@ -2,6 +2,7 @@ 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
@ -252,7 +253,11 @@ internal sealed class MessageElemConverter: IMessageConvert {
} else {
MessageDB.getInstance().messageMappingDao()
.queryByMsgSeq(chatType, peerId, reply.replayMsgSeq?.toInt() ?: 0)?.msgHashId
?: MessageHelper.generateMsgIdHash(chatType, reply.sourceMsgIdInRecords)
?:
kotlin.run {
LogCenter.log("消息映射关系未找到: Message($reply)", Level.WARN)
MessageHelper.generateMsgIdHash(chatType, reply.sourceMsgIdInRecords)
}
}
return MessageSegment(

View File

@ -5,7 +5,9 @@ import moe.fuqiuluo.shamrock.helper.MessageHelper
import com.tencent.qqnt.kernel.nativeinterface.*
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import moe.fuqiuluo.qqinterface.servlet.MsgSvc
import moe.fuqiuluo.qqinterface.servlet.msg.convert.toCQCode
import moe.fuqiuluo.qqinterface.servlet.transfile.RichProtoSvc
import moe.fuqiuluo.shamrock.remote.service.config.ShamrockConfig
@ -16,6 +18,8 @@ import moe.fuqiuluo.shamrock.remote.service.data.push.MessageTempSource
import moe.fuqiuluo.shamrock.remote.service.data.push.PostType
import java.util.ArrayList
import java.util.HashMap
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
internal object AioListener: IKernelMsgListener {
override fun onRecvMsg(msgList: ArrayList<MsgRecord>) {
@ -97,10 +101,28 @@ internal object AioListener: IKernelMsgListener {
}
}
override fun onAddSendMsg(record: MsgRecord) {
override fun onAddSendMsg(tmpRecord: MsgRecord) {
GlobalScope.launch {
try {
val msgHash = MessageHelper.generateMsgIdHash(record.chatType, record.msgId)
val msgHash = MessageHelper.generateMsgIdHash(tmpRecord.chatType, tmpRecord.msgId)
val record = suspendCoroutine<MsgRecord?> {
GlobalScope.launch {
while (true) {
MsgSvc.getMsgByQMsgId(tmpRecord.chatType, tmpRecord.peerUin.toString(), tmpRecord.msgId).onSuccess { record ->
if (record.sendStatus == MsgConstant.KSENDSTATUSSUCCESS ||
record.sendStatus == MsgConstant.KSENDSTATUSSUCCESSNOSEQ
) {
it.resume(record)
} else if (record.sendStatus == MsgConstant.KSENDSTATUSFAILED) {
it.resume(null)
}
}
delay(50)
}
}
} ?: return@launch
MessageHelper.saveMsgMapping(
hash = msgHash,
qqMsgId = record.msgId,
@ -114,7 +136,7 @@ internal object AioListener: IKernelMsgListener {
val rawMsg = record.elements.toCQCode(record.chatType, record.peerUin.toString())
if (rawMsg.isEmpty()) return@launch
LogCenter.log("发送消息($msgHash|${record.msgSeq}): $rawMsg")
LogCenter.log("发送消息($msgHash | ${record.msgSeq} | ${record.msgId}): $rawMsg")
if (!ShamrockConfig.enableSelfMsg())
return@launch

View File

@ -247,13 +247,12 @@ internal object PrimitiveListener {
val tipText = if (detail.has(11, 9)) detail[11, 9, 2].asUtf8String else ""
val mapping = MessageHelper.getMsgMappingBySeq(MsgConstant.KCHATTYPEGROUP, msgSeq.toInt())
if (mapping == null) {
LogCenter.log("由于缺失消息映射关系,消息撤回事件无法推送!", Level.WARN)
LogCenter.log("由于缺失消息映射关系(seq = $msgSeq),消息撤回事件无法推送!", Level.WARN)
return
}
val msgHash = mapping.msgHashId
val operator = ContactHelper.getUinByUidAsync(operatorUid).toLong()
val target = ContactHelper.getUinByUidAsync(targetUid).toLong()
LogCenter.log("群消息撤回($groupCode): $operator -> $target, seq = $msgSeq, hash = $msgHash, tip = $tipText")
if(!GlobalEventTransmitter.GroupNoticeTransmitter