From 61920ed31aa5ffb4808c38af01917860ae93ab57 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 22 Feb 2023 18:08:14 -0500 Subject: [PATCH] Recording duplicated event IDs to avoid marking as spam just because the same event was downloaded from multiple relays. --- .../main/java/com/vitorpamplona/amethyst/model/Account.kt | 2 +- .../com/vitorpamplona/amethyst/model/AntiSpamFilter.kt | 8 ++++++-- .../java/com/vitorpamplona/amethyst/model/LocalCache.kt | 1 - 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index a64431392..c0c796105 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -515,7 +515,7 @@ class Account( LocalCache.antiSpam.liveSpam.observeForever { GlobalScope.launch(Dispatchers.IO) { it.cache.spamMessages.snapshot().values.forEach { - if (it.pubkeyHex !in transientHiddenUsers && it.duplicatedMessages > 5) { + if (it.pubkeyHex !in transientHiddenUsers && it.duplicatedMessages.size >= 5) { val userToBlock = LocalCache.getOrCreateUser(it.pubkeyHex) if (userToBlock != userProfile() && userToBlock !in userProfile().follows) { transientHiddenUsers = transientHiddenUsers + it.pubkeyHex diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/AntiSpamFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/AntiSpamFilter.kt index 2c3ca4d1c..32efc9df0 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/AntiSpamFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/AntiSpamFilter.kt @@ -14,6 +14,8 @@ import kotlinx.coroutines.withContext import nostr.postr.events.Event import nostr.postr.toHex +data class Spammer(val pubkeyHex: HexKey, var duplicatedMessages: Set) + class AntiSpamFilter { val recentMessages = LruCache(1000) val spamMessages = LruCache(1000) @@ -39,10 +41,12 @@ class AntiSpamFilter { // Log down offenders if (spamMessages.get(hash) == null) { - spamMessages.put(hash, Spammer(event.pubKey.toHexKey(), 2)) + spamMessages.put(hash, Spammer(event.pubKey.toHexKey(), setOf(recentMessages[hash], event.id.toHex()))) liveSpam.invalidateData() } else { - spamMessages.get(hash).duplicatedMessages++ + val spammer = spamMessages.get(hash) + spammer.duplicatedMessages = spammer.duplicatedMessages + event.id.toHex() + liveSpam.invalidateData() } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 7d58bc66b..9fcea33d8 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -43,7 +43,6 @@ import nostr.postr.events.TextNoteEvent import nostr.postr.toHex import nostr.postr.toNpub -data class Spammer(val pubkeyHex: HexKey, var duplicatedMessages: Int) object LocalCache { val metadataParser = jacksonObjectMapper()