Adds method to create the NIP-65 list

This commit is contained in:
Vitor Pamplona
2024-05-22 18:23:52 -04:00
parent 11fa762028
commit c78c00acd9
2 changed files with 75 additions and 12 deletions

View File

@@ -47,6 +47,7 @@ import com.vitorpamplona.quartz.encoders.HexKey
import com.vitorpamplona.quartz.encoders.Nip47WalletConnect import com.vitorpamplona.quartz.encoders.Nip47WalletConnect
import com.vitorpamplona.quartz.encoders.hexToByteArray import com.vitorpamplona.quartz.encoders.hexToByteArray
import com.vitorpamplona.quartz.encoders.toHexKey import com.vitorpamplona.quartz.encoders.toHexKey
import com.vitorpamplona.quartz.events.AdvertisedRelayListEvent
import com.vitorpamplona.quartz.events.BookmarkListEvent import com.vitorpamplona.quartz.events.BookmarkListEvent
import com.vitorpamplona.quartz.events.ChannelCreateEvent import com.vitorpamplona.quartz.events.ChannelCreateEvent
import com.vitorpamplona.quartz.events.ChannelMessageEvent import com.vitorpamplona.quartz.events.ChannelMessageEvent
@@ -2580,6 +2581,34 @@ class Account(
} }
} }
fun sendNip65RelayList(relays: List<AdvertisedRelayListEvent.AdvertisedRelayInfo>) {
if (!isWriteable()) return
val nip65RelayList =
LocalCache.getOrCreateAddressableNote(
AdvertisedRelayListEvent.createAddressATag(signer.pubKey),
).event as? AdvertisedRelayListEvent
if (nip65RelayList != null) {
AdvertisedRelayListEvent.updateRelayList(
earlierVersion = nip65RelayList,
relays = relays,
signer = signer,
) {
Client.send(it)
LocalCache.justConsume(it, null)
}
} else {
AdvertisedRelayListEvent.createFromScratch(
relays = relays,
signer = signer,
) {
Client.send(it)
LocalCache.justConsume(it, null)
}
}
}
fun setHideDeleteRequestDialog() { fun setHideDeleteRequestDialog() {
hideDeleteRequestDialog = true hideDeleteRequestDialog = true
saveable.invalidateData() saveable.invalidateData()

View File

@@ -57,28 +57,62 @@ class AdvertisedRelayListEvent(
companion object { companion object {
const val KIND = 10002 const val KIND = 10002
const val FIXED_D_TAG = "" const val FIXED_D_TAG = ""
const val ALT = "Relay list to discover the user's content"
fun createAddressTag(pubKey: HexKey): ATag { fun createAddressATag(pubKey: HexKey): ATag {
return ATag(KIND, pubKey, FIXED_D_TAG, null) return ATag(KIND, pubKey, FIXED_D_TAG, null)
} }
fun createAddressTag(pubKey: HexKey): String {
return ATag.assembleATag(KIND, pubKey, FIXED_D_TAG)
}
fun updateRelayList(
earlierVersion: AdvertisedRelayListEvent,
relays: List<AdvertisedRelayInfo>,
signer: NostrSigner,
createdAt: Long = TimeUtils.now(),
onReady: (AdvertisedRelayListEvent) -> Unit,
) {
val tags =
earlierVersion.tags.filter { it[0] != "r" }.plus(
relays.map(::createRelayTag),
).toTypedArray()
signer.sign(createdAt, KIND, tags, earlierVersion.content, onReady)
}
fun createFromScratch(
relays: List<AdvertisedRelayInfo>,
signer: NostrSigner,
createdAt: Long = TimeUtils.now(),
onReady: (AdvertisedRelayListEvent) -> Unit,
) {
create(relays, signer, createdAt, onReady)
}
fun createRelayTag(relay: AdvertisedRelayInfo): Array<String> {
return if (relay.type == AdvertisedRelayType.BOTH) {
arrayOf("r", relay.relayUrl)
} else {
arrayOf("r", relay.relayUrl, relay.type.code)
}
}
fun createTagArray(relays: List<AdvertisedRelayInfo>): Array<Array<String>> {
return relays
.map(::createRelayTag)
.plusElement(arrayOf("alt", ALT))
.toTypedArray()
}
fun create( fun create(
list: List<AdvertisedRelayInfo>, list: List<AdvertisedRelayInfo>,
signer: NostrSigner, signer: NostrSigner,
createdAt: Long = TimeUtils.now(), createdAt: Long = TimeUtils.now(),
onReady: (AdvertisedRelayListEvent) -> Unit, onReady: (AdvertisedRelayListEvent) -> Unit,
) { ) {
val tags = val tags = createTagArray(list)
list
.map {
if (it.type == AdvertisedRelayType.BOTH) {
arrayOf(it.relayUrl)
} else {
arrayOf(it.relayUrl, it.type.code)
}
}
.plusElement(arrayOf("alt", "Relay list event with ${list.size} relays"))
.toTypedArray()
val msg = "" val msg = ""
signer.sign(createdAt, KIND, tags, msg, onReady) signer.sign(createdAt, KIND, tags, msg, onReady)