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.hexToByteArray
import com.vitorpamplona.quartz.encoders.toHexKey
import com.vitorpamplona.quartz.events.AdvertisedRelayListEvent
import com.vitorpamplona.quartz.events.BookmarkListEvent
import com.vitorpamplona.quartz.events.ChannelCreateEvent
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() {
hideDeleteRequestDialog = true
saveable.invalidateData()

View File

@@ -57,28 +57,62 @@ class AdvertisedRelayListEvent(
companion object {
const val KIND = 10002
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)
}
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(
list: List<AdvertisedRelayInfo>,
signer: NostrSigner,
createdAt: Long = TimeUtils.now(),
onReady: (AdvertisedRelayListEvent) -> Unit,
) {
val tags =
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 tags = createTagArray(list)
val msg = ""
signer.sign(createdAt, KIND, tags, msg, onReady)