mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2025-11-10 22:26:56 +01:00
Adds method to create the NIP-65 list
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user