mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2025-06-06 13:59:16 +02:00
Enabling download and creation of NIP-96 file servers.
This commit is contained in:
parent
7e1b1c7d2c
commit
ff94f45d04
@ -2161,17 +2161,6 @@ class Account(
|
|||||||
return LocalCache.getOrCreateAddressableNote(aTag)
|
return LocalCache.getOrCreateAddressableNote(aTag)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getFileServersNote(): AddressableNote {
|
|
||||||
val aTag =
|
|
||||||
ATag(
|
|
||||||
FileServersEvent.KIND,
|
|
||||||
userProfile().pubkeyHex,
|
|
||||||
"",
|
|
||||||
null,
|
|
||||||
)
|
|
||||||
return LocalCache.getOrCreateAddressableNote(aTag)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getBlockList(): PeopleListEvent? {
|
fun getBlockList(): PeopleListEvent? {
|
||||||
return getBlockListNote().event as? PeopleListEvent
|
return getBlockListNote().event as? PeopleListEvent
|
||||||
}
|
}
|
||||||
@ -2180,10 +2169,6 @@ class Account(
|
|||||||
return getMuteListNote().event as? MuteListEvent
|
return getMuteListNote().event as? MuteListEvent
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getFileServersList(): FileServersEvent? {
|
|
||||||
return getFileServersNote().event as? FileServersEvent
|
|
||||||
}
|
|
||||||
|
|
||||||
fun hideWord(word: String) {
|
fun hideWord(word: String) {
|
||||||
val muteList = getMuteList()
|
val muteList = getMuteList()
|
||||||
|
|
||||||
@ -2688,10 +2673,7 @@ class Account(
|
|||||||
fun saveSearchRelayList(searchRelays: List<String>) {
|
fun saveSearchRelayList(searchRelays: List<String>) {
|
||||||
if (!isWriteable()) return
|
if (!isWriteable()) return
|
||||||
|
|
||||||
val relayListForSearch =
|
val relayListForSearch = getSearchRelayList()
|
||||||
LocalCache.getOrCreateAddressableNote(
|
|
||||||
SearchRelayListEvent.createAddressATag(signer.pubKey),
|
|
||||||
).event as? SearchRelayListEvent
|
|
||||||
|
|
||||||
if (relayListForSearch != null && relayListForSearch.tags.isNotEmpty()) {
|
if (relayListForSearch != null && relayListForSearch.tags.isNotEmpty()) {
|
||||||
SearchRelayListEvent.updateRelayList(
|
SearchRelayListEvent.updateRelayList(
|
||||||
@ -2730,10 +2712,7 @@ class Account(
|
|||||||
fun sendNip65RelayList(relays: List<AdvertisedRelayListEvent.AdvertisedRelayInfo>) {
|
fun sendNip65RelayList(relays: List<AdvertisedRelayListEvent.AdvertisedRelayInfo>) {
|
||||||
if (!isWriteable()) return
|
if (!isWriteable()) return
|
||||||
|
|
||||||
val nip65RelayList =
|
val nip65RelayList = getNIP65RelayList()
|
||||||
LocalCache.getOrCreateAddressableNote(
|
|
||||||
AdvertisedRelayListEvent.createAddressATag(signer.pubKey),
|
|
||||||
).event as? AdvertisedRelayListEvent
|
|
||||||
|
|
||||||
if (nip65RelayList != null) {
|
if (nip65RelayList != null) {
|
||||||
AdvertisedRelayListEvent.updateRelayList(
|
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() {
|
fun setHideDeleteRequestDialog() {
|
||||||
hideDeleteRequestDialog = true
|
hideDeleteRequestDialog = true
|
||||||
saveable.invalidateData()
|
saveable.invalidateData()
|
||||||
|
@ -45,6 +45,7 @@ import com.vitorpamplona.quartz.events.DraftEvent
|
|||||||
import com.vitorpamplona.quartz.events.EmojiPackSelectionEvent
|
import com.vitorpamplona.quartz.events.EmojiPackSelectionEvent
|
||||||
import com.vitorpamplona.quartz.events.Event
|
import com.vitorpamplona.quartz.events.Event
|
||||||
import com.vitorpamplona.quartz.events.EventInterface
|
import com.vitorpamplona.quartz.events.EventInterface
|
||||||
|
import com.vitorpamplona.quartz.events.FileServersEvent
|
||||||
import com.vitorpamplona.quartz.events.GenericRepostEvent
|
import com.vitorpamplona.quartz.events.GenericRepostEvent
|
||||||
import com.vitorpamplona.quartz.events.GiftWrapEvent
|
import com.vitorpamplona.quartz.events.GiftWrapEvent
|
||||||
import com.vitorpamplona.quartz.events.GitIssueEvent
|
import com.vitorpamplona.quartz.events.GitIssueEvent
|
||||||
@ -123,6 +124,7 @@ object NostrAccountDataSource : NostrDataSource("AccountData") {
|
|||||||
AdvertisedRelayListEvent.KIND,
|
AdvertisedRelayListEvent.KIND,
|
||||||
ChatMessageRelayListEvent.KIND,
|
ChatMessageRelayListEvent.KIND,
|
||||||
SearchRelayListEvent.KIND,
|
SearchRelayListEvent.KIND,
|
||||||
|
FileServersEvent.KIND,
|
||||||
MuteListEvent.KIND,
|
MuteListEvent.KIND,
|
||||||
PeopleListEvent.KIND,
|
PeopleListEvent.KIND,
|
||||||
),
|
),
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
package com.vitorpamplona.quartz.events
|
package com.vitorpamplona.quartz.events
|
||||||
|
|
||||||
import androidx.compose.runtime.Immutable
|
import androidx.compose.runtime.Immutable
|
||||||
|
import com.vitorpamplona.quartz.encoders.ATag
|
||||||
import com.vitorpamplona.quartz.encoders.HexKey
|
import com.vitorpamplona.quartz.encoders.HexKey
|
||||||
import com.vitorpamplona.quartz.signers.NostrSigner
|
import com.vitorpamplona.quartz.signers.NostrSigner
|
||||||
import com.vitorpamplona.quartz.utils.TimeUtils
|
import com.vitorpamplona.quartz.utils.TimeUtils
|
||||||
@ -36,24 +37,68 @@ class FileServersEvent(
|
|||||||
) : BaseAddressableEvent(id, pubKey, createdAt, KIND, tags, content, sig) {
|
) : BaseAddressableEvent(id, pubKey, createdAt, KIND, tags, content, sig) {
|
||||||
override fun dTag() = FIXED_D_TAG
|
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 {
|
companion object {
|
||||||
const val KIND = 10096
|
const val KIND = 10096
|
||||||
const val FIXED_D_TAG = ""
|
const val FIXED_D_TAG = ""
|
||||||
const val ALT = "File servers used by the author"
|
const val ALT = "File servers used by the author"
|
||||||
|
|
||||||
fun create(
|
fun createAddressATag(pubKey: HexKey): ATag {
|
||||||
listOfServers: List<String>,
|
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,
|
signer: NostrSigner,
|
||||||
createdAt: Long = TimeUtils.now(),
|
createdAt: Long = TimeUtils.now(),
|
||||||
onReady: (FileServersEvent) -> Unit,
|
onReady: (FileServersEvent) -> Unit,
|
||||||
) {
|
) {
|
||||||
val msg = ""
|
val tags =
|
||||||
val tags = mutableListOf<Array<String>>()
|
earlierVersion.tags.filter { it[0] != "server" }.plus(
|
||||||
|
relays.map {
|
||||||
|
arrayOf("server", it)
|
||||||
|
},
|
||||||
|
).toTypedArray()
|
||||||
|
|
||||||
listOfServers.forEach { tags.add(arrayOf("server", it)) }
|
signer.sign(createdAt, KIND, tags, earlierVersion.content, onReady)
|
||||||
tags.add(arrayOf("alt", ALT))
|
}
|
||||||
|
|
||||||
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user