From 10af69f05e12382a473c43a4558b982311f193e9 Mon Sep 17 00:00:00 2001 From: Him188 Date: Tue, 21 Dec 2021 22:55:54 +0000 Subject: [PATCH] Filter out duplicated GroupTalkativeChangeEvent and relevant events with same subject. Fix #1707 --- mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt | 2 ++ .../network/notice/group/GroupNotificationProcessor.kt | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt b/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt index 6636efafe..4b2e62589 100644 --- a/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt +++ b/mirai-core/src/commonMain/kotlin/contact/GroupImpl.kt @@ -12,6 +12,7 @@ package net.mamoe.mirai.internal.contact +import kotlinx.atomicfu.atomic import net.mamoe.mirai.LowLevelApi import net.mamoe.mirai.Mirai import net.mamoe.mirai.contact.* @@ -114,6 +115,7 @@ internal class GroupImpl constructor( override val filesRoot: RemoteFile by lazy { RemoteFileImpl(this, "/") } override val files: RemoteFiles by lazy { RemoteFilesImpl(this) } + val lastTalkative = atomic(null) override val announcements: Announcements by lazy { AnnouncementsImpl( diff --git a/mirai-core/src/commonMain/kotlin/network/notice/group/GroupNotificationProcessor.kt b/mirai-core/src/commonMain/kotlin/network/notice/group/GroupNotificationProcessor.kt index 5f9d60783..486981406 100644 --- a/mirai-core/src/commonMain/kotlin/network/notice/group/GroupNotificationProcessor.kt +++ b/mirai-core/src/commonMain/kotlin/network/notice/group/GroupNotificationProcessor.kt @@ -347,8 +347,12 @@ internal class GroupNotificationProcessor( } // 龙王 10093L, 1053L, 1054L -> { - val now: NormalMember = grayTip.msgTemplParam["uin"]?.findMember() ?: group.botAsMember - val previous: NormalMember? = grayTip.msgTemplParam["uin_last"]?.findMember() + val now = grayTip.msgTemplParam["uin"]?.findMember() ?: group.botAsMember + val previous = grayTip.msgTemplParam["uin_last"]?.findMember() + + val lastTalkative = group.lastTalkative.value + if (lastTalkative == now) return // duplicate + if (!group.lastTalkative.compareAndSet(lastTalkative, now)) return if (previous == null) { collect(MemberHonorChangeEvent.Achieve(now, GroupHonorType.TALKATIVE))