From 9e207d0f24cf463eeebbf1a442614302f59d9826 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Sun, 16 Jul 2023 11:50:16 -0400 Subject: [PATCH] Adds parsing support for NNS Events. --- .../amethyst/model/LocalCache.kt | 21 ++++++++++ .../amethyst/service/model/Event.kt | 1 + .../amethyst/service/model/NNSEvent.kt | 40 +++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 app/src/main/java/com/vitorpamplona/amethyst/service/model/NNSEvent.kt diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 499ae56e2..3bf4714a8 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -545,6 +545,26 @@ object LocalCache { refreshObservers(note) } + private fun comsume(event: NNSEvent) { + val version = getOrCreateNote(event.id) + val note = getOrCreateAddressableNote(event.address()) + val author = getOrCreateUser(event.pubKey) + + if (version.event == null) { + version.loadEvent(event, author, emptyList()) + version.moveAllReferencesTo(note) + } + + // Already processed this event. + if (note.event?.id() == event.id()) return + + if (event.createdAt > (note.createdAt() ?: 0)) { + note.loadEvent(event, author, emptyList()) + + refreshObservers(note) + } + } + fun consume(event: AppDefinitionEvent) { val version = getOrCreateNote(event.id) val note = getOrCreateAddressableNote(event.address()) @@ -1335,6 +1355,7 @@ object LocalCache { is LnZapPaymentResponseEvent -> consume(event) is LongTextNoteEvent -> consume(event, relay) is MetadataEvent -> consume(event) + is NNSEvent -> comsume(event) is PrivateDmEvent -> consume(event, relay) is PinListEvent -> consume(event) is PeopleListEvent -> consume(event) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt index 2fa014491..56ac35430 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/Event.kt @@ -288,6 +288,7 @@ open class Event( LnZapRequestEvent.kind -> LnZapRequestEvent(id, pubKey, createdAt, tags, content, sig) LongTextNoteEvent.kind -> LongTextNoteEvent(id, pubKey, createdAt, tags, content, sig) MetadataEvent.kind -> MetadataEvent(id, pubKey, createdAt, tags, content, sig) + NNSEvent.kind -> NNSEvent(id, pubKey, createdAt, tags, content, sig) PeopleListEvent.kind -> PeopleListEvent(id, pubKey, createdAt, tags, content, sig) PinListEvent.kind -> PinListEvent(id, pubKey, createdAt, tags, content, sig) PollNoteEvent.kind -> PollNoteEvent(id, pubKey, createdAt, tags, content, sig) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/NNSEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/NNSEvent.kt new file mode 100644 index 000000000..52d9a9100 --- /dev/null +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/NNSEvent.kt @@ -0,0 +1,40 @@ +package com.vitorpamplona.amethyst.service.model + +import androidx.compose.runtime.Immutable +import com.vitorpamplona.amethyst.model.HexKey +import com.vitorpamplona.amethyst.model.TimeUtils +import com.vitorpamplona.amethyst.model.toHexKey +import nostr.postr.Utils + +@Immutable +class NNSEvent( + id: HexKey, + pubKey: HexKey, + createdAt: Long, + tags: List>, + content: String, + sig: HexKey +) : Event(id, pubKey, createdAt, kind, tags, content, sig), AddressableEvent { + + override fun dTag() = tags.firstOrNull { it.size > 1 && it[0] == "d" }?.get(1) ?: "" + override fun address() = ATag(kind, pubKey, dTag(), null) + + fun ip4() = tags.firstOrNull { it.size > 1 && it[0] == "ip4" }?.get(1) + fun ip6() = tags.firstOrNull { it.size > 1 && it[0] == "ip6" }?.get(1) + fun version() = tags.firstOrNull { it.size > 1 && it[0] == "version" }?.get(1) + + companion object { + const val kind = 30053 + + fun create( + privateKey: ByteArray, + createdAt: Long = TimeUtils.now() + ): NNSEvent { + val tags = mutableListOf>() + val pubKey = Utils.pubkeyCreate(privateKey).toHexKey() + val id = generateId(pubKey, createdAt, kind, tags, "") + val sig = Utils.sign(id, privateKey) + return NNSEvent(id.toHexKey(), pubKey, createdAt, tags, "", sig.toHexKey()) + } + } +}