diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/MsgSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/MsgSvc.kt index 072b8a4..397cef0 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/MsgSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/MsgSvc.kt @@ -11,6 +11,7 @@ import moe.fuqiuluo.shamrock.helper.MessageHelper import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher import kotlin.coroutines.resume +import kotlin.coroutines.suspendCoroutine internal object MsgSvc: BaseSvc() { fun uploadForwardMsg(): Result { @@ -60,7 +61,7 @@ internal object MsgSvc: BaseSvc() { return Result.failure(Exception("获取消息服务")) val msg = withTimeoutOrNull(5000) { - suspendCancellableCoroutine { continuation -> + suspendCoroutine { continuation -> service.getMsgsByMsgId(contact, arrayListOf(qqMsgId)) { code, _, msgRecords -> if (code == 0 && msgRecords.isNotEmpty()) { continuation.resume(msgRecords.first()) @@ -68,9 +69,6 @@ internal object MsgSvc: BaseSvc() { continuation.resume(null) } } - continuation.invokeOnCancellation { - continuation.resume(null) - } } } diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/db/MessageDB.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/db/MessageDB.kt index 14d2ed5..6f832a0 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/db/MessageDB.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/db/MessageDB.kt @@ -29,6 +29,9 @@ interface MessageMappingDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(mapping: MessageMapping) + @Query("UPDATE message_mapping SET msgSeq = :msgSeq WHERE msgHashId = :hash") + fun updateMsgSeqByMsgHash(hash: Int, msgSeq: Int) + @Query("DELETE FROM message_mapping WHERE msgHashId = :hash") fun deleteByMsgHash(hash: Int) diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/AioListener.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/AioListener.kt index 86094f5..618928d 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/AioListener.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/service/listener/AioListener.kt @@ -5,21 +5,18 @@ 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 import moe.fuqiuluo.shamrock.helper.Level import moe.fuqiuluo.shamrock.helper.LogCenter +import moe.fuqiuluo.shamrock.helper.db.MessageDB import moe.fuqiuluo.shamrock.remote.service.api.GlobalEventTransmitter 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) { @@ -101,29 +98,10 @@ internal object AioListener: IKernelMsgListener { } } - override fun onAddSendMsg(tmpRecord: MsgRecord) { + override fun onAddSendMsg(record: MsgRecord) { GlobalScope.launch { try { - val msgHash = MessageHelper.generateMsgIdHash(tmpRecord.chatType, tmpRecord.msgId) - - val record = suspendCoroutine { - 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) - } - }.onFailure { _ -> - it.resume(null) - } - delay(50) - } - } - } ?: return@launch + val msgHash = MessageHelper.generateMsgIdHash(record.chatType, record.msgId) MessageHelper.saveMsgMapping( hash = msgHash, @@ -139,10 +117,25 @@ internal object AioListener: IKernelMsgListener { if (rawMsg.isEmpty()) return@launch LogCenter.log("发送消息($msgHash | ${record.msgSeq} | ${record.msgId}): $rawMsg") + } catch (e: Throwable) { + LogCenter.log(e.stackTraceToString(), Level.WARN) + } + } + } + override fun onMsgInfoListUpdate(msgList: ArrayList?) { + msgList?.forEach { record -> + GlobalScope.launch { if (!ShamrockConfig.enableSelfMsg()) return@launch + val msgHash = MessageHelper.generateMsgIdHash(record.chatType, record.msgId) + + MessageDB.getInstance().messageMappingDao().updateMsgSeqByMsgHash(msgHash, record.msgSeq.toInt()) + + val rawMsg = record.elements.toCQCode(record.chatType, record.peerUin.toString()) + if (rawMsg.isEmpty()) return@launch + when (record.chatType) { MsgConstant.KCHATTYPEGROUP -> { GlobalEventTransmitter.MessageTransmitter @@ -159,12 +152,16 @@ internal object AioListener: IKernelMsgListener { } else -> LogCenter.log("不支持SELF PUSH事件: ${record.chatType}") } - } catch (e: Throwable) { - LogCenter.log(e.stackTraceToString(), Level.WARN) } } } + override fun onMsgAbstractUpdate(arrayList: ArrayList?) { + //arrayList?.forEach { + // LogCenter.log("onMsgAbstractUpdate($it)", Level.WARN) + //} + } + override fun onRecvMsgSvrRspTransInfo( j2: Long, contact: Contact?, @@ -363,11 +360,7 @@ internal object AioListener: IKernelMsgListener { //LogCenter.log("onLineDev($arrayList)") } - override fun onLogLevelChanged(j2: Long) { - - } - - override fun onMsgAbstractUpdate(arrayList: ArrayList?) { + override fun onLogLevelChanged(newLevel: Long) { } @@ -387,16 +380,12 @@ internal object AioListener: IKernelMsgListener { } - override fun onMsgInfoListUpdate(arrayList: ArrayList?) { - - } - override fun onMsgQRCodeStatusChanged(i2: Int) { } - override fun onMsgRecall(i2: Int, str: String?, j2: Long) { - LogCenter.log("onMsgRecall($i2, $str, $j2)") + override fun onMsgRecall(chatType: Int, peerId: String?, msgId: Long) { + LogCenter.log("onMsgRecall($chatType, $peerId, $msgId)") } override fun onMsgSecurityNotify(msgRecord: MsgRecord?) {