From b01d83895de30cfa3cc657557102468dd167be17 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Mon, 18 Nov 2024 07:33:57 -0300 Subject: [PATCH] Check if relay sends the bunker events back --- .../greenart7c3/nostrsigner/NostrSigner.kt | 40 ++++++++++------- .../ui/actions/EditRelaysDialog.kt | 45 +++++++++++++++++-- app/src/main/res/values/strings.xml | 1 + 3 files changed, 68 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/NostrSigner.kt b/app/src/main/java/com/greenart7c3/nostrsigner/NostrSigner.kt index 89be152c..a34dda79 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/NostrSigner.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/NostrSigner.kt @@ -200,7 +200,10 @@ class NostrSigner : Application() { applicationIOScope.cancel() } - suspend fun fetchProfileData(account: Account, onPictureFound: (String) -> Unit) { + suspend fun fetchProfileData( + account: Account, + onPictureFound: (String) -> Unit, + ) { @Suppress("KotlinConstantConditions") if (BuildConfig.FLAVOR == "offline") { return @@ -226,7 +229,25 @@ class NostrSigner : Application() { val oneDayAgo = TimeUtils.oneDayAgo() if (lastMetaData == 0L || oneDayAgo > lastMetaData) { Log.d("NostrSigner", "Fetching profile data for ${account.signer.keyPair.pubKey.toNpub()}") - val listener = RelayListener(account, onPictureFound) + val listener = RelayListener( + account = account, + onReceiveEvent = { _, _, event -> + if (event.kind == MetadataEvent.KIND) { + (event as MetadataEvent).contactMetaData()?.let { metadata -> + metadata.name?.let { name -> + account.name = name + LocalPreferences.saveToEncryptedStorage(account = account, context = this) + } + + metadata.profilePicture()?.let { url -> + LocalPreferences.saveProfileUrlToEncryptedStorage(url, account.signer.keyPair.pubKey.toNpub()) + LocalPreferences.setLastMetadataUpdate(this, account.signer.keyPair.pubKey.toNpub(), TimeUtils.now()) + onPictureFound(url) + } + } + } + }, + ) val relays = listOf( Relay( @@ -285,7 +306,7 @@ class NostrSigner : Application() { class RelayListener( val account: Account, - val onPictureFound: (String) -> Unit, + val onReceiveEvent: (relay: Relay, subscriptionId: String, event: Event) -> Unit, ) : Relay.Listener { override fun onAuth(relay: Relay, challenge: String) { Log.d("RelayListener", "Received auth challenge $challenge from relay ${relay.url}") @@ -301,18 +322,7 @@ class RelayListener( override fun onEvent(relay: Relay, subscriptionId: String, event: Event, afterEOSE: Boolean) { Log.d("RelayListener", "Received event ${event.toJson()} from subscription $subscriptionId afterEOSE: $afterEOSE") - (event as MetadataEvent).contactMetaData()?.let { metadata -> - metadata.name?.let { name -> - account.name = name - LocalPreferences.saveToEncryptedStorage(account = account, context = NostrSigner.getInstance()) - } - - metadata.profilePicture()?.let { url -> - LocalPreferences.saveProfileUrlToEncryptedStorage(url, account.signer.keyPair.pubKey.toNpub()) - LocalPreferences.setLastMetadataUpdate(NostrSigner.getInstance(), account.signer.keyPair.pubKey.toNpub(), TimeUtils.now()) - onPictureFound(url) - } - } + onReceiveEvent(relay, subscriptionId, event) } override fun onNotify(relay: Relay, description: String) { diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/EditRelaysDialog.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/EditRelaysDialog.kt index acde4774..8d4f1264 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/EditRelaysDialog.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/EditRelaysDialog.kt @@ -45,6 +45,7 @@ import com.greenart7c3.nostrsigner.BuildConfig import com.greenart7c3.nostrsigner.LocalPreferences import com.greenart7c3.nostrsigner.NostrSigner import com.greenart7c3.nostrsigner.R +import com.greenart7c3.nostrsigner.RelayListener import com.greenart7c3.nostrsigner.models.Account import com.greenart7c3.nostrsigner.models.TimeUtils import com.greenart7c3.nostrsigner.relays.AmberListenerSingleton @@ -60,12 +61,15 @@ import com.vitorpamplona.ammolite.relays.Relay import com.vitorpamplona.ammolite.relays.RelayPool import com.vitorpamplona.ammolite.relays.RelaySetupInfo import com.vitorpamplona.ammolite.relays.RelayStats +import com.vitorpamplona.ammolite.relays.TypedFilter +import com.vitorpamplona.ammolite.relays.filters.SincePerRelayFilter import com.vitorpamplona.quartz.crypto.KeyPair import com.vitorpamplona.quartz.encoders.RelayUrlFormatter import com.vitorpamplona.quartz.encoders.toHexKey import com.vitorpamplona.quartz.events.Event import com.vitorpamplona.quartz.signers.NostrSignerInternal import java.util.Base64 +import java.util.UUID import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay @@ -321,18 +325,47 @@ suspend fun onAddRelay( addedWSS, read = true, write = true, - activeTypes = setOf(), + activeTypes = COMMON_FEED_TYPES, forceProxy = if (isPrivateIp) false else account.useProxy, ) RelayPool.addRelay( relay, ) + var filterResult = false + val listener2 = RelayListener( + account, + onReceiveEvent = { _, _, event -> + if (event.kind == 24133 && event.id == signedEvent.id) { + filterResult = true + } + }, + ) + relay.register( + listener2, + ) relay.connect() - delay(2000) + delay(3000) val result = Client.sendAndWaitForResponse( signedEvent = signedEvent, relayList = listOf(RelaySetupInfo(addedWSS, read = true, write = true, setOf())), ) + relay.sendFilter( + UUID.randomUUID().toString().substring(0, 4), + filters = listOf( + TypedFilter( + types = COMMON_FEED_TYPES, + filter = SincePerRelayFilter( + ids = listOf(event.id), + ), + ), + ), + ) + var count = 0 + while (!filterResult && count < 10) { + delay(1000) + count++ + } + AmberListenerSingleton.getListener()?.let { listener -> Client.unsubscribe(listener) } @@ -341,7 +374,7 @@ suspend fun onAddRelay( relay, ) - if (result) { + if (result && filterResult) { relays2.add( RelaySetupInfo( addedWSS, @@ -351,7 +384,13 @@ suspend fun onAddRelay( ), ) onDone() + } else if (!filterResult) { + accountStateViewModel.toast( + context.getString(R.string.relay), + context.getString(R.string.relay_filter_failed), + ) } + textFieldRelay.value = TextFieldValue("") } isLoading.value = false diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index de08382c..94300567 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -427,4 +427,5 @@ %1$s is requiring some permissions, please review them. Always approve this permission %1$s is requiring to sign these events related to %2$s permission. + Relay does not support receiving Bunker events