diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MessageHelper.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MessageHelper.kt index 9d86dcf..30300b9 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MessageHelper.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/helper/MessageHelper.kt @@ -353,6 +353,21 @@ internal object MessageHelper { database.messageMappingDao().insert(mapping) } + fun saveMsgMappingNotExist( + hash: Int, + qqMsgId: Long, + time: Long, + chatType: Int, + peerId: String, + subPeerId: String, + msgSeq: Int, + subChatType: Int = chatType + ) { + val database = MessageDB.getInstance() + val mapping = MessageMapping(hash, qqMsgId, chatType, subChatType, peerId, time, msgSeq, subPeerId) + database.messageMappingDao().insertNotExist(mapping) + } + external fun createMessageUniseq(chatType: Int, time: Long): Long fun decodeCQCode(code: String): JsonArray { 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 9c6ca12..9fce033 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 @@ -30,6 +30,9 @@ interface MessageMappingDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(mapping: MessageMapping) + @Insert(onConflict = OnConflictStrategy.ABORT) + fun insertNotExist(mapping: MessageMapping) + @Query("UPDATE message_mapping_v2 SET msgSeq = :msgSeq WHERE msgHashId = :hash") fun updateMsgSeqByMsgHash(hash: Int, msgSeq: Int) 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 index ab00a78..1e051c1 100644 --- 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 @@ -59,6 +59,16 @@ internal object GetHistoryMsg: IActionHandler() { val msgList = ArrayList().apply { addAll(result.data!!.map { msg -> val msgHash = MessageHelper.generateMsgIdHash(msg.chatType, msg.msgId) + MessageHelper.saveMsgMappingNotExist( + hash = msgHash, + qqMsgId = msg.msgId, + chatType = msg.chatType, + subChatType = msg.chatType, + peerId = peerId, + msgSeq = msg.msgSeq.toInt(), + time = msg.msgTime, + subPeerId = msg.channelId ?: peerId + ) MessageDetail( time = msg.msgTime.toInt(), msgType = MessageHelper.obtainDetailTypeByMsgType(msg.chatType), 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 7200cec..8bad159 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 @@ -44,11 +44,11 @@ internal object AioListener : IKernelMsgListener { it.value(record) messageLessListenerMap.remove(it.key) } - if (record.msgSeq < 0) return + if (record.msgSeq < 0) return val msgHash = MessageHelper.generateMsgIdHash(record.chatType, record.msgId) - val peerId = when(record.chatType) { + val peerId = when (record.chatType) { MsgConstant.KCHATTYPEGUILD -> record.guildId else -> record.peerUin.toString() } @@ -87,12 +87,14 @@ internal object AioListener : IKernelMsgListener { if (!rule.white.isNullOrEmpty() && !rule.white.contains(record.senderUin)) return } - if(!GlobalEventTransmitter.MessageTransmitter.transGroupMessage( + if (!GlobalEventTransmitter.MessageTransmitter.transGroupMessage( record, record.elements, rawMsg, msgHash, postType - )) { + ) + ) { LogCenter.log("群消息推送失败 -> 推送目标可能不存在", Level.WARN) } } + MsgConstant.KCHATTYPEC2C -> { LogCenter.log("私聊消息(private = ${record.senderUin}, id = [$msgHash | ${record.msgId} | ${record.msgSeq}], msg = $rawMsg)") ShamrockConfig.getPrivateRule()?.let { rule -> @@ -100,9 +102,10 @@ internal object AioListener : IKernelMsgListener { if (!rule.white.isNullOrEmpty() && !rule.white.contains(record.senderUin)) return } - if(!GlobalEventTransmitter.MessageTransmitter.transPrivateMessage( + if (!GlobalEventTransmitter.MessageTransmitter.transPrivateMessage( record, record.elements, rawMsg, msgHash, postType - )) { + ) + ) { LogCenter.log("私聊消息推送失败 -> MessageTransmitter", Level.WARN) } } @@ -116,18 +119,24 @@ internal object AioListener : IKernelMsgListener { if (!rule.white.isNullOrEmpty() && !rule.white.contains(record.senderUin)) return } - if(!GlobalEventTransmitter.MessageTransmitter.transPrivateMessage( - record, record.elements, rawMsg, msgHash, tempSource = MessageTempSource.Group, postType = postType - )) { + if (!GlobalEventTransmitter.MessageTransmitter.transPrivateMessage( + record, + record.elements, + rawMsg, + msgHash, + tempSource = MessageTempSource.Group, + postType = postType + ) + ) { LogCenter.log("私聊临时消息推送失败 -> MessageTransmitter", Level.WARN) } } MsgConstant.KCHATTYPEGUILD -> { LogCenter.log("频道消息(guildId = ${record.guildId}, sender=${record.senderUid}, id = [$msgHash | ${record.msgId}], msg = $rawMsg)") - if(!GlobalEventTransmitter.MessageTransmitter - .transGuildMessage(record, record.elements, rawMsg, msgHash, postType = postType) - ) { + if (!GlobalEventTransmitter.MessageTransmitter + .transGuildMessage(record, record.elements, rawMsg, msgHash, postType = postType) + ) { LogCenter.log("频道消息推送失败 -> MessageTransmitter", Level.WARN) } } @@ -150,7 +159,7 @@ internal object AioListener : IKernelMsgListener { try { val msgHash = MessageHelper.generateMsgIdHash(record.chatType, record.msgId) - val peerId = when(record.chatType) { + val peerId = when (record.chatType) { MsgConstant.KCHATTYPEGUILD -> record.guildId else -> record.peerUin.toString() } @@ -182,7 +191,7 @@ internal object AioListener : IKernelMsgListener { GlobalScope.launch { val msgHash = MessageHelper.generateMsgIdHash(record.chatType, record.msgId) - val peerId = when(record.chatType) { + val peerId = when (record.chatType) { MsgConstant.KCHATTYPEGUILD -> record.guildId else -> record.peerUin.toString() } @@ -447,6 +456,7 @@ internal object AioListener : IKernelMsgListener { override fun onGuildMsgAbFlagChanged(guildMsgAbFlag: GuildMsgAbFlag?) { } + override fun onGuildNotificationAbstractUpdate(guildNotificationAbstractInfo: GuildNotificationAbstractInfo?) { }