From 2beed5e18af03751f1a7a40ff9bbf130b08da0f3 Mon Sep 17 00:00:00 2001 From: Kgothatso Ngako Date: Tue, 31 Mar 2026 13:44:45 +0200 Subject: [PATCH] Have FilterArray.kt in persisted sync event --- .../1.json | 48 ++------ .../compose/database/converters/Converters.kt | 28 +++++ .../ac/aux/compose/database/dao/NostrDao.kt | 21 +++- .../ac/aux/compose/database/model/Profile.kt | 1 + .../model/SynchronizeNostrEventRequest.kt | 31 ++--- .../model/intermdiate/LocalProfile.kt | 2 +- .../database/model/typealiases/FilterArray.kt | 5 + .../compose/network/NostrEventBroadcaster.kt | 113 ++++++++++-------- .../ui/view/model/FeedListViewModel.kt | 33 ++++- .../ui/view/model/NavigationViewModel.kt | 12 +- ...UnqueuedProfileSynchronizationViewModel.kt | 10 +- 11 files changed, 165 insertions(+), 139 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/typealiases/FilterArray.kt diff --git a/composeApp/schemas/ac.aux.compose.database.AuxDatabase/1.json b/composeApp/schemas/ac.aux.compose.database.AuxDatabase/1.json index 3f8ff5dc..8e8d0321 100644 --- a/composeApp/schemas/ac.aux.compose.database.AuxDatabase/1.json +++ b/composeApp/schemas/ac.aux.compose.database.AuxDatabase/1.json @@ -2,7 +2,7 @@ "formatVersion": 1, "database": { "version": 1, - "identityHash": "40dc44925e9b6000404e2cc5e781e4c2", + "identityHash": "ba8dabe94c38a3823b4803dc0a6051ca", "entities": [ { "tableName": "BroadcastNostrEventReceipt", @@ -873,7 +873,7 @@ }, { "tableName": "SynchronizeNostrEventRequest", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `status` TEXT NOT NULL, `relayURL` TEXT NOT NULL, `eventIds` TEXT, `authorPublicKeys` TEXT, `kinds` TEXT, `tagName` TEXT, `since` INTEGER, `until` INTEGER, `limit` INTEGER, `search` TEXT, `nostrEventId` TEXT, `unsignedNostrEventId` INTEGER, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`nostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`unsignedNostrEventId`) REFERENCES `UnsignedNostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `status` TEXT NOT NULL, `relayURL` TEXT NOT NULL, `filters` TEXT NOT NULL, `nostrEventId` TEXT, `unsignedNostrEventId` INTEGER, `createdAt` INTEGER NOT NULL, `updatedAt` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`nostrEventId`) REFERENCES `NostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`unsignedNostrEventId`) REFERENCES `UnsignedNostrEvent`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", "fields": [ { "fieldPath": "id", @@ -894,44 +894,10 @@ "notNull": true }, { - "fieldPath": "eventIds", - "columnName": "eventIds", - "affinity": "TEXT" - }, - { - "fieldPath": "authorPublicKeys", - "columnName": "authorPublicKeys", - "affinity": "TEXT" - }, - { - "fieldPath": "kinds", - "columnName": "kinds", - "affinity": "TEXT" - }, - { - "fieldPath": "tagName", - "columnName": "tagName", - "affinity": "TEXT" - }, - { - "fieldPath": "since", - "columnName": "since", - "affinity": "INTEGER" - }, - { - "fieldPath": "until", - "columnName": "until", - "affinity": "INTEGER" - }, - { - "fieldPath": "limit", - "columnName": "limit", - "affinity": "INTEGER" - }, - { - "fieldPath": "search", - "columnName": "search", - "affinity": "TEXT" + "fieldPath": "filters", + "columnName": "filters", + "affinity": "TEXT", + "notNull": true }, { "fieldPath": "nostrEventId", @@ -1340,7 +1306,7 @@ ], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '40dc44925e9b6000404e2cc5e781e4c2')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'ba8dabe94c38a3823b4803dc0a6051ca')" ] } } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/converters/Converters.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/converters/Converters.kt index f17ad46a..2a3a008a 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/converters/Converters.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/converters/Converters.kt @@ -1,11 +1,15 @@ package ac.aux.compose.database.converters +import ac.aux.compose.database.model.typealiases.FilterArray import ac.aux.compose.database.model.typealiases.HexArray import ac.aux.compose.database.model.typealiases.KindArray import androidx.room.TypeConverter import co.touchlab.kermit.Logger +import com.vitorpamplona.quartz.nip01Core.core.OptimizedJsonMapper import com.vitorpamplona.quartz.nip01Core.core.TagArray +import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonArray import kotlin.time.Instant class AuxConverters { @@ -73,4 +77,28 @@ class AuxConverters { logger.e("Failed to convert to KindArray $value", e) return null } + + @TypeConverter + fun fromFilterArray(value: FilterArray?): String? = try { + return value?.let { filterArray -> + Json.encodeToString( + filterArray.map { filter -> + OptimizedJsonMapper.toJson(filter) + } + ) + } + } catch (e: Throwable) { + logger.e("Failed to convert from FilterArray $value", e) + return null + } + + @TypeConverter + fun toFilterArray(value: String?): FilterArray? = try { + return value?.let { + Json.decodeFromString(it) + } + } catch (e: Throwable) { + logger.e("Failed to convert to FilterArray $value", e) + return null + } } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/dao/NostrDao.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/dao/NostrDao.kt index 0108817a..11e53233 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/dao/NostrDao.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/dao/NostrDao.kt @@ -14,6 +14,7 @@ import androidx.room.Relation import androidx.room.Transaction import co.touchlab.kermit.Logger import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent +import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import kotlinx.coroutines.delay import kotlin.time.Clock @@ -109,8 +110,12 @@ abstract class NostrDao( logger.i("Sync Profile with PubKey: ${nostrEvent.pubKey}") database.synchronizeNostrEventRequestDao().upsert( SynchronizeNostrEventRequest( - authorPublicKeys = arrayOf(nostrEvent.pubKey), - kinds = arrayOf(0), + filters = arrayOf( + Filter( + authors = listOf(nostrEvent.pubKey), + kinds = listOf(MetadataEvent.KIND) + ) + ), relayURL = synchronizationRelayURL ) ) @@ -150,7 +155,11 @@ abstract class NostrDao( synchronizationRelayURLs.forEach { synchronizationRelayURL -> database.synchronizeNostrEventRequestDao().upsert( SynchronizeNostrEventRequest( - eventIds = arrayOf(post.replyToId), + filters = arrayOf( + Filter( + ids = listOf(post.replyToId) + ) + ), relayURL = synchronizationRelayURL ) ) @@ -175,7 +184,11 @@ abstract class NostrDao( synchronizationRelayURLs.forEach { synchronizationRelayURL -> database.synchronizeNostrEventRequestDao().upsert( SynchronizeNostrEventRequest( - eventIds = arrayOf(post.repostId), + filters = arrayOf( + Filter( + ids = listOf(post.repostId) + ) + ), relayURL = synchronizationRelayURL ) ) diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Profile.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Profile.kt index 3714bc45..323908bd 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Profile.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/Profile.kt @@ -26,6 +26,7 @@ import kotlin.time.Instant Index("nostrEventId"), ], ) + data class Profile( @PrimaryKey val publicKey: String, diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/SynchronizeNostrEventRequest.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/SynchronizeNostrEventRequest.kt index 60745f77..64391144 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/SynchronizeNostrEventRequest.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/SynchronizeNostrEventRequest.kt @@ -3,6 +3,7 @@ package ac.aux.compose.database.model import ac.aux.compose.database.model.traits.OptionalNostrEventEntity import ac.aux.compose.database.model.traits.TimestampedEntity import ac.aux.compose.database.model.traits.UnsignedNostrEventEntity +import ac.aux.compose.database.model.typealiases.FilterArray import ac.aux.compose.database.model.typealiases.HexArray import ac.aux.compose.database.model.typealiases.KindArray import androidx.room.Entity @@ -10,6 +11,7 @@ import androidx.room.ForeignKey import androidx.room.Index import androidx.room.PrimaryKey import com.vitorpamplona.quartz.nip01Core.core.HexKey +import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import kotlin.time.Clock import kotlin.time.Instant import kotlin.uuid.ExperimentalUuidApi @@ -41,14 +43,8 @@ data class SynchronizeNostrEventRequest( val id: String = Uuid.generateV4().toHexDashString(), val status: String = "pending", val relayURL: String, - val eventIds: HexArray? = null, - val authorPublicKeys: HexArray? = null, // TODO: PublicKeyArray - val kinds: KindArray? = null, // TODO: KindArray - val tagName: String? = null, - val since: Instant? = null, - val until: Instant? = null, - val limit: Int? = null, - val search: String? = null, + + val filters: FilterArray, override val nostrEventId: HexKey? = null, override val unsignedNostrEventId: Long? = null, @@ -61,17 +57,11 @@ data class SynchronizeNostrEventRequest( other as SynchronizeNostrEventRequest - if (limit != other.limit) return false if (unsignedNostrEventId != other.unsignedNostrEventId) return false if (id != other.id) return false if (status != other.status) return false if (relayURL != other.relayURL) return false - if (!eventIds.contentEquals(other.eventIds)) return false - if (!authorPublicKeys.contentEquals(other.authorPublicKeys)) return false - if (!kinds.contentEquals(other.kinds)) return false - if (tagName != other.tagName) return false - if (since != other.since) return false - if (until != other.until) return false + if (!filters.contentEquals(other.filters)) return false if (nostrEventId != other.nostrEventId) return false if (createdAt != other.createdAt) return false if (updatedAt != other.updatedAt) return false @@ -80,20 +70,15 @@ data class SynchronizeNostrEventRequest( } override fun hashCode(): Int { - var result = limit?.hashCode() ?: 0 - result = 31 * result + (unsignedNostrEventId?.hashCode() ?: 0) + var result = unsignedNostrEventId?.hashCode() ?: 0 result = 31 * result + id.hashCode() result = 31 * result + status.hashCode() result = 31 * result + relayURL.hashCode() - result = 31 * result + (eventIds?.contentHashCode() ?: 0) - result = 31 * result + (authorPublicKeys?.contentHashCode() ?: 0) - result = 31 * result + (kinds?.contentHashCode() ?: 0) - result = 31 * result + (tagName?.hashCode() ?: 0) - result = 31 * result + (since?.hashCode() ?: 0) - result = 31 * result + (until?.hashCode() ?: 0) + result = 31 * result + filters.contentHashCode() result = 31 * result + (nostrEventId?.hashCode() ?: 0) result = 31 * result + createdAt.hashCode() result = 31 * result + updatedAt.hashCode() return result } + } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/intermdiate/LocalProfile.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/intermdiate/LocalProfile.kt index e8384317..2685a116 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/intermdiate/LocalProfile.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/intermdiate/LocalProfile.kt @@ -42,4 +42,4 @@ data class LocalProfile( ) val synchronizeNostrEventRequests: List, - ) +) diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/typealiases/FilterArray.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/typealiases/FilterArray.kt new file mode 100644 index 00000000..c359aa1e --- /dev/null +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/database/model/typealiases/FilterArray.kt @@ -0,0 +1,5 @@ +package ac.aux.compose.database.model.typealiases + +import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter + +typealias FilterArray = Array \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/network/NostrEventBroadcaster.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/network/NostrEventBroadcaster.kt index e18ea647..83be18a1 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/network/NostrEventBroadcaster.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/network/NostrEventBroadcaster.kt @@ -58,78 +58,85 @@ class NostrEventBroadcaster( } scope.launch { - val webSocketSession = httpClient.webSocketSession( - urlString = localBroadcastNostrEventRequest.broadcastNostrEventRequest.relayURL - ) + try { + val webSocketSession = httpClient.webSocketSession( + urlString = localBroadcastNostrEventRequest.broadcastNostrEventRequest.relayURL + ) - broadcastingJobs[localBroadcastNostrEventRequest.broadcastNostrEventRequest.relayURL] = scope.launch { - val message = OptimizedJsonMapper.toJson( - EventCmd( - event + broadcastingJobs[localBroadcastNostrEventRequest.broadcastNostrEventRequest.relayURL] = scope.launch { + val message = OptimizedJsonMapper.toJson( + EventCmd( + event + ) + ) + logger.d("Broadcasting (${localBroadcastNostrEventRequest.broadcastNostrEventRequest.relayURL}): $message") + webSocketSession.send( + frame = Frame.Text(message) ) - ) - logger.d("Broadcasting (${localBroadcastNostrEventRequest.broadcastNostrEventRequest.relayURL}): $message") - webSocketSession.send( - frame = Frame.Text(message) - ) - onBroadcastRequestProcessed.invoke(localBroadcastNostrEventRequest.broadcastNostrEventRequest) + onBroadcastRequestProcessed.invoke(localBroadcastNostrEventRequest.broadcastNostrEventRequest) - webSocketSession.incoming.consumeAsFlow().collect { frame -> - when(frame) { - is Frame.Text -> { - frame.readText().let { text -> - try { - logger.d("WebSocket Read Text: $text") - val result = Json.decodeFromString(text) + webSocketSession.incoming.consumeAsFlow().collect { frame -> + when(frame) { + is Frame.Text -> { + frame.readText().let { text -> + try { + logger.d("WebSocket Read Text: $text") + val result = Json.decodeFromString(text) - if (result.firstOrNull()?.text == "OK") { - result.getOrNull(1)?.text?.let { eventId -> - if (eventId == localBroadcastNostrEventRequest.broadcastNostrEventRequest.nostrEventId) { + if (result.firstOrNull()?.text == "OK") { + result.getOrNull(1)?.text?.let { eventId -> + if (eventId == localBroadcastNostrEventRequest.broadcastNostrEventRequest.nostrEventId) { - onBroadcastReceipt.invoke( - BroadcastNostrEventReceipt( - nostrEventId = localBroadcastNostrEventRequest.broadcastNostrEventRequest.nostrEventId, - unsignedNostrEventId = localBroadcastNostrEventRequest.broadcastNostrEventRequest.unsignedNostrEventId, - messages = result.getOrNull(3)?.text, - isAccepted = result.getOrNull(2)?.text == "true", - relayURL = localBroadcastNostrEventRequest.broadcastNostrEventRequest.relayURL + onBroadcastReceipt.invoke( + BroadcastNostrEventReceipt( + nostrEventId = localBroadcastNostrEventRequest.broadcastNostrEventRequest.nostrEventId, + unsignedNostrEventId = localBroadcastNostrEventRequest.broadcastNostrEventRequest.unsignedNostrEventId, + messages = result.getOrNull(3)?.text, + isAccepted = result.getOrNull(2)?.text == "true", + relayURL = localBroadcastNostrEventRequest.broadcastNostrEventRequest.relayURL + ) ) - ) + } } } + } catch (e: Throwable) { + logger.e("Error processing receipt: $text", e) } - } catch (e: Throwable) { - logger.e("Error processing receipt: $text", e) + } + webSocketSession.close() + broadcastingJobs.remove(localBroadcastNostrEventRequest.broadcastNostrEventRequest.relayURL)?.let { job -> + job.cancel() } } - webSocketSession.close() - broadcastingJobs.remove(localBroadcastNostrEventRequest.broadcastNostrEventRequest.relayURL)?.let { job -> - job.cancel() + is Frame.Close -> { + logger.d("Close $frame") + } + is Frame.Ping -> { + logger.d("Ping: $frame") + } + is Frame.Pong -> { + logger.d("Pong: $frame") + } + is Frame.Binary -> { + logger.d("Binary Message: $frame") + } + else -> { + logger.d("Unsupported frame: $frame") } } - is Frame.Close -> { - logger.d("Close $frame") - } - is Frame.Ping -> { - logger.d("Ping: $frame") - } - is Frame.Pong -> { - logger.d("Pong: $frame") - } - is Frame.Binary -> { - logger.d("Binary Message: $frame") - } - else -> { - logger.d("Unsupported frame: $frame") - } } + + logger.i("Websocket exit") } - logger.i("Websocket exit") + broadcastingJobs[localBroadcastNostrEventRequest.broadcastNostrEventRequest.relayURL]?.join() + } catch (e: Throwable) { + logger.e("Error broadcasting event: ", e) + // TODO: Save this a failure + onBroadcastRequestProcessed.invoke(localBroadcastNostrEventRequest.broadcastNostrEventRequest) } - broadcastingJobs[localBroadcastNostrEventRequest.broadcastNostrEventRequest.relayURL]?.join() } } } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/ui/view/model/FeedListViewModel.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/ui/view/model/FeedListViewModel.kt index 650396fd..77e42584 100755 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/ui/view/model/FeedListViewModel.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/ui/view/model/FeedListViewModel.kt @@ -1,5 +1,6 @@ package ac.aux.compose.ui.view.model +import ac.aux.compose.managers.SeedManager import ac.aux.compose.repository.NostrRepository import ac.aux.compose.ui.view.state.FeedListUIState import androidx.compose.runtime.getValue @@ -10,8 +11,15 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory +import com.vitorpamplona.quartz.nip01Core.core.toHexKey +import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter +import com.vitorpamplona.quartz.nip10Notes.TextNoteEvent +import com.vitorpamplona.quartz.nip18Reposts.RepostEvent +import com.vitorpamplona.quartz.nip25Reactions.ReactionEvent +import com.vitorpamplona.quartz.nip57Zaps.LnZapEvent import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.IO +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.launch class FeedListViewModel( @@ -28,11 +36,28 @@ class FeedListViewModel( fun loadNostrFeed() { viewModelScope.launch(Dispatchers.IO) { - val nostrFeed = nostrRepository.loadNostrFeed() - - feedListUIState = FeedListUIState.Loaded( - nostrEvents = nostrFeed + Filter( + kinds = listOf( + TextNoteEvent.KIND, + RepostEvent.KIND, + ReactionEvent.KIND, + LnZapEvent.KIND, + ), + tags = mapOf( + Pair("#p", listOf(SeedManager.activePublicKey().toHexKey())) + ) ) + val localProfile = nostrRepository.observeProfile(SeedManager.activePublicKey().toHexKey()).firstOrNull() + + if (localProfile?.profile == null) { + feedListUIState = FeedListUIState.Error + } else { + val nostrFeed = nostrRepository.loadNostrFeed() + + feedListUIState = FeedListUIState.Loaded( + nostrEvents = nostrFeed + ) + } } } diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/ui/view/model/NavigationViewModel.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/ui/view/model/NavigationViewModel.kt index 7a5e23ea..a4609088 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/ui/view/model/NavigationViewModel.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/ui/view/model/NavigationViewModel.kt @@ -147,17 +147,7 @@ class NavigationViewModel( logger.i("synchronizeNostrEventRequest: $synchronizeNostrEventRequest") val reqCommand = ReqCmd( subId = synchronizeNostrEventRequest.id, - filters = listOf( - Filter( - ids = synchronizeNostrEventRequest.eventIds?.map { eventId -> eventId }, - authors = synchronizeNostrEventRequest.authorPublicKeys?.map { authorPublicKey -> authorPublicKey }, - kinds = synchronizeNostrEventRequest.kinds?.map { kind -> kind }, - since = synchronizeNostrEventRequest.since?.epochSeconds, - until = synchronizeNostrEventRequest.until?.epochSeconds, - limit = synchronizeNostrEventRequest.limit, - search = synchronizeNostrEventRequest.search - ) - ) + filters = synchronizeNostrEventRequest.filters.toList() ) scope.launch { diff --git a/composeApp/src/commonMain/kotlin/ac/aux/compose/ui/view/model/UnqueuedProfileSynchronizationViewModel.kt b/composeApp/src/commonMain/kotlin/ac/aux/compose/ui/view/model/UnqueuedProfileSynchronizationViewModel.kt index eb1bc24f..b4d2401b 100644 --- a/composeApp/src/commonMain/kotlin/ac/aux/compose/ui/view/model/UnqueuedProfileSynchronizationViewModel.kt +++ b/composeApp/src/commonMain/kotlin/ac/aux/compose/ui/view/model/UnqueuedProfileSynchronizationViewModel.kt @@ -13,6 +13,8 @@ import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory import androidx.lifecycle.viewModelScope import co.touchlab.kermit.Logger +import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent +import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip19Bech32.Nip19Parser import com.vitorpamplona.quartz.nip19Bech32.entities.Entity import com.vitorpamplona.quartz.nip19Bech32.entities.NPub @@ -58,9 +60,13 @@ class UnqueuedProfileSynchronizationViewModel( nostrRepository.queueSynchronizeNostrEvent( Relays.eventPublishRelaySet.map { normalizedRelayUrl -> SynchronizeNostrEventRequest( - authorPublicKeys = arrayOf(profilePublicKey), + filters = arrayOf( + Filter( + authors = listOf(profilePublicKey), + kinds = listOf(MetadataEvent.KIND) + ) + ), unsignedNostrEventId = unsignedNostrEventId, - kinds = arrayOf(0), relayURL = normalizedRelayUrl.url ) }