mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2024-09-30 00:40:49 +00:00
Base support for Relay lists for DMs.
This commit is contained in:
parent
fef635ab39
commit
72018dc208
@ -63,6 +63,7 @@ import com.vitorpamplona.quartz.events.CommunityListEvent
|
|||||||
import com.vitorpamplona.quartz.events.CommunityPostApprovalEvent
|
import com.vitorpamplona.quartz.events.CommunityPostApprovalEvent
|
||||||
import com.vitorpamplona.quartz.events.ContactListEvent
|
import com.vitorpamplona.quartz.events.ContactListEvent
|
||||||
import com.vitorpamplona.quartz.events.DeletionEvent
|
import com.vitorpamplona.quartz.events.DeletionEvent
|
||||||
|
import com.vitorpamplona.quartz.events.DirectMessageRelayListEvent
|
||||||
import com.vitorpamplona.quartz.events.DraftEvent
|
import com.vitorpamplona.quartz.events.DraftEvent
|
||||||
import com.vitorpamplona.quartz.events.EmojiPackEvent
|
import com.vitorpamplona.quartz.events.EmojiPackEvent
|
||||||
import com.vitorpamplona.quartz.events.EmojiPackSelectionEvent
|
import com.vitorpamplona.quartz.events.EmojiPackSelectionEvent
|
||||||
@ -699,6 +700,13 @@ object LocalCache {
|
|||||||
consumeBaseReplaceable(event, relay)
|
consumeBaseReplaceable(event, relay)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun consume(
|
||||||
|
event: DirectMessageRelayListEvent,
|
||||||
|
relay: Relay?,
|
||||||
|
) {
|
||||||
|
consumeBaseReplaceable(event, relay)
|
||||||
|
}
|
||||||
|
|
||||||
private fun consume(
|
private fun consume(
|
||||||
event: CommunityDefinitionEvent,
|
event: CommunityDefinitionEvent,
|
||||||
relay: Relay?,
|
relay: Relay?,
|
||||||
@ -2265,6 +2273,7 @@ object LocalCache {
|
|||||||
}
|
}
|
||||||
is ContactListEvent -> consume(event)
|
is ContactListEvent -> consume(event)
|
||||||
is DeletionEvent -> consume(event)
|
is DeletionEvent -> consume(event)
|
||||||
|
is DirectMessageRelayListEvent -> consume(event, relay)
|
||||||
is DraftEvent -> consume(event, relay)
|
is DraftEvent -> consume(event, relay)
|
||||||
is EmojiPackEvent -> consume(event, relay)
|
is EmojiPackEvent -> consume(event, relay)
|
||||||
is EmojiPackSelectionEvent -> consume(event, relay)
|
is EmojiPackSelectionEvent -> consume(event, relay)
|
||||||
|
@ -40,6 +40,7 @@ import com.vitorpamplona.quartz.events.CalendarRSVPEvent
|
|||||||
import com.vitorpamplona.quartz.events.CalendarTimeSlotEvent
|
import com.vitorpamplona.quartz.events.CalendarTimeSlotEvent
|
||||||
import com.vitorpamplona.quartz.events.ChannelMessageEvent
|
import com.vitorpamplona.quartz.events.ChannelMessageEvent
|
||||||
import com.vitorpamplona.quartz.events.ContactListEvent
|
import com.vitorpamplona.quartz.events.ContactListEvent
|
||||||
|
import com.vitorpamplona.quartz.events.DirectMessageRelayListEvent
|
||||||
import com.vitorpamplona.quartz.events.DraftEvent
|
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
|
||||||
@ -101,7 +102,7 @@ object NostrAccountDataSource : NostrDataSource("AccountData") {
|
|||||||
types = COMMON_FEED_TYPES,
|
types = COMMON_FEED_TYPES,
|
||||||
filter =
|
filter =
|
||||||
JsonFilter(
|
JsonFilter(
|
||||||
kinds = listOf(AdvertisedRelayListEvent.KIND, StatusEvent.KIND),
|
kinds = listOf(StatusEvent.KIND, AdvertisedRelayListEvent.KIND, DirectMessageRelayListEvent.KIND),
|
||||||
authors = listOf(account.userProfile().pubkeyHex),
|
authors = listOf(account.userProfile().pubkeyHex),
|
||||||
limit = 5,
|
limit = 5,
|
||||||
),
|
),
|
||||||
@ -119,6 +120,7 @@ object NostrAccountDataSource : NostrDataSource("AccountData") {
|
|||||||
MetadataEvent.KIND,
|
MetadataEvent.KIND,
|
||||||
ContactListEvent.KIND,
|
ContactListEvent.KIND,
|
||||||
AdvertisedRelayListEvent.KIND,
|
AdvertisedRelayListEvent.KIND,
|
||||||
|
DirectMessageRelayListEvent.KIND,
|
||||||
MuteListEvent.KIND,
|
MuteListEvent.KIND,
|
||||||
PeopleListEvent.KIND,
|
PeopleListEvent.KIND,
|
||||||
),
|
),
|
||||||
|
@ -1409,30 +1409,27 @@ public suspend fun <T, K> collectSuccessfulSigningOperations(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
val (value, elapsed) =
|
coroutineScope {
|
||||||
measureTimedValue {
|
val jobs =
|
||||||
coroutineScope {
|
operationsInput.map {
|
||||||
val jobs =
|
async {
|
||||||
operationsInput.map {
|
val result =
|
||||||
async {
|
withTimeoutOrNull(10000) {
|
||||||
val result =
|
suspendCancellableCoroutine { continuation ->
|
||||||
withTimeoutOrNull(10000) {
|
runRequestFor(it) { result: K -> continuation.resume(result) }
|
||||||
suspendCancellableCoroutine { continuation ->
|
|
||||||
runRequestFor(it) { result: K -> continuation.resume(result) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (result != null) {
|
|
||||||
output[it] = result
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (result != null) {
|
||||||
|
output[it] = result
|
||||||
}
|
}
|
||||||
|
|
||||||
// runs in parallel to avoid overcrowding Amber.
|
|
||||||
withTimeoutOrNull(15000) {
|
|
||||||
jobs.joinAll()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// runs in parallel to avoid overcrowding Amber.
|
||||||
|
withTimeoutOrNull(15000) {
|
||||||
|
jobs.joinAll()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
onReady(output)
|
onReady(output)
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,68 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2024 Vitor Pamplona
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
* this software and associated documentation files (the "Software"), to deal in
|
||||||
|
* the Software without restriction, including without limitation the rights to use,
|
||||||
|
* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
|
||||||
|
* Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
* subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||||
|
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
package com.vitorpamplona.quartz.events
|
||||||
|
|
||||||
|
import androidx.compose.runtime.Immutable
|
||||||
|
import com.vitorpamplona.quartz.encoders.HexKey
|
||||||
|
import com.vitorpamplona.quartz.signers.NostrSigner
|
||||||
|
import com.vitorpamplona.quartz.utils.TimeUtils
|
||||||
|
|
||||||
|
@Immutable
|
||||||
|
class DirectMessageRelayListEvent(
|
||||||
|
id: HexKey,
|
||||||
|
pubKey: HexKey,
|
||||||
|
createdAt: Long,
|
||||||
|
tags: Array<Array<String>>,
|
||||||
|
content: String,
|
||||||
|
sig: HexKey,
|
||||||
|
) : BaseAddressableEvent(id, pubKey, createdAt, KIND, tags, content, sig) {
|
||||||
|
override fun dTag() = FIXED_D_TAG
|
||||||
|
|
||||||
|
fun relays(): List<String> {
|
||||||
|
return tags.mapNotNull {
|
||||||
|
if (it.size > 1 && it[0] == "relay") {
|
||||||
|
it[1]
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val KIND = 10050
|
||||||
|
const val FIXED_D_TAG = ""
|
||||||
|
|
||||||
|
fun create(
|
||||||
|
relays: List<String>,
|
||||||
|
signer: NostrSigner,
|
||||||
|
createdAt: Long = TimeUtils.now(),
|
||||||
|
onReady: (DirectMessageRelayListEvent) -> Unit,
|
||||||
|
) {
|
||||||
|
val tags =
|
||||||
|
relays.map {
|
||||||
|
arrayOf("relay", it)
|
||||||
|
}.plusElement(arrayOf("alt", "Relay list for private messages")).toTypedArray()
|
||||||
|
val msg = ""
|
||||||
|
|
||||||
|
signer.sign(createdAt, KIND, tags, msg, onReady)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -79,6 +79,7 @@ class EventFactory {
|
|||||||
CommunityPostApprovalEvent(id, pubKey, createdAt, tags, content, sig)
|
CommunityPostApprovalEvent(id, pubKey, createdAt, tags, content, sig)
|
||||||
ContactListEvent.KIND -> ContactListEvent(id, pubKey, createdAt, tags, content, sig)
|
ContactListEvent.KIND -> ContactListEvent(id, pubKey, createdAt, tags, content, sig)
|
||||||
DeletionEvent.KIND -> DeletionEvent(id, pubKey, createdAt, tags, content, sig)
|
DeletionEvent.KIND -> DeletionEvent(id, pubKey, createdAt, tags, content, sig)
|
||||||
|
DirectMessageRelayListEvent.KIND -> DirectMessageRelayListEvent(id, pubKey, createdAt, tags, content, sig)
|
||||||
DraftEvent.KIND -> DraftEvent(id, pubKey, createdAt, tags, content, sig)
|
DraftEvent.KIND -> DraftEvent(id, pubKey, createdAt, tags, content, sig)
|
||||||
EmojiPackEvent.KIND -> EmojiPackEvent(id, pubKey, createdAt, tags, content, sig)
|
EmojiPackEvent.KIND -> EmojiPackEvent(id, pubKey, createdAt, tags, content, sig)
|
||||||
EmojiPackSelectionEvent.KIND ->
|
EmojiPackSelectionEvent.KIND ->
|
||||||
|
Loading…
Reference in New Issue
Block a user