From 951a4be6152435c4b7271232ee68092c904ab60c Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Fri, 24 Feb 2023 16:36:02 -0500 Subject: [PATCH] Spam count per relay. --- .../amethyst/model/LocalCache.kt | 14 +++++++-- .../amethyst/model/RelaySetupInfo.kt | 1 + .../amethyst/service/relays/Relay.kt | 1 + .../amethyst/ui/actions/NewRelayListView.kt | 30 +++++++++++++++++-- .../ui/actions/NewRelayListViewModel.kt | 6 ++-- 5 files changed, 46 insertions(+), 6 deletions(-) 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 9cb76802a..214ba4287 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -140,7 +140,12 @@ object LocalCache { fun consume(event: TextNoteEvent, relay: Relay? = null) { - if (antiSpam.isSpam(event)) return + if (antiSpam.isSpam(event)) { + relay?.let { + it.spamCounter++ + } + return + } val note = getOrCreateNote(event.id.toHex()) val author = getOrCreateUser(event.pubKey.toHexKey()) @@ -426,7 +431,12 @@ object LocalCache { fun consume(event: ChannelMessageEvent, relay: Relay?) { if (event.channel.isNullOrBlank()) return - if (antiSpam.isSpam(event)) return + if (antiSpam.isSpam(event)) { + relay?.let { + it.spamCounter++ + } + return + } val channel = checkGetOrCreateChannel(event.channel) ?: return diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/RelaySetupInfo.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/RelaySetupInfo.kt index 3374fb08f..ddaf9f728 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/RelaySetupInfo.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/RelaySetupInfo.kt @@ -9,5 +9,6 @@ data class RelaySetupInfo( val errorCount: Int = 0, val downloadCount: Int = 0, val uploadCount: Int = 0, + val spamCount: Int = 0, val feedTypes: Set ) \ No newline at end of file diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt index 5378b942c..f88ee90df 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/relays/Relay.kt @@ -31,6 +31,7 @@ class Relay( private var isReady: Boolean = false var eventDownloadCounter = 0 + var spamCounter = 0 var eventUploadCounter = 0 var errorCounter = 0 var ping: Long? = null diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewRelayListView.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewRelayListView.kt index 3cc6e2577..9492fd262 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewRelayListView.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewRelayListView.kt @@ -23,6 +23,7 @@ import androidx.compose.material.Surface import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Cancel +import androidx.compose.material.icons.filled.DeleteSweep import androidx.compose.material.icons.filled.Download import androidx.compose.material.icons.filled.Groups import androidx.compose.material.icons.filled.Public @@ -148,7 +149,7 @@ fun ServerConfigHeader() { } } - Column(Modifier.weight(1f)) { + Column(Modifier.weight(1.4f)) { Row(verticalAlignment = Alignment.CenterVertically) { Spacer(modifier = Modifier.size(25.dp)) @@ -181,6 +182,16 @@ fun ServerConfigHeader() { ) Spacer(modifier = Modifier.size(5.dp)) + + Text( + text = "Spam", + maxLines = 1, + fontSize = 14.sp, + modifier = Modifier.weight(1f), + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f), + ) + + Spacer(modifier = Modifier.size(2.dp)) } } } @@ -290,7 +301,7 @@ fun ServerConfig( } } - Column(Modifier.weight(1f)) { + Column(Modifier.weight(1.4f)) { Row(verticalAlignment = Alignment.CenterVertically) { IconButton( modifier = Modifier.size(30.dp), @@ -350,6 +361,21 @@ fun ServerConfig( modifier = Modifier.weight(1f), color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f), ) + + Icon( + imageVector = Icons.Default.DeleteSweep, + null, + modifier = Modifier.padding(horizontal = 5.dp).size(15.dp), + tint = if (item.spamCount > 0) Color.Yellow else Color.Green + ) + + Text( + text = "${countToHumanReadable(item.spamCount)}", + maxLines = 1, + fontSize = 14.sp, + modifier = Modifier.weight(1f), + color = MaterialTheme.colors.onSurface.copy(alpha = 0.32f), + ) } } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewRelayListViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewRelayListViewModel.kt index f88773b74..01701232e 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewRelayListViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewRelayListViewModel.kt @@ -42,8 +42,9 @@ class NewRelayListViewModel: ViewModel() { val errorCounter = liveRelay?.errorCounter ?: 0 val eventDownloadCounter = liveRelay?.eventDownloadCounter ?: 0 val eventUploadCounter = liveRelay?.eventUploadCounter ?: 0 + val spamCounter = liveRelay?.spamCounter ?: 0 - RelaySetupInfo(it.key, it.value.read, it.value.write, errorCounter, eventDownloadCounter, eventUploadCounter, localInfoFeedTypes) + RelaySetupInfo(it.key, it.value.read, it.value.write, errorCounter, eventDownloadCounter, eventUploadCounter, spamCounter, localInfoFeedTypes) }.sortedBy { it.downloadCount }.reversed() else account.localRelays.map { @@ -52,8 +53,9 @@ class NewRelayListViewModel: ViewModel() { val errorCounter = liveRelay?.errorCounter ?: 0 val eventDownloadCounter = liveRelay?.eventDownloadCounter ?: 0 val eventUploadCounter = liveRelay?.eventUploadCounter ?: 0 + val spamCounter = liveRelay?.spamCounter ?: 0 - RelaySetupInfo(it.url, it.read, it.write, errorCounter, eventDownloadCounter, eventUploadCounter, it.feedTypes) + RelaySetupInfo(it.url, it.read, it.write, errorCounter, eventDownloadCounter, eventUploadCounter, spamCounter, it.feedTypes) }.sortedBy { it.downloadCount }.reversed() } }