Improve RspSystemMsgNew filtering

This commit is contained in:
Karlatemp 2021-02-21 14:28:51 +08:00
parent f12f78a55f
commit a5c28758e9
No known key found for this signature in database
GPG Key ID: 21FBDDF664FF06F8
2 changed files with 23 additions and 9 deletions

View File

@ -182,12 +182,13 @@ internal open class QQAndroidClient(
val pbGetMessageCacheList = SyncingCacheList<PbGetMessageSyncId>()
internal data class SystemMsgNewGroupSyncId(
internal data class SystemMsgNewSyncId(
val sequence: Long,
val time: Long
)
val systemMsgNewGroupCacheList = SyncingCacheList<SystemMsgNewGroupSyncId>(10)
val systemMsgNewGroupCacheList = SyncingCacheList<SystemMsgNewSyncId>(10)
val systemMsgNewFriendCacheList = SyncingCacheList<SystemMsgNewSyncId>(10)
internal data class PbPushTransMsgSyncId(

View File

@ -28,7 +28,7 @@ import net.mamoe.mirai.internal.network.protocol.packet.buildOutgoingUniPacket
import net.mamoe.mirai.internal.utils._miraiContentToString
import net.mamoe.mirai.internal.utils.io.serialization.loadAs
import net.mamoe.mirai.internal.utils.io.serialization.writeProtoBuf
import net.mamoe.mirai.utils.currentTimeSeconds
import kotlin.math.max
internal class NewContact {
@ -60,8 +60,17 @@ internal class NewContact {
override suspend fun ByteReadPacket.decode(bot: QQAndroidBot): Packet? {
readBytes().loadAs(Structmsg.RspSystemMsgNew.serializer()).run {
return friendmsgs.filter {
it.msgTime > bot.client.syncingController.latestMsgNewFriendTime
it.msgTime >= bot.client.syncingController.latestMsgNewFriendTime
}.mapNotNull { struct ->
if (!bot.client.syncingController.systemMsgNewFriendCacheList.addCache(
QQAndroidClient.MessageSvcSyncData.SystemMsgNewSyncId(
struct.msgSeq,
struct.msgTime
)
)
) { // duplicate
return@mapNotNull null
}
struct.msg?.run {
NewFriendRequestEvent(
bot,
@ -79,7 +88,9 @@ internal class NewContact {
else -> MultiPacketByIterable(packets)
}
}.also {
bot.client.syncingController.latestMsgNewFriendTime = currentTimeSeconds()
bot.client.syncingController.run {
latestMsgNewFriendTime = max(latestMsgNewFriendTime, friendmsgs.maxOfOrNull { it.msgTime } ?: 0)
}
}
}
}
@ -238,10 +249,10 @@ internal class NewContact {
return readBytes().loadAs(Structmsg.RspSystemMsgNew.serializer()).run {
groupmsgs.filter {
it.msgTime > bot.client.syncingController.latestMsgNewGroupTime
it.msgTime >= bot.client.syncingController.latestMsgNewGroupTime
}.mapNotNull { struct ->
if (!bot.client.syncingController.systemMsgNewGroupCacheList.addCache(
QQAndroidClient.MessageSvcSyncData.SystemMsgNewGroupSyncId(
QQAndroidClient.MessageSvcSyncData.SystemMsgNewSyncId(
struct.msgSeq,
struct.msgTime
)
@ -256,9 +267,11 @@ internal class NewContact {
packets.size == 1 -> packets[0]
else -> MultiPacketByIterable(packets)
}
}.also {
bot.client.syncingController.run {
latestMsgNewGroupTime = max(latestMsgNewGroupTime, groupmsgs.maxOfOrNull { it.msgTime } ?: 0)
}
}
}.also {
bot.client.syncingController.latestMsgNewGroupTime = currentTimeSeconds()
}
}