From 5109b65e3797f6717e300ee5138b5137d14f9d1d Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 12 Feb 2024 14:21:32 -0500 Subject: [PATCH] Fixes crash when MuteList has `e` tags that are not valid hexes --- .../amethyst/ui/dal/HiddenAccountsFeedFilter.kt | 12 +++++++++++- .../vitorpamplona/quartz/events/GeneralListEvent.kt | 12 +++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HiddenAccountsFeedFilter.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HiddenAccountsFeedFilter.kt index b05cce59a..7843c396c 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HiddenAccountsFeedFilter.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/dal/HiddenAccountsFeedFilter.kt @@ -20,9 +20,11 @@ */ package com.vitorpamplona.amethyst.ui.dal +import android.util.Log import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.User +import kotlinx.coroutines.CancellationException class HiddenAccountsFeedFilter(val account: Account) : FeedFilter() { override fun feedKey(): String { @@ -34,7 +36,15 @@ class HiddenAccountsFeedFilter(val account: Account) : FeedFilter() { } override fun feed(): List { - return account.flowHiddenUsers.value.hiddenUsers.reversed().map { LocalCache.getOrCreateUser(it) } + return account.flowHiddenUsers.value.hiddenUsers.reversed().mapNotNull { + try { + LocalCache.getOrCreateUser(it) + } catch (e: Exception) { + if (e is CancellationException) throw e + Log.e("HiddenAccountsFeedFilter", "Failed to parse key $it") + null + } + } } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/GeneralListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/GeneralListEvent.kt index 2563ad821..3ac1f4080 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/GeneralListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/GeneralListEvent.kt @@ -28,6 +28,7 @@ import com.vitorpamplona.quartz.encoders.HexKey import com.vitorpamplona.quartz.signers.NostrSigner import kotlinx.collections.immutable.ImmutableSet import kotlinx.collections.immutable.toImmutableSet +import java.util.HashSet @Immutable abstract class GeneralListEvent( @@ -61,12 +62,13 @@ abstract class GeneralListEvent( key: String, privateTags: Array>?, ): ImmutableSet { - val privateUserList = - privateTags?.let { it.filter { it.size > 1 && it[0] == key }.map { it[1] }.toSet() } - ?: emptySet() - val publicUserList = tags.filter { it.size > 1 && it[0] == key }.map { it[1] }.toSet() + val result = HashSet(tags.size + (privateTags?.size ?: 0)) - return (privateUserList + publicUserList).toImmutableSet() + privateTags?.let { it.filter { it.size > 1 && it[0] == key }.mapTo(result) { it[1] } } + + tags.filter { it.size > 1 && it[0] == key }.mapTo(result) { it[1] } + + return result.toImmutableSet() } fun isTagged(