From ce7965d00e49da3cd48a1c6ff7650d3a3a89d36c Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Wed, 2 Jul 2025 12:51:08 -0400 Subject: [PATCH] Improves starting value of flows --- .../edits/PrivateStorageRelayListState.kt | 2 +- .../model/nip02FollowLists/FollowListState.kt | 2 +- .../topNavFeeds/FeedTopNavFilterState.kt | 3 +- .../model/topNavFeeds/IFeedFlowsType.kt | 2 + .../allFollows/AllFollowsFeedFlow.kt | 4 +- .../topNavFeeds/aroundMe/AroundMeFeedFlow.kt | 4 +- .../topNavFeeds/global/GlobalFeedFlow.kt | 4 +- .../topNavFeeds/noteBased/NoteFeedFlow.kt | 66 ++++++++++++++++--- .../topNavFeeds/unknown/UnknownFeedFlow.kt | 5 +- .../nip01Core/FilterHomePostsByGeohashes.kt | 2 +- .../nip22Comments/FilterPostsByScopes.kt | 2 +- .../FilterHomePostsByAllFollows.kt | 20 +++--- .../HomeOutboxEventsEoseManager.kt | 3 +- .../quartz/nip51Lists/MuteListEvent.kt | 12 ++-- .../quartz/nip51Lists/PeopleListEvent.kt | 6 +- .../nip51Lists/interests/HashtagListEvent.kt | 2 + .../nip51Lists/locations/GeohashListEvent.kt | 2 + .../follow/CommunityListEvent.kt | 2 + 18 files changed, 101 insertions(+), 42 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/edits/PrivateStorageRelayListState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/edits/PrivateStorageRelayListState.kt index 4cf071b46..adec4d59b 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/edits/PrivateStorageRelayListState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/edits/PrivateStorageRelayListState.kt @@ -68,7 +68,7 @@ class PrivateStorageRelayListState( .stateIn( scope, SharingStarted.Eagerly, - emptySet(), + normalizePrivateOutboxRelayListWithBackup(getPrivateOutboxRelayListNote()), ) fun saveRelayList( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip02FollowLists/FollowListState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip02FollowLists/FollowListState.kt index 536faa18f..87eca3f75 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip02FollowLists/FollowListState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip02FollowLists/FollowListState.kt @@ -62,7 +62,7 @@ class FollowListState( @OptIn(ExperimentalCoroutinesApi::class) private val innerFlow: Flow = getFollowListFlow().transformLatest { - emit(buildKind3Follows(it.user.latestContactList)) + emit(buildKind3Follows(it.user.latestContactList ?: settings.backupContactList)) } val flow = diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/FeedTopNavFilterState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/FeedTopNavFilterState.kt index b4dea3cf8..ed0b9bccd 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/FeedTopNavFilterState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/FeedTopNavFilterState.kt @@ -29,7 +29,6 @@ import com.vitorpamplona.amethyst.model.topNavFeeds.allFollows.AllFollowsFeedFlo import com.vitorpamplona.amethyst.model.topNavFeeds.aroundMe.AroundMeFeedFlow import com.vitorpamplona.amethyst.model.topNavFeeds.global.GlobalFeedFlow import com.vitorpamplona.amethyst.model.topNavFeeds.noteBased.NoteFeedFlow -import com.vitorpamplona.amethyst.model.topNavFeeds.noteBased.author.AuthorsByOutboxTopNavFilter import com.vitorpamplona.amethyst.model.topNavFeeds.unknown.UnknownFeedFlow import com.vitorpamplona.amethyst.service.location.LocationState import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -80,6 +79,6 @@ class FeedTopNavFilterState( .stateIn( scope, SharingStarted.Eagerly, - AuthorsByOutboxTopNavFilter(emptySet()), + loadFlowsFor(feedFilterListName.value).startValue(), ) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/IFeedFlowsType.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/IFeedFlowsType.kt index 5dc1a6b45..150fa4c99 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/IFeedFlowsType.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/IFeedFlowsType.kt @@ -26,5 +26,7 @@ import kotlinx.coroutines.flow.FlowCollector interface IFeedFlowsType { fun flow(): Flow + fun startValue(): IFeedTopNavFilter + suspend fun startValue(collector: FlowCollector) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/allFollows/AllFollowsFeedFlow.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/allFollows/AllFollowsFeedFlow.kt index 8052cb276..e443909f5 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/allFollows/AllFollowsFeedFlow.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/allFollows/AllFollowsFeedFlow.kt @@ -50,7 +50,9 @@ class AllFollowsFeedFlow( override fun flow() = allFollows.map(::convert) + override fun startValue(): AllFollowsByOutboxTopNavFilter = convert(allFollows.value) + override suspend fun startValue(collector: FlowCollector) { - collector.emit(convert(allFollows.value)) + collector.emit(startValue()) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/aroundMe/AroundMeFeedFlow.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/aroundMe/AroundMeFeedFlow.kt index 28db5545f..22ceaa083 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/aroundMe/AroundMeFeedFlow.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/aroundMe/AroundMeFeedFlow.kt @@ -49,7 +49,9 @@ class AroundMeFeedFlow( override fun flow() = location.map(::convert) + override fun startValue(): LocationTopNavFilter = convert(location.value) + override suspend fun startValue(collector: FlowCollector) { - collector.emit(convert(location.value)) + collector.emit(startValue()) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/global/GlobalFeedFlow.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/global/GlobalFeedFlow.kt index 0a2141df2..ff6301ac1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/global/GlobalFeedFlow.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/global/GlobalFeedFlow.kt @@ -34,7 +34,9 @@ class GlobalFeedFlow( override fun flow() = MutableStateFlow(default) + override fun startValue(): GlobalTopNavFilter = default + override suspend fun startValue(collector: FlowCollector) { - collector.emit(default) + collector.emit(startValue()) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/noteBased/NoteFeedFlow.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/noteBased/NoteFeedFlow.kt index b30f72358..71104c81c 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/noteBased/NoteFeedFlow.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/noteBased/NoteFeedFlow.kt @@ -49,17 +49,51 @@ class NoteFeedFlow( val signer: NostrSigner, val allFollowRelays: StateFlow>, ) : IFeedFlowsType { + fun process(noteEvent: Event): IFeedTopNavFilter = + when (noteEvent) { + is PeopleListEvent -> { + if (noteEvent.dTag() == PeopleListEvent.Companion.BLOCK_LIST_D_TAG) { + MutedAuthorsByOutboxTopNavFilter(noteEvent.publicAndCachedPrivateUsersAndWords().users) + } else { + AuthorsByOutboxTopNavFilter(noteEvent.publicAndCachedPrivateUsersAndWords().users) + } + } + is MuteListEvent -> { + MutedAuthorsByOutboxTopNavFilter(noteEvent.publicAndCachedUsersAndWords().users) + } + is FollowListEvent -> { + AuthorsByOutboxTopNavFilter(noteEvent.pubKeys().toSet()) + } + is CommunityListEvent -> { + AllCommunitiesTopNavFilter(noteEvent.publicAndCachedPrivateCommunityIds().toSet()) + } + is HashtagListEvent -> { + HashtagTopNavFilter(noteEvent.publicAndCachedPrivateHashtags(), allFollowRelays) + } + is GeohashListEvent -> { + LocationTopNavFilter(noteEvent.publicAndCachedPrivateGeohash(), allFollowRelays) + } + is CommunityDefinitionEvent -> { + SingleCommunityTopNavFilter( + community = noteEvent.addressTag(), + authors = noteEvent.moderatorKeys().toSet().ifEmpty { null }, + relays = noteEvent.relayUrls().toSet(), + ) + } + else -> AuthorsByOutboxTopNavFilter(emptySet()) + } + suspend fun FlowCollector.process(noteEvent: Event) { when (noteEvent) { is PeopleListEvent -> { if (noteEvent.dTag() == PeopleListEvent.Companion.BLOCK_LIST_D_TAG) { - emit(MutedAuthorsByOutboxTopNavFilter(noteEvent.publicUsersAndWords().users)) + emit(MutedAuthorsByOutboxTopNavFilter(noteEvent.publicAndCachedPrivateUsersAndWords().users)) noteEvent.publicAndPrivateUsersAndWords(signer)?.let { emit(MutedAuthorsByOutboxTopNavFilter(it.users)) } } else { - emit(AuthorsByOutboxTopNavFilter(noteEvent.publicUsersAndWords().users)) + emit(AuthorsByOutboxTopNavFilter(noteEvent.publicAndCachedPrivateUsersAndWords().users)) noteEvent.publicAndPrivateUsersAndWords(signer)?.let { emit(AuthorsByOutboxTopNavFilter(it.users)) @@ -67,7 +101,7 @@ class NoteFeedFlow( } } is MuteListEvent -> { - emit(MutedAuthorsByOutboxTopNavFilter(noteEvent.publicUsersAndWords().users)) + emit(MutedAuthorsByOutboxTopNavFilter(noteEvent.publicAndCachedUsersAndWords().users)) noteEvent.publicAndPrivateUsersAndWords(signer)?.let { emit(MutedAuthorsByOutboxTopNavFilter(it.users)) @@ -99,13 +133,18 @@ class NoteFeedFlow( } } is CommunityDefinitionEvent -> { - SingleCommunityTopNavFilter( - community = noteEvent.addressTag(), - authors = noteEvent.moderatorKeys().toSet().ifEmpty { null }, - relays = noteEvent.relayUrls().toSet(), + emit( + SingleCommunityTopNavFilter( + community = noteEvent.addressTag(), + authors = noteEvent.moderatorKeys().toSet().ifEmpty { null }, + relays = noteEvent.relayUrls().toSet(), + ), ) } - else -> AuthorsByOutboxTopNavFilter(emptySet()) + else -> + emit( + AuthorsByOutboxTopNavFilter(emptySet()), + ) } } @@ -120,10 +159,19 @@ class NoteFeedFlow( } } + override fun startValue(): IFeedTopNavFilter { + val noteEvent = metadataFlow.value?.note?.event + if (noteEvent == null) { + return AuthorsByOutboxTopNavFilter(emptySet()) + } else { + return process(noteEvent) + } + } + override suspend fun startValue(collector: FlowCollector) { val noteEvent = metadataFlow.value?.note?.event if (noteEvent == null) { - AuthorsByOutboxTopNavFilter(emptySet()) + collector.emit(AuthorsByOutboxTopNavFilter(emptySet())) } else { collector.process(noteEvent) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/unknown/UnknownFeedFlow.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/unknown/UnknownFeedFlow.kt index 4596d3098..075f449ca 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/unknown/UnknownFeedFlow.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/topNavFeeds/unknown/UnknownFeedFlow.kt @@ -30,8 +30,11 @@ class UnknownFeedFlow( ) : IFeedFlowsType { override fun flow() = MutableStateFlow(UnknownTopNavFilter(feedName)) + // empty feed + override fun startValue(): UnknownTopNavFilter = UnknownTopNavFilter(feedName) + // empty feed override suspend fun startValue(collector: FlowCollector) { - collector.emit(UnknownTopNavFilter(feedName)) + collector.emit(startValue()) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip01Core/FilterHomePostsByGeohashes.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip01Core/FilterHomePostsByGeohashes.kt index 12b90b80a..e6b332fce 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip01Core/FilterHomePostsByGeohashes.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip01Core/FilterHomePostsByGeohashes.kt @@ -56,7 +56,7 @@ val HomePostsByGeohashKinds = fun filterHomePostsByGeohashes( relay: NormalizedRelayUrl, geotags: Set, - since: Long, + since: Long?, ): List { if (geotags.isEmpty()) return emptyList() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip22Comments/FilterPostsByScopes.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip22Comments/FilterPostsByScopes.kt index 04c29fb0f..04172ee0d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip22Comments/FilterPostsByScopes.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip22Comments/FilterPostsByScopes.kt @@ -30,7 +30,7 @@ val CommentKinds = listOf(CommentEvent.KIND) fun filterHomePostsByScopes( relay: NormalizedRelayUrl, scopesToLoad: Set, - since: Long, + since: Long?, ): List { if (scopesToLoad.isEmpty()) return emptyList() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip65Follows/FilterHomePostsByAllFollows.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip65Follows/FilterHomePostsByAllFollows.kt index dd1f0a021..695b70236 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip65Follows/FilterHomePostsByAllFollows.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip65Follows/FilterHomePostsByAllFollows.kt @@ -27,7 +27,6 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.home.datasource.nip01Core.f import com.vitorpamplona.amethyst.ui.screen.loggedIn.home.datasource.nip22Comments.filterHomePostsByScopes import com.vitorpamplona.amethyst.ui.screen.loggedIn.home.datasource.nip72Communities.filterHomePostsFromAllCommunities import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter -import com.vitorpamplona.quartz.utils.TimeUtils import kotlin.collections.flatten fun filterHomePostsByAllFollows( @@ -36,29 +35,26 @@ fun filterHomePostsByAllFollows( ): List { if (followsSet.set.isEmpty()) return emptyList() - val defaultSince = TimeUtils.oneWeekAgo() - - return followsSet.set.flatMap { - val since = since?.get(it.key)?.time ?: defaultSince - val relay = it.key + return followsSet.set.flatMap { (relay, filter) -> + val since = since?.get(relay)?.time listOfNotNull( - it.value.authors?.let { + filter.authors?.let { filterHomePostsByAuthors(relay, it, since) }, - it.value.geotags?.let { + filter.geotags?.let { filterHomePostsByGeohashes(relay, it, since) }, - it.value.geotagScopes?.let { + filter.geotagScopes?.let { filterHomePostsByScopes(relay, it, since) }, - it.value.hashtags?.let { + filter.hashtags?.let { filterHomePostsByHashtags(relay, it, since) }, - it.value.hashtagScopes?.let { + filter.hashtagScopes?.let { filterHomePostsByScopes(relay, it, since) }, - it.value.communities?.let { + filter.communities?.let { filterHomePostsFromAllCommunities(relay, it, since) }, ).flatten() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip65Follows/HomeOutboxEventsEoseManager.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip65Follows/HomeOutboxEventsEoseManager.kt index bbe992d11..136751a4d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip65Follows/HomeOutboxEventsEoseManager.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip65Follows/HomeOutboxEventsEoseManager.kt @@ -44,7 +44,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.Job import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.sample import kotlinx.coroutines.launch class HomeOutboxEventsEoseManager( @@ -95,7 +94,7 @@ class HomeOutboxEventsEoseManager( } }, key.scope.launch(Dispatchers.Default) { - key.followRelayFlow().sample(2000).collectLatest { + key.followRelayFlow().collectLatest { invalidateFilters() } }, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/MuteListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/MuteListEvent.kt index 16719a972..fc0eb9f1a 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/MuteListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/MuteListEvent.kt @@ -41,19 +41,19 @@ class MuteListEvent( ) : GeneralListEvent(id, pubKey, createdAt, KIND, tags, content, sig) { override fun dTag() = FIXED_D_TAG - fun publicUsersAndWords() = - PeopleListEvent.UsersAndWords( - filterTagList("p", tags), - filterTagList("word", tags), + fun publicAndCachedUsersAndWords() = + UsersAndWords( + filterTagList("p", cachedPrivateTags()), + filterTagList("word", cachedPrivateTags()), ) fun publicAndPrivateUsersAndWords( signer: NostrSigner, - onReady: (PeopleListEvent.UsersAndWords) -> Unit, + onReady: (UsersAndWords) -> Unit, ) { privateTagsOrEmpty(signer) { onReady( - PeopleListEvent.UsersAndWords( + UsersAndWords( filterTagList("p", it), filterTagList("word", it), ), diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/PeopleListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/PeopleListEvent.kt index 08a80ad1a..762660a8e 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/PeopleListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/PeopleListEvent.kt @@ -44,10 +44,10 @@ class PeopleListEvent( val words: Set = setOf(), ) - fun publicUsersAndWords() = + fun publicAndCachedPrivateUsersAndWords() = UsersAndWords( - filterTagList("p", tags), - filterTagList("word", tags), + filterTagList("p", cachedPrivateTags()), + filterTagList("word", cachedPrivateTags()), ) fun publicAndPrivateUsersAndWords( diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/interests/HashtagListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/interests/HashtagListEvent.kt index d56059e18..3e85f0797 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/interests/HashtagListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/interests/HashtagListEvent.kt @@ -46,6 +46,8 @@ class HashtagListEvent( fun publicHashtags() = tags.mapNotNull(HashtagTag::parse) + fun publicAndCachedPrivateHashtags() = publicHashtags().toSet() + (publicAndPrivateHashtagCache ?: emptySet()) + fun publicAndPrivateHashtag( signer: NostrSigner, onReady: (Set) -> Unit, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/locations/GeohashListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/locations/GeohashListEvent.kt index dff171129..e1632c8a3 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/locations/GeohashListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/locations/GeohashListEvent.kt @@ -47,6 +47,8 @@ class GeohashListEvent( fun publicGeohashes() = tags.mapNotNull(GeoHashTag::parse) + fun publicAndCachedPrivateGeohash() = publicGeohashes().toSet() + (publicAndPrivateGeohashCache ?: emptySet()) + fun publicAndPrivateGeohash( signer: NostrSigner, onReady: (Set) -> Unit, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip72ModCommunities/follow/CommunityListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip72ModCommunities/follow/CommunityListEvent.kt index 2d5acf30d..9f95d4dc5 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip72ModCommunities/follow/CommunityListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip72ModCommunities/follow/CommunityListEvent.kt @@ -54,6 +54,8 @@ class CommunityListEvent( fun publicCommunityIds() = tags.mapNotNull(ATag::parseAddressId) + fun publicAndCachedPrivateCommunityIds() = publicCommunityIds() + (publicAndPrivateAddressCache?.map { it.addressId } ?: emptyList()) + fun publicAndPrivateCommunities( signer: NostrSigner, onReady: (Set) -> Unit,