Enabling download and creation of NIP-96 file servers.

This commit is contained in:
Vitor Pamplona 2024-05-30 09:38:33 -04:00
parent 7e1b1c7d2c
commit ff94f45d04
3 changed files with 93 additions and 30 deletions

View File

@ -2161,17 +2161,6 @@ class Account(
return LocalCache.getOrCreateAddressableNote(aTag)
}
fun getFileServersNote(): AddressableNote {
val aTag =
ATag(
FileServersEvent.KIND,
userProfile().pubkeyHex,
"",
null,
)
return LocalCache.getOrCreateAddressableNote(aTag)
}
fun getBlockList(): PeopleListEvent? {
return getBlockListNote().event as? PeopleListEvent
}
@ -2180,10 +2169,6 @@ class Account(
return getMuteListNote().event as? MuteListEvent
}
fun getFileServersList(): FileServersEvent? {
return getFileServersNote().event as? FileServersEvent
}
fun hideWord(word: String) {
val muteList = getMuteList()
@ -2688,10 +2673,7 @@ class Account(
fun saveSearchRelayList(searchRelays: List<String>) {
if (!isWriteable()) return
val relayListForSearch =
LocalCache.getOrCreateAddressableNote(
SearchRelayListEvent.createAddressATag(signer.pubKey),
).event as? SearchRelayListEvent
val relayListForSearch = getSearchRelayList()
if (relayListForSearch != null && relayListForSearch.tags.isNotEmpty()) {
SearchRelayListEvent.updateRelayList(
@ -2730,10 +2712,7 @@ class Account(
fun sendNip65RelayList(relays: List<AdvertisedRelayListEvent.AdvertisedRelayInfo>) {
if (!isWriteable()) return
val nip65RelayList =
LocalCache.getOrCreateAddressableNote(
AdvertisedRelayListEvent.createAddressATag(signer.pubKey),
).event as? AdvertisedRelayListEvent
val nip65RelayList = getNIP65RelayList()
if (nip65RelayList != null) {
AdvertisedRelayListEvent.updateRelayList(
@ -2755,6 +2734,43 @@ class Account(
}
}
fun getFileServersList(): FileServersEvent? {
return getFileServersNote().event as? FileServersEvent
}
fun getFileServersListFlow(): StateFlow<NoteState> {
return getFileServersNote().flow().metadata.stateFlow
}
fun getFileServersNote(): AddressableNote {
return LocalCache.getOrCreateAddressableNote(FileServersEvent.createAddressATag(userProfile().pubkeyHex))
}
fun sendFileServersList(servers: List<String>) {
if (!isWriteable()) return
val serverList = getFileServersList()
if (serverList != null && serverList.tags.isNotEmpty()) {
FileServersEvent.updateRelayList(
earlierVersion = serverList,
relays = servers,
signer = signer,
) {
Client.send(it)
LocalCache.justConsume(it, null)
}
} else {
FileServersEvent.createFromScratch(
relays = servers,
signer = signer,
) {
Client.send(it)
LocalCache.justConsume(it, null)
}
}
}
fun setHideDeleteRequestDialog() {
hideDeleteRequestDialog = true
saveable.invalidateData()

View File

@ -45,6 +45,7 @@ import com.vitorpamplona.quartz.events.DraftEvent
import com.vitorpamplona.quartz.events.EmojiPackSelectionEvent
import com.vitorpamplona.quartz.events.Event
import com.vitorpamplona.quartz.events.EventInterface
import com.vitorpamplona.quartz.events.FileServersEvent
import com.vitorpamplona.quartz.events.GenericRepostEvent
import com.vitorpamplona.quartz.events.GiftWrapEvent
import com.vitorpamplona.quartz.events.GitIssueEvent
@ -123,6 +124,7 @@ object NostrAccountDataSource : NostrDataSource("AccountData") {
AdvertisedRelayListEvent.KIND,
ChatMessageRelayListEvent.KIND,
SearchRelayListEvent.KIND,
FileServersEvent.KIND,
MuteListEvent.KIND,
PeopleListEvent.KIND,
),

View File

@ -21,6 +21,7 @@
package com.vitorpamplona.quartz.events
import androidx.compose.runtime.Immutable
import com.vitorpamplona.quartz.encoders.ATag
import com.vitorpamplona.quartz.encoders.HexKey
import com.vitorpamplona.quartz.signers.NostrSigner
import com.vitorpamplona.quartz.utils.TimeUtils
@ -36,24 +37,68 @@ class FileServersEvent(
) : BaseAddressableEvent(id, pubKey, createdAt, KIND, tags, content, sig) {
override fun dTag() = FIXED_D_TAG
fun servers(): List<String> {
return tags.mapNotNull {
if (it.size > 1 && it[0] == "relay") {
it[1]
} else {
null
}
}
}
companion object {
const val KIND = 10096
const val FIXED_D_TAG = ""
const val ALT = "File servers used by the author"
fun create(
listOfServers: List<String>,
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 createTagArray(servers: List<String>): Array<Array<String>> {
return servers.map {
arrayOf("server", it)
}.plusElement(arrayOf("alt", "Relay list to use for Search")).toTypedArray()
}
fun updateRelayList(
earlierVersion: FileServersEvent,
relays: List<String>,
signer: NostrSigner,
createdAt: Long = TimeUtils.now(),
onReady: (FileServersEvent) -> Unit,
) {
val msg = ""
val tags = mutableListOf<Array<String>>()
val tags =
earlierVersion.tags.filter { it[0] != "server" }.plus(
relays.map {
arrayOf("server", it)
},
).toTypedArray()
listOfServers.forEach { tags.add(arrayOf("server", it)) }
tags.add(arrayOf("alt", ALT))
signer.sign(createdAt, KIND, tags, earlierVersion.content, onReady)
}
signer.sign(createdAt, KIND, tags.toTypedArray(), msg, onReady)
fun createFromScratch(
relays: List<String>,
signer: NostrSigner,
createdAt: Long = TimeUtils.now(),
onReady: (FileServersEvent) -> Unit,
) {
create(relays, signer, createdAt, onReady)
}
fun create(
servers: List<String>,
signer: NostrSigner,
createdAt: Long = TimeUtils.now(),
onReady: (FileServersEvent) -> Unit,
) {
signer.sign(createdAt, KIND, createTagArray(servers), "", onReady)
}
}
}