From d8461c2a74f86dc0b8e1b59764c8e266f2570377 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 14 Aug 2025 19:47:20 -0400 Subject: [PATCH] Growing the number of possibilities to download profile information from --- .../vitorpamplona/amethyst/model/Account.kt | 25 ++++++++++--------- .../com/vitorpamplona/amethyst/model/User.kt | 4 +-- .../datasource/FilterUserProfileFollowers.kt | 11 ++++++-- .../datasource/FilterUserProfileMedia.kt | 11 ++++++-- .../datasource/FilterUserProfilePosts.kt | 12 ++++++--- .../FilterUserProfileZapReceived.kt | 12 +++++++-- .../UserProfileMetadataFilterSubAssembler.kt | 9 ++++++- 7 files changed, 60 insertions(+), 24 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index bfa64bfec..5772cc335 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -214,6 +214,7 @@ import kotlinx.coroutines.launch import java.math.BigDecimal import java.util.Locale import kotlin.collections.forEach +import kotlin.collections.ifEmpty @OptIn(DelicateCoroutinesApi::class) @Stable @@ -536,7 +537,7 @@ class Account( val zapRequest = LnZapRequestEvent.create( userHex = user.pubkeyHex, - relays = nip65RelayList.inboxFlow.value + user.inboxRelays(), + relays = nip65RelayList.inboxFlow.value + (user.inboxRelays() ?: emptyList()), signer = signer, message = message, zapType = zapType, @@ -657,7 +658,8 @@ class Account( if (replyToAuthor == userProfile()) { outboxRelays.flow.value } else { - replyToAuthor.outboxRelays().ifEmpty { null }?.toSet() + replyToAuthor.inboxRelays()?.ifEmpty { null }?.toSet() + ?: replyToAuthor.relaysBeingUsed.keys.ifEmpty { null } ?: cache.relayHints .hintsForKey(replyToAuthor.pubkeyHex) .ifEmpty { null } @@ -683,7 +685,7 @@ class Account( if (user == userProfile()) { notificationRelays.flow.value } else { - user.inboxRelays().ifEmpty { null }?.toSet() + user.inboxRelays()?.ifEmpty { null }?.toSet() ?: (cache.relayHints.hintsForKey(user.pubkeyHex).toSet() + user.relaysBeingUsed.keys) } @@ -736,10 +738,12 @@ class Account( if (author == userProfile()) { relayList.addAll(outboxRelays.flow.value) } else { - relayList.addAll( - author.outboxRelays().ifEmpty { null } - ?: cache.relayHints.hintsForKey(author.pubkeyHex), - ) + val relays = + author.outboxRelays()?.ifEmpty { null } + ?: author.relaysBeingUsed.keys.ifEmpty { null } + ?: cache.relayHints.hintsForKey(author.pubkeyHex) + + relayList.addAll(relays) } } else { relayList.addAll(cache.relayHints.hintsForKey(event.pubKey)) @@ -1548,11 +1552,8 @@ class Account( val request = NIP90ContentDiscoveryRequestEvent.create(dvmPublicKey.pubkeyHex, signer.pubKey, relays, signer) val relayList = - dvmPublicKey - .inboxRelays() - .ifEmpty { - cache.relayHints.hintsForKey(dvmPublicKey.pubkeyHex) + dvmPublicKey.relaysBeingUsed.keys - }.toSet() + dvmPublicKey.inboxRelays()?.toSet()?.ifEmpty { null } + ?: (dvmPublicKey.relaysBeingUsed.keys + cache.relayHints.hintsForKey(dvmPublicKey.pubkeyHex)) cache.justConsumeMyOwnEvent(request) onReady(request) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/User.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/User.kt index fe3c2f44d..eca19a58a 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/User.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/User.kt @@ -78,11 +78,11 @@ class User( fun toNProfile() = NProfile.create(pubkeyHex, relayHints()) - fun outboxRelays() = authorRelayList()?.writeRelaysNorm() ?: listOfNotNull(latestMetadataRelay) + fun outboxRelays() = authorRelayList()?.writeRelaysNorm() fun relayHints() = authorRelayList()?.writeRelaysNorm()?.take(3) ?: listOfNotNull(latestMetadataRelay) - fun inboxRelays() = authorRelayList()?.readRelaysNorm() ?: listOfNotNull(latestMetadataRelay) + fun inboxRelays() = authorRelayList()?.readRelaysNorm() fun dmInboxRelays() = dmInboxRelayList()?.relays()?.ifEmpty { null } ?: inboxRelays() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/FilterUserProfileFollowers.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/FilterUserProfileFollowers.kt index 274fc334b..42d758ae4 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/FilterUserProfileFollowers.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/FilterUserProfileFollowers.kt @@ -20,6 +20,7 @@ */ package com.vitorpamplona.amethyst.ui.screen.loggedIn.profile.datasource +import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter @@ -31,8 +32,13 @@ val UserProfileFollowersKinds = listOf(ContactListEvent.KIND) fun filterUserProfileFollowers( user: User, since: SincePerRelayMap?, -): List = - user.inboxRelays().map { +): List { + val relays = + user.inboxRelays()?.ifEmpty { null } + ?: user.relaysBeingUsed.keys.ifEmpty { null } + ?: LocalCache.relayHints.hintsForKey(user.pubkeyHex) + + return relays.map { RelayBasedFilter( relay = it, filter = @@ -43,3 +49,4 @@ fun filterUserProfileFollowers( ), ) } +} diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/FilterUserProfileMedia.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/FilterUserProfileMedia.kt index a1a97d332..869640bda 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/FilterUserProfileMedia.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/FilterUserProfileMedia.kt @@ -20,6 +20,7 @@ */ package com.vitorpamplona.amethyst.ui.screen.loggedIn.profile.datasource +import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.quartz.experimental.profileGallery.ProfileGalleryEntryEvent @@ -40,8 +41,13 @@ val UserProfileMediaKinds = fun filterUserProfileMedia( user: User, since: SincePerRelayMap?, -): List = - user.outboxRelays().map { relay -> +): List { + val relays = + user.outboxRelays()?.ifEmpty { null } + ?: user.relaysBeingUsed.keys.ifEmpty { null } + ?: LocalCache.relayHints.hintsForKey(user.pubkeyHex) + + return relays.map { relay -> RelayBasedFilter( relay = relay, filter = @@ -53,3 +59,4 @@ fun filterUserProfileMedia( ), ) } +} diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/FilterUserProfilePosts.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/FilterUserProfilePosts.kt index 57b533a36..ffaea839a 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/FilterUserProfilePosts.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/FilterUserProfilePosts.kt @@ -20,6 +20,7 @@ */ package com.vitorpamplona.amethyst.ui.screen.loggedIn.profile.datasource +import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.quartz.experimental.interactiveStories.InteractiveStoryPrologueEvent @@ -66,9 +67,13 @@ val UserProfilePostKinds2 = fun filterUserProfilePosts( user: User, since: SincePerRelayMap?, -): List = - user - .outboxRelays() +): List { + val relays = + user.outboxRelays()?.ifEmpty { null } + ?: user.relaysBeingUsed.keys.ifEmpty { null } + ?: LocalCache.relayHints.hintsForKey(user.pubkeyHex) + + return relays .map { relay -> listOf( RelayBasedFilter( @@ -93,3 +98,4 @@ fun filterUserProfilePosts( ), ) }.flatten() +} diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/FilterUserProfileZapReceived.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/FilterUserProfileZapReceived.kt index ffd963542..11db8cf3d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/FilterUserProfileZapReceived.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/FilterUserProfileZapReceived.kt @@ -20,19 +20,26 @@ */ package com.vitorpamplona.amethyst.ui.screen.loggedIn.profile.datasource +import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip57Zaps.LnZapEvent +import kotlin.collections.ifEmpty val UserProfileZapReceiverKinds = listOf(LnZapEvent.KIND) fun filterUserProfileZapsReceived( user: User, since: SincePerRelayMap?, -): List = - user.inboxRelays().map { relay -> +): List { + val relays = + user.inboxRelays()?.ifEmpty { null } + ?: user.relaysBeingUsed.keys.ifEmpty { null } + ?: LocalCache.relayHints.hintsForKey(user.pubkeyHex) + + return relays.map { relay -> RelayBasedFilter( relay = relay, filter = @@ -44,3 +51,4 @@ fun filterUserProfileZapsReceived( ), ) } +} diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileMetadataFilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileMetadataFilterSubAssembler.kt index 0b028e741..e7e291bd0 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileMetadataFilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileMetadataFilterSubAssembler.kt @@ -20,11 +20,13 @@ */ package com.vitorpamplona.amethyst.ui.screen.loggedIn.profile.datasource +import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.SingleSubEoseManager import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.utils.mapOfSet +import kotlin.collections.ifEmpty class UserProfileMetadataFilterSubAssembler( client: NostrClient, @@ -37,7 +39,12 @@ class UserProfileMetadataFilterSubAssembler( val userPerRelay = mapOfSet { keys.mapTo(mutableSetOf()) { key -> key.user }.forEach { user -> - user.outboxRelays().forEach { relay -> + val relays = + user.outboxRelays()?.ifEmpty { null } + ?: user.relaysBeingUsed.keys.ifEmpty { null } + ?: LocalCache.relayHints.hintsForKey(user.pubkeyHex) + + relays.forEach { relay -> add(relay, user.pubkeyHex) } }