Reduces the amount of wasted memory by using Array<Array<List>> as opposed to List<List<String>> for tags.

This commit is contained in:
Vitor Pamplona
2023-11-28 15:00:41 -05:00
parent d87542a949
commit 5356d869fd
68 changed files with 388 additions and 390 deletions
@@ -13,7 +13,7 @@ class AdvertisedRelayListEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -47,11 +47,11 @@ class AdvertisedRelayListEvent(
) {
val tags = list.map {
if (it.type == AdvertisedRelayType.BOTH) {
listOf(it.relayUrl)
arrayOf(it.relayUrl)
} else {
listOf(it.relayUrl, it.type.code)
arrayOf(it.relayUrl, it.type.code)
}
}
}.toTypedArray()
val msg = ""
signer.sign(createdAt, kind, tags, msg, onReady)
@@ -13,7 +13,7 @@ class AppDefinitionEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -54,7 +54,7 @@ class AppDefinitionEvent(
createdAt: Long = TimeUtils.now(),
onReady: (AppDefinitionEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
val tags = emptyArray<Array<String>>()
signer.sign(createdAt, kind, tags, "", onReady)
}
}
@@ -11,7 +11,7 @@ class AppRecommendationEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -27,7 +27,7 @@ class AppRecommendationEvent(
createdAt: Long = TimeUtils.now(),
onReady: (AppRecommendationEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
val tags = emptyArray<Array<String>>()
signer.sign(createdAt, kind, tags, "", onReady)
}
}
@@ -11,7 +11,7 @@ class AudioHeaderEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -29,7 +29,7 @@ class AudioHeaderEvent(
private const val STREAM_URL = "stream_url"
private const val WAVEFORM = "waveform"
suspend fun create(
fun create(
description: String,
downloadUrl: String,
streamUrl: String? = null,
@@ -40,17 +40,17 @@ class AudioHeaderEvent(
onReady: (AudioHeaderEvent) -> Unit
) {
val tags = listOfNotNull(
downloadUrl.let { listOf(DOWNLOAD_URL, it) },
streamUrl?.let { listOf(STREAM_URL, it) },
wavefront?.let { listOf(WAVEFORM, it) },
downloadUrl.let { arrayOf(DOWNLOAD_URL, it) },
streamUrl?.let { arrayOf(STREAM_URL, it) },
wavefront?.let { arrayOf(WAVEFORM, it) },
sensitiveContent?.let {
if (it) {
listOf("content-warning", "")
arrayOf("content-warning", "")
} else {
null
}
}
)
).toTypedArray()
signer.sign(createdAt, kind, tags, description, onReady)
}
@@ -13,7 +13,7 @@ class AudioTrackEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -46,12 +46,12 @@ class AudioTrackEvent(
onReady: (AudioTrackEvent) -> Unit
) {
val tags = listOfNotNull(
listOf(MEDIA, media),
listOf(TYPE, type),
price?.let { listOf(PRICE, it) },
cover?.let { listOf(COVER, it) },
subject?.let { listOf(SUBJECT, it) }
)
arrayOf(MEDIA, media),
arrayOf(TYPE, type),
price?.let { arrayOf(PRICE, it) },
cover?.let { arrayOf(COVER, it) },
subject?.let { arrayOf(SUBJECT, it) }
).toTypedArray()
signer.sign(createdAt, kind, tags, "", onReady)
}
@@ -8,7 +8,7 @@ class BadgeAwardEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -9,7 +9,7 @@ class BadgeDefinitionEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -9,7 +9,7 @@ class BadgeProfilesEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -16,7 +16,7 @@ open class BaseTextNoteEvent(
pubKey: HexKey,
createdAt: Long,
kind: Int,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -13,7 +13,7 @@ class BookmarkListEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : GeneralListEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -49,7 +49,7 @@ class BookmarkListEvent(
) {
add(
earlierVersion,
listOf(listOf(tagName, tagValue)),
arrayOf(arrayOf(tagName, tagValue)),
isPrivate,
signer,
createdAt,
@@ -59,7 +59,7 @@ class BookmarkListEvent(
fun add(
earlierVersion: BookmarkListEvent?,
listNewTags: List<List<String>>,
listNewTags: Array<Array<String>>,
isPrivate: Boolean,
signer: NostrSigner,
createdAt: Long = TimeUtils.now(),
@@ -88,7 +88,7 @@ class BookmarkListEvent(
) { encryptedTags ->
create(
content = encryptedTags,
tags = emptyList(),
tags = emptyArray(),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -98,7 +98,7 @@ class BookmarkListEvent(
} else {
create(
content = earlierVersion?.content ?: "",
tags = (earlierVersion?.tags ?: emptyList()).plus(listNewTags),
tags = (earlierVersion?.tags ?: emptyArray()).plus(listNewTags),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -136,12 +136,12 @@ class BookmarkListEvent(
if (isPrivate) {
earlierVersion.privateTagsOrEmpty(signer) { privateTags ->
encryptTags(
privateTags = privateTags.filter { it.size <= 1 || !(it[0] == tagName && it[1] == tagValue) },
privateTags = privateTags.filter { it.size <= 1 || !(it[0] == tagName && it[1] == tagValue) }.toTypedArray(),
signer = signer
) { encryptedTags ->
create(
content = encryptedTags,
tags = earlierVersion.tags.filter { it.size <= 1 || !(it[0] == tagName && it[1] == tagValue) },
tags = earlierVersion.tags.filter { it.size <= 1 || !(it[0] == tagName && it[1] == tagValue) }.toTypedArray(),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -151,7 +151,7 @@ class BookmarkListEvent(
} else {
create(
content = earlierVersion.content,
tags = earlierVersion.tags.filter { it.size <= 1 || !(it[0] == tagName && it[1] == tagValue) },
tags = earlierVersion.tags.filter { it.size <= 1 || !(it[0] == tagName && it[1] == tagValue) }.toTypedArray(),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -161,7 +161,7 @@ class BookmarkListEvent(
fun create(
content: String,
tags: List<List<String>>,
tags: Array<Array<String>>,
signer: NostrSigner,
createdAt: Long = TimeUtils.now(),
onReady: (BookmarkListEvent) -> Unit
@@ -184,21 +184,21 @@ class BookmarkListEvent(
createdAt: Long = TimeUtils.now(),
onReady: (BookmarkListEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
tags.add(listOf("d", name))
val tags = mutableListOf<Array<String>>()
tags.add(arrayOf("d", name))
events?.forEach {
tags.add(listOf("e", it))
tags.add(arrayOf("e", it))
}
users?.forEach {
tags.add(listOf("p", it))
tags.add(arrayOf("p", it))
}
addresses?.forEach {
tags.add(listOf("a", it.toTag()))
tags.add(arrayOf("a", it.toTag()))
}
createPrivateTags(privEvents, privUsers, privAddresses, signer) { content ->
signer.sign(createdAt, kind, tags, content, onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady)
}
}
}
@@ -13,7 +13,7 @@ class CalendarDateSlotEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -33,7 +33,7 @@ class CalendarDateSlotEvent(
createdAt: Long = TimeUtils.now(),
onReady: (CalendarDateSlotEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
val tags = emptyArray<Array<String>>()
signer.sign(createdAt, kind, tags, "", onReady)
}
}
@@ -13,7 +13,7 @@ class CalendarEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -25,7 +25,7 @@ class CalendarEvent(
createdAt: Long = TimeUtils.now(),
onReady: (CalendarEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
val tags = emptyArray<Array<String>>()
signer.sign(createdAt, kind, tags, "", onReady)
}
}
@@ -13,7 +13,7 @@ class CalendarRSVPEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -35,7 +35,7 @@ class CalendarRSVPEvent(
createdAt: Long = TimeUtils.now(),
onReady: (CalendarRSVPEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
val tags = emptyArray<Array<String>>()
signer.sign(createdAt, kind, tags, "", onReady)
}
}
@@ -13,7 +13,7 @@ class CalendarTimeSlotEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -37,7 +37,7 @@ class CalendarTimeSlotEvent(
createdAt: Long = TimeUtils.now(),
onReady: (CalendarTimeSlotEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
val tags = emptyArray<Array<String>>()
signer.sign(createdAt, kind, tags, "", onReady)
}
}
@@ -16,7 +16,7 @@ class ChannelCreateEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -65,7 +65,7 @@ class ChannelCreateEvent(
""
}
signer.sign(createdAt, kind, emptyList(), content, onReady)
signer.sign(createdAt, kind, emptyArray(), content, onReady)
}
}
@@ -12,7 +12,7 @@ class ChannelHideMessageEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig), IsInPublicChatChannel {
@@ -36,8 +36,8 @@ class ChannelHideMessageEvent(
) {
val tags =
messagesToHide?.map {
listOf("e", it)
} ?: emptyList()
arrayOf("e", it)
}?.toTypedArray() ?: emptyArray()
signer.sign(createdAt, kind, tags, reason, onReady)
}
@@ -2,9 +2,6 @@ package com.vitorpamplona.quartz.events
import androidx.compose.runtime.Immutable
import com.vitorpamplona.quartz.utils.TimeUtils
import com.vitorpamplona.quartz.encoders.toHexKey
import com.vitorpamplona.quartz.crypto.CryptoUtils
import com.vitorpamplona.quartz.crypto.KeyPair
import com.vitorpamplona.quartz.encoders.HexKey
import com.vitorpamplona.quartz.signers.NostrSigner
@@ -13,7 +10,7 @@ class ChannelMessageEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseTextNoteEvent(id, pubKey, createdAt, kind, tags, content, sig), IsInPublicChatChannel {
@@ -42,30 +39,29 @@ class ChannelMessageEvent(
geohash: String? = null,
onReady: (ChannelMessageEvent) -> Unit
) {
val content = message
val tags = mutableListOf(
listOf("e", channel, "", "root")
arrayOf("e", channel, "", "root")
)
replyTos?.forEach {
tags.add(listOf("e", it))
tags.add(arrayOf("e", it))
}
mentions?.forEach {
tags.add(listOf("p", it))
tags.add(arrayOf("p", it))
}
zapReceiver?.forEach {
tags.add(listOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString()))
tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString()))
}
if (markAsSensitive) {
tags.add(listOf("content-warning", ""))
tags.add(arrayOf("content-warning", ""))
}
zapRaiserAmount?.let {
tags.add(listOf("zapraiser", "$it"))
tags.add(arrayOf("zapraiser", "$it"))
}
geohash?.let {
tags.addAll(geohashMipMap(it))
}
signer.sign(createdAt, kind, tags, content, onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), message, onReady)
}
}
}
@@ -14,7 +14,7 @@ class ChannelMetadataEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig), IsInPublicChatChannel {
@@ -65,8 +65,8 @@ class ChannelMetadataEvent(
""
}
val tags = listOf(listOf("e", originalChannelIdHex, "", "root"))
signer.sign(createdAt, kind, tags, content, onReady)
val tags = listOf(arrayOf("e", originalChannelIdHex, "", "root"))
signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady)
}
}
}
@@ -12,7 +12,7 @@ class ChannelMuteUserEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig), IsInPublicChatChannel {
@@ -36,8 +36,8 @@ class ChannelMuteUserEvent(
) {
val content = reason
val tags = usersToMute?.map {
listOf("p", it)
} ?: emptyList()
arrayOf("p", it)
}?.toTypedArray() ?: emptyArray()
signer.sign(createdAt, kind, tags, content, onReady)
}
@@ -13,7 +13,7 @@ class ChatMessageEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : WrappedEvent(id, pubKey, createdAt, kind, tags, content, sig), ChatroomKeyable {
@@ -64,33 +64,33 @@ class ChatMessageEvent(
createdAt: Long = TimeUtils.now(),
onReady: (ChatMessageEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
val tags = mutableListOf<Array<String>>()
to?.forEach {
tags.add(listOf("p", it))
tags.add(arrayOf("p", it))
}
replyTos?.forEach {
tags.add(listOf("e", it))
tags.add(arrayOf("e", it))
}
mentions?.forEach {
tags.add(listOf("p", it, "", "mention"))
tags.add(arrayOf("p", it, "", "mention"))
}
zapReceiver?.forEach {
tags.add(listOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString()))
tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString()))
}
if (markAsSensitive) {
tags.add(listOf("content-warning", ""))
tags.add(arrayOf("content-warning", ""))
}
zapRaiserAmount?.let {
tags.add(listOf("zapraiser", "$it"))
tags.add(arrayOf("zapraiser", "$it"))
}
geohash?.let {
tags.addAll(geohashMipMap(it))
}
subject?.let {
tags.add(listOf("subject", it))
tags.add(arrayOf("subject", it))
}
signer.sign(createdAt, kind, tags, msg, onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), msg, onReady)
}
}
}
@@ -13,7 +13,7 @@ class ClassifiedsEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -46,26 +46,26 @@ class ClassifiedsEvent(
createdAt: Long = TimeUtils.now(),
onReady: (ClassifiedsEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
val tags = mutableListOf<Array<String>>()
tags.add(listOf("d", dTag))
title?.let { tags.add(listOf("title", it)) }
image?.let { tags.add(listOf("image", it)) }
summary?.let { tags.add(listOf("summary", it)) }
tags.add(arrayOf("d", dTag))
title?.let { tags.add(arrayOf("title", it)) }
image?.let { tags.add(arrayOf("image", it)) }
summary?.let { tags.add(arrayOf("summary", it)) }
price?.let {
if (it.frequency != null && it.currency != null) {
tags.add(listOf("price", it.amount, it.currency, it.frequency))
tags.add(arrayOf("price", it.amount, it.currency, it.frequency))
} else if (it.currency != null) {
tags.add(listOf("price", it.amount, it.currency))
tags.add(arrayOf("price", it.amount, it.currency))
} else {
tags.add(listOf("price", it.amount))
tags.add(arrayOf("price", it.amount))
}
}
location?.let { tags.add(listOf("location", it)) }
publishedAt?.let { tags.add(listOf("publishedAt", it.toString())) }
title?.let { tags.add(listOf("title", it)) }
location?.let { tags.add(arrayOf("location", it)) }
publishedAt?.let { tags.add(arrayOf("publishedAt", it.toString())) }
title?.let { tags.add(arrayOf("title", it)) }
signer.sign(createdAt, kind, tags, "", onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), "", onReady)
}
}
}
@@ -13,7 +13,7 @@ class CommunityDefinitionEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -31,7 +31,7 @@ class CommunityDefinitionEvent(
createdAt: Long = TimeUtils.now(),
onReady: (CommunityDefinitionEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
val tags = emptyArray<Array<String>>()
signer.sign(createdAt, kind, tags, "", onReady)
}
}
@@ -14,7 +14,7 @@ class CommunityPostApprovalEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -55,12 +55,12 @@ class CommunityPostApprovalEvent(
) {
val content = approvedPost.toJson()
val communities = listOf("a", community.address().toTag())
val replyToPost = listOf("e", approvedPost.id())
val replyToAuthor = listOf("p", approvedPost.pubKey())
val innerKind = listOf("k", "${approvedPost.kind()}")
val communities = arrayOf("a", community.address().toTag())
val replyToPost = arrayOf("e", approvedPost.id())
val replyToAuthor = arrayOf("p", approvedPost.pubKey())
val innerKind = arrayOf("k", "${approvedPost.kind()}")
val tags: List<List<String>> = listOf(communities, replyToPost, replyToAuthor, innerKind)
val tags: Array<Array<String>> = arrayOf(communities, replyToPost, replyToAuthor, innerKind)
signer.sign(createdAt, kind, tags, content, onReady)
}
@@ -21,7 +21,7 @@ class ContactListEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -112,27 +112,27 @@ class ContactListEvent(
val tags = followUsers.map {
if (it.relayUri != null) {
listOf("p", it.pubKeyHex, it.relayUri)
arrayOf("p", it.pubKeyHex, it.relayUri)
} else {
listOf("p", it.pubKeyHex)
arrayOf("p", it.pubKeyHex)
}
} + followTags.map {
listOf("t", it)
arrayOf("t", it)
} + followEvents.map {
listOf("e", it)
arrayOf("e", it)
} + followCommunities.map {
if (it.relay != null) {
listOf("a", it.toTag(), it.relay)
arrayOf("a", it.toTag(), it.relay)
} else {
listOf("a", it.toTag())
arrayOf("a", it.toTag())
}
} + followGeohashes.map {
listOf("g", it)
arrayOf("g", it)
}
return create(
content = content,
tags = tags,
tags = tags.toTypedArray(),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -144,7 +144,7 @@ class ContactListEvent(
return create(
content = earlierVersion.content,
tags = earlierVersion.tags.plus(element = listOf("p", pubKeyHex)),
tags = earlierVersion.tags.plus(element = arrayOf("p", pubKeyHex)),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -156,7 +156,7 @@ class ContactListEvent(
return create(
content = earlierVersion.content,
tags = earlierVersion.tags.filter { it.size > 1 && it[1] != pubKeyHex },
tags = earlierVersion.tags.filter { it.size > 1 && it[1] != pubKeyHex }.toTypedArray(),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -168,7 +168,7 @@ class ContactListEvent(
return create(
content = earlierVersion.content,
tags = earlierVersion.tags.plus(element = listOf("t", hashtag)),
tags = earlierVersion.tags.plus(element = arrayOf("t", hashtag)),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -180,7 +180,7 @@ class ContactListEvent(
return create(
content = earlierVersion.content,
tags = earlierVersion.tags.filter { it.size > 1 && !it[1].equals(hashtag, true) },
tags = earlierVersion.tags.filter { it.size > 1 && !it[1].equals(hashtag, true) }.toTypedArray(),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -192,7 +192,7 @@ class ContactListEvent(
return create(
content = earlierVersion.content,
tags = earlierVersion.tags.plus(element = listOf("g", hashtag)),
tags = earlierVersion.tags.plus(element = arrayOf("g", hashtag)),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -204,7 +204,7 @@ class ContactListEvent(
return create(
content = earlierVersion.content,
tags = earlierVersion.tags.filter { it.size > 1 && it[1] != hashtag },
tags = earlierVersion.tags.filter { it.size > 1 && it[1] != hashtag }.toTypedArray(),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -216,7 +216,7 @@ class ContactListEvent(
return create(
content = earlierVersion.content,
tags = earlierVersion.tags.plus(element = listOf("e", idHex)),
tags = earlierVersion.tags.plus(element = arrayOf("e", idHex)),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -228,7 +228,7 @@ class ContactListEvent(
return create(
content = earlierVersion.content,
tags = earlierVersion.tags.filter { it.size > 1 && it[1] != idHex },
tags = earlierVersion.tags.filter { it.size > 1 && it[1] != idHex }.toTypedArray(),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -240,7 +240,7 @@ class ContactListEvent(
return create(
content = earlierVersion.content,
tags = earlierVersion.tags.plus(element = listOfNotNull("a", aTag.toTag(), aTag.relay)),
tags = earlierVersion.tags.plus(element = listOfNotNull("a", aTag.toTag(), aTag.relay).toTypedArray()),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -252,7 +252,7 @@ class ContactListEvent(
return create(
content = earlierVersion.content,
tags = earlierVersion.tags.filter { it.size > 1 && it[1] != aTag.toTag() },
tags = earlierVersion.tags.filter { it.size > 1 && it[1] != aTag.toTag() }.toTypedArray(),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -277,7 +277,7 @@ class ContactListEvent(
fun create(
content: String,
tags: List<List<String>>,
tags: Array<Array<String>>,
signer: NostrSigner,
createdAt: Long = TimeUtils.now(),
onReady: (ContactListEvent) -> Unit
@@ -346,10 +346,10 @@ class UserMetadata {
}
@Stable
data class ImmutableListOfLists<T>(val lists: List<List<T>> = emptyList())
data class ImmutableListOfLists<T>(val lists: Array<Array<T>>)
val EmptyTagList = ImmutableListOfLists<String>(emptyList())
val EmptyTagList = ImmutableListOfLists<String>(emptyArray())
fun List<List<String>>.toImmutableListOfLists(): ImmutableListOfLists<String> {
fun Array<Array<String>>.toImmutableListOfLists(): ImmutableListOfLists<String> {
return ImmutableListOfLists(this)
}
@@ -13,7 +13,7 @@ class DeletionEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -24,7 +24,7 @@ class DeletionEvent(
fun create(deleteEvents: List<String>, signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (DeletionEvent) -> Unit) {
val content = ""
val tags = deleteEvents.map { listOf("e", it) }
val tags = deleteEvents.map { arrayOf("e", it) }.toTypedArray()
signer.sign(createdAt, kind, tags, content, onReady)
}
}
@@ -12,7 +12,7 @@ class EmojiPackEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : GeneralListEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -28,10 +28,10 @@ class EmojiPackEvent(
) {
val content = ""
val tags = mutableListOf<List<String>>()
tags.add(listOf("d", name))
val tags = mutableListOf<Array<String>>()
tags.add(arrayOf("d", name))
signer.sign(createdAt, kind, tags, content, onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady)
}
}
}
@@ -14,7 +14,7 @@ class EmojiPackSelectionEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -31,13 +31,13 @@ class EmojiPackSelectionEvent(
onReady: (EmojiPackSelectionEvent) -> Unit
) {
val msg = ""
val tags = mutableListOf<List<String>>()
val tags = mutableListOf<Array<String>>()
listOfEmojiPacks?.forEach {
tags.add(listOf("a", it.toTag()))
tags.add(arrayOf("a", it.toTag()))
}
signer.sign(createdAt, kind, tags, msg, onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), msg, onReady)
}
}
}
@@ -11,6 +11,7 @@ import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.SerializerProvider
import com.fasterxml.jackson.databind.deser.std.StdDeserializer
import com.fasterxml.jackson.databind.module.SimpleModule
import com.fasterxml.jackson.databind.node.ArrayNode
import com.fasterxml.jackson.databind.ser.std.StdSerializer
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.vitorpamplona.quartz.crypto.CryptoUtils
@@ -33,7 +34,7 @@ open class Event(
@JsonProperty("created_at")
val createdAt: Long,
val kind: Int,
val tags: List<List<String>>,
val tags: Array<Array<String>>,
val content: String,
val sig: HexKey
) : EventInterface {
@@ -55,7 +56,7 @@ open class Event(
override fun kind(): Int = kind
override fun tags(): List<List<String>> = tags
override fun tags(): Array<Array<String>> = tags
override fun content(): String = content
@@ -272,14 +273,13 @@ open class Event(
private class GossipDeserializer : StdDeserializer<Gossip>(Gossip::class.java) {
override fun deserialize(jp: JsonParser, ctxt: DeserializationContext): Gossip {
val jsonObject: JsonNode = jp.codec.readTree(jp)
val tagList = jsonObject.get("tags")
return Gossip(
id = jsonObject.get("id")?.asText()?.intern(),
pubKey = jsonObject.get("pubkey")?.asText()?.intern(),
createdAt = jsonObject.get("created_at")?.asLong(),
kind = jsonObject.get("kind")?.asInt(),
tags = tagList.mapTo(ArrayList<List<String>>(tagList.size())) {
it.mapNotNullTo(ArrayList<String>(it.size())) { s -> if (s.isNull) null else s.asText().intern() }
tags = jsonObject.get("tags").toTypedArray {
it.toTypedArray { s -> if (s.isNull) "" else s.asText().intern() }
},
content = jsonObject.get("content")?.asText()
)
@@ -295,7 +295,7 @@ open class Event(
gen.writeNumberField("kind", event.kind)
gen.writeArrayFieldStart("tags")
event.tags.forEach { tag ->
gen.writeArray(tag.toTypedArray(), 0, tag.size)
gen.writeArray(tag, 0, tag.size)
}
gen.writeEndArray()
gen.writeStringField("content", event.content)
@@ -314,7 +314,7 @@ open class Event(
event.tags?.let {
gen.writeArrayFieldStart("tags")
event.tags.forEach { tag ->
gen.writeArray(tag.toTypedArray(), 0, tag.size)
gen.writeArray(tag, 0, tag.size)
}
gen.writeEndArray()
}
@@ -361,24 +361,29 @@ open class Event(
)
fun fromJson(jsonObject: JsonNode): Event {
val tagList = jsonObject.get("tags")
return EventFactory.create(
id = jsonObject.get("id").asText().intern(),
pubKey = jsonObject.get("pubkey").asText().intern(),
createdAt = jsonObject.get("created_at").asLong(),
kind = jsonObject.get("kind").asInt(),
tags = tagList.mapTo(ArrayList<List<String>>(tagList.size())) {
it.mapNotNullTo(ArrayList<String>(it.size())) { s -> if (s.isNull) null else s.asText().intern() }
tags = jsonObject.get("tags").toTypedArray {
it.toTypedArray { s -> if (s.isNull) "" else s.asText().intern() }
},
content = jsonObject.get("content").asText(),
sig = jsonObject.get("sig").asText()
)
}
private inline fun <reified R> JsonNode.toTypedArray(transform: (JsonNode) -> R): Array<R> {
return Array(size()) {
transform(get(it))
}
}
fun fromJson(json: String): Event = mapper.readValue(json, Event::class.java)
fun toJson(event: Event): String = mapper.writeValueAsString(event)
fun makeJsonForId(pubKey: HexKey, createdAt: Long, kind: Int, tags: List<List<String>>, content: String): String {
fun makeJsonForId(pubKey: HexKey, createdAt: Long, kind: Int, tags: Array<Array<String>>, content: String): String {
val factory = mapper.nodeFactory
val rawEvent = factory.arrayNode(6).apply {
add(0)
@@ -402,11 +407,11 @@ open class Event(
return mapper.writeValueAsString(rawEvent)
}
fun generateId(pubKey: HexKey, createdAt: Long, kind: Int, tags: List<List<String>>, content: String): ByteArray {
fun generateId(pubKey: HexKey, createdAt: Long, kind: Int, tags: Array<Array<String>>, content: String): ByteArray {
return CryptoUtils.sha256(makeJsonForId(pubKey, createdAt, kind, tags, content).toByteArray())
}
fun create(signer: NostrSigner, kind: Int, tags: List<List<String>> = emptyList(), content: String = "", createdAt: Long = TimeUtils.now(), onReady: (Event) -> Unit) {
fun create(signer: NostrSigner, kind: Int, tags: Array<Array<String>> = emptyArray(), content: String = "", createdAt: Long = TimeUtils.now(), onReady: (Event) -> Unit) {
return signer.sign(createdAt, kind, tags, content, onReady)
}
}
@@ -420,7 +425,7 @@ open class WrappedEvent(
@JsonProperty("created_at")
createdAt: Long,
kind: Int,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -440,7 +445,7 @@ open class BaseAddressableEvent(
pubKey: HexKey,
createdAt: Long,
kind: Int,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
): Event(id, pubKey, createdAt, kind, tags, content, sig), AddressableEvent {
@@ -10,7 +10,7 @@ class EventFactory {
pubKey: String,
createdAt: Long,
kind: Int,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: String
) = when (kind) {
@@ -17,7 +17,7 @@ interface EventInterface {
fun kind(): Int
fun tags(): List<List<String>>
fun tags(): Array<Array<String>>
fun content(): String
@@ -13,7 +13,7 @@ class FileHeaderEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -62,20 +62,20 @@ class FileHeaderEvent(
onReady: (FileHeaderEvent) -> Unit
) {
val tags = listOfNotNull(
listOf(URL, url),
mimeType?.let { listOf(MIME_TYPE, mimeType) },
alt?.ifBlank { null }?.let { listOf(ALT, it) },
hash?.let { listOf(HASH, it) },
size?.let { listOf(FILE_SIZE, it) },
dimensions?.let { listOf(DIMENSION, it) },
blurhash?.let { listOf(BLUR_HASH, it) },
magnetURI?.let { listOf(MAGNET_URI, it) },
arrayOf(URL, url),
mimeType?.let { arrayOf(MIME_TYPE, mimeType) },
alt?.ifBlank { null }?.let { arrayOf(ALT, it) },
hash?.let { arrayOf(HASH, it) },
size?.let { arrayOf(FILE_SIZE, it) },
dimensions?.let { arrayOf(DIMENSION, it) },
blurhash?.let { arrayOf(BLUR_HASH, it) },
magnetURI?.let { arrayOf(MAGNET_URI, it) },
torrentInfoHash?.let { listOf(TORRENT_INFOHASH, it) },
encryptionKey?.let { listOf(ENCRYPTION_KEY, it.key, it.nonce) },
torrentInfoHash?.let { arrayOf(TORRENT_INFOHASH, it) },
encryptionKey?.let { arrayOf(ENCRYPTION_KEY, it.key, it.nonce) },
sensitiveContent?.let {
if (it) {
listOf("content-warning", "")
arrayOf("content-warning", "")
} else {
null
}
@@ -83,7 +83,7 @@ class FileHeaderEvent(
)
val content = alt ?: ""
signer.sign(createdAt, kind, tags, content, onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady)
}
}
}
@@ -14,7 +14,7 @@ class FileStorageEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -49,11 +49,11 @@ class FileStorageEvent(
onReady: (FileStorageEvent) -> Unit
) {
val tags = listOfNotNull(
listOf(TYPE, mimeType)
arrayOf(TYPE, mimeType)
)
val content = encode(data)
signer.sign(createdAt, kind, tags, content, onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady)
}
}
}
@@ -12,7 +12,7 @@ class FileStorageHeaderEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -59,19 +59,19 @@ class FileStorageHeaderEvent(
onReady: (FileStorageHeaderEvent) -> Unit
) {
val tags = listOfNotNull(
listOf("e", storageEvent.id),
mimeType?.let { listOf(MIME_TYPE, mimeType) },
hash?.let { listOf(HASH, it) },
alt?.let { listOf(ALT, it) },
size?.let { listOf(FILE_SIZE, it) },
dimensions?.let { listOf(DIMENSION, it) },
blurhash?.let { listOf(BLUR_HASH, it) },
magnetURI?.let { listOf(MAGNET_URI, it) },
torrentInfoHash?.let { listOf(TORRENT_INFOHASH, it) },
encryptionKey?.let { listOf(ENCRYPTION_KEY, it.key, it.nonce) },
arrayOf("e", storageEvent.id),
mimeType?.let { arrayOf(MIME_TYPE, mimeType) },
hash?.let { arrayOf(HASH, it) },
alt?.let { arrayOf(ALT, it) },
size?.let { arrayOf(FILE_SIZE, it) },
dimensions?.let { arrayOf(DIMENSION, it) },
blurhash?.let { arrayOf(BLUR_HASH, it) },
magnetURI?.let { arrayOf(MAGNET_URI, it) },
torrentInfoHash?.let { arrayOf(TORRENT_INFOHASH, it) },
encryptionKey?.let { arrayOf(ENCRYPTION_KEY, it.key, it.nonce) },
sensitiveContent?.let {
if (it) {
listOf("content-warning", "")
arrayOf("content-warning", "")
} else {
null
}
@@ -79,7 +79,7 @@ class FileStorageHeaderEvent(
)
val content = alt ?: ""
signer.sign(createdAt, kind, tags, content, onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady)
}
}
}
@@ -17,12 +17,12 @@ abstract class GeneralListEvent(
pubKey: HexKey,
createdAt: Long,
kind: Int,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@Transient
private var privateTagsCache: List<List<String>>? = null
private var privateTagsCache: Array<Array<String>>? = null
fun category() = dTag()
fun bookmarkedPosts() = taggedEvents()
@@ -32,11 +32,11 @@ abstract class GeneralListEvent(
fun title() = tags.firstOrNull { it.size > 1 && it[0] == "title" }?.get(1)
fun nameOrTitle() = name() ?: title()
fun cachedPrivateTags(): List<List<String>>? {
fun cachedPrivateTags(): Array<Array<String>>? {
return privateTagsCache
}
fun filterTagList(key: String, privateTags: List<List<String>>?): ImmutableSet<String> {
fun filterTagList(key: String, privateTags: Array<Array<String>>?): ImmutableSet<String> {
val privateUserList = privateTags?.let {
it.filter { it.size > 1 && it[0] == key }.map { it[1] }.toSet()
} ?: emptySet()
@@ -57,7 +57,7 @@ abstract class GeneralListEvent(
}
}
fun privateTags(signer: NostrSigner, onReady: (List<List<String>>) -> Unit) {
fun privateTags(signer: NostrSigner, onReady: (Array<Array<String>>) -> Unit) {
if (content.isBlank()) return
privateTagsCache?.let {
@@ -67,7 +67,7 @@ abstract class GeneralListEvent(
try {
signer.nip04Decrypt(content, pubKey) {
privateTagsCache = mapper.readValue<List<List<String>>>(it)
privateTagsCache = mapper.readValue<Array<Array<String>>>(it)
privateTagsCache?.let {
onReady(it)
}
@@ -77,7 +77,7 @@ abstract class GeneralListEvent(
}
}
fun privateTagsOrEmpty(signer: NostrSigner, onReady: (List<List<String>>) -> Unit) {
fun privateTagsOrEmpty(signer: NostrSigner, onReady: (Array<Array<String>>) -> Unit) {
privateTags(signer, onReady)
}
@@ -97,23 +97,23 @@ abstract class GeneralListEvent(
onReady(filterAddresses(it))
}
fun filterUsers(tags: List<List<String>>): List<String> {
fun filterUsers(tags: Array<Array<String>>): List<String> {
return tags.filter { it.size > 1 && it[0] == "p" }.map { it[1] }
}
fun filterHashtags(tags: List<List<String>>): List<String> {
fun filterHashtags(tags: Array<Array<String>>): List<String> {
return tags.filter { it.size > 1 && it[0] == "t" }.map { it[1] }
}
fun filterGeohashes(tags: List<List<String>>): List<String> {
fun filterGeohashes(tags: Array<Array<String>>): List<String> {
return tags.filter { it.size > 1 && it[0] == "g" }.map { it[1] }
}
fun filterEvents(tags: List<List<String>>): List<String> {
fun filterEvents(tags: Array<Array<String>>): List<String> {
return tags.filter { it.size > 1 && it[0] == "e" }.map { it[1] }
}
fun filterAddresses(tags: List<List<String>>): List<ATag> {
fun filterAddresses(tags: Array<Array<String>>): List<ATag> {
return tags.filter { it.firstOrNull() == "a" }.mapNotNull {
val aTagValue = it.getOrNull(1)
val relay = it.getOrNull(2)
@@ -131,22 +131,22 @@ abstract class GeneralListEvent(
signer: NostrSigner,
onReady: (String) -> Unit
) {
val privTags = mutableListOf<List<String>>()
val privTags = mutableListOf<Array<String>>()
privEvents?.forEach {
privTags.add(listOf("e", it))
privTags.add(arrayOf("e", it))
}
privUsers?.forEach {
privTags.add(listOf("p", it))
privTags.add(arrayOf("p", it))
}
privAddresses?.forEach {
privTags.add(listOf("a", it.toTag()))
privTags.add(arrayOf("a", it.toTag()))
}
return encryptTags(privTags, signer, onReady)
return encryptTags(privTags.toTypedArray(), signer, onReady)
}
fun encryptTags(
privateTags: List<List<String>>? = null,
privateTags: Array<Array<String>>? = null,
signer: NostrSigner,
onReady: (String) -> Unit
) {
@@ -13,7 +13,7 @@ class GenericRepostEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -38,18 +38,18 @@ class GenericRepostEvent(
) {
val content = boostedPost.toJson()
val replyToPost = listOf("e", boostedPost.id())
val replyToAuthor = listOf("p", boostedPost.pubKey())
val replyToPost = arrayOf("e", boostedPost.id())
val replyToAuthor = arrayOf("p", boostedPost.pubKey())
var tags: List<List<String>> = listOf(replyToPost, replyToAuthor)
var tags: List<Array<String>> = listOf(replyToPost, replyToAuthor)
if (boostedPost is AddressableEvent) {
tags = tags + listOf(listOf("a", boostedPost.address().toTag()))
tags = tags + listOf(arrayOf("a", boostedPost.address().toTag()))
}
tags = tags + listOf(listOf("k", "${boostedPost.kind()}"))
tags = tags + listOf(arrayOf("k", "${boostedPost.kind()}"))
signer.sign(createdAt, kind, tags, content, onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady)
}
}
}
@@ -19,7 +19,7 @@ class GiftWrapEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -71,7 +71,7 @@ class GiftWrapEvent(
) {
val signer = NostrSignerInternal(KeyPair()) // GiftWrap is always a random key
val serializedContent = toJson(event)
val tags = listOf(listOf("p", recipientPubKey))
val tags = arrayOf(arrayOf("p", recipientPubKey))
signer.nip44Encrypt(serializedContent, recipientPubKey) {
signer.sign(createdAt, kind, tags, it, onReady)
@@ -13,7 +13,7 @@ class HTTPAuthorizationEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -35,12 +35,12 @@ class HTTPAuthorizationEvent(
}
val tags = listOfNotNull(
listOf("u", url),
listOf("method", method),
listOf("payload", hash)
arrayOf("u", url),
arrayOf("method", method),
arrayOf("payload", hash)
)
signer.sign(createdAt, kind, tags, "", onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), "", onReady)
}
}
}
@@ -12,7 +12,7 @@ class HighlightEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseTextNoteEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -32,7 +32,7 @@ class HighlightEvent(
createdAt: Long = TimeUtils.now(),
onReady: (HighlightEvent) -> Unit
) {
signer.sign(createdAt, kind, emptyList(), msg, onReady)
signer.sign(createdAt, kind, emptyArray(), msg, onReady)
}
}
}
@@ -14,7 +14,7 @@ class LiveActivitiesChatMessageEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseTextNoteEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -60,28 +60,28 @@ class LiveActivitiesChatMessageEvent(
) {
val content = message
val tags = mutableListOf(
listOf("a", activity.toTag(), "", "root")
arrayOf("a", activity.toTag(), "", "root")
)
replyTos?.forEach {
tags.add(listOf("e", it))
tags.add(arrayOf("e", it))
}
mentions?.forEach {
tags.add(listOf("p", it))
tags.add(arrayOf("p", it))
}
zapReceiver?.forEach {
tags.add(listOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString()))
tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString()))
}
if (markAsSensitive) {
tags.add(listOf("content-warning", ""))
tags.add(arrayOf("content-warning", ""))
}
zapRaiserAmount?.let {
tags.add(listOf("zapraiser", "$it"))
tags.add(arrayOf("zapraiser", "$it"))
}
geohash?.let {
tags.addAll(geohashMipMap(it))
}
signer.sign(createdAt, kind, tags, content, onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady)
}
}
}
@@ -13,7 +13,7 @@ class LiveActivitiesEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -55,7 +55,7 @@ class LiveActivitiesEvent(
createdAt: Long = TimeUtils.now(),
onReady: (LiveActivitiesEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
val tags = emptyArray<Array<String>>()
signer.sign(createdAt, kind, tags, "", onReady)
}
}
@@ -10,7 +10,7 @@ class LnZapEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : LnZapEventInterface, Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -18,7 +18,7 @@ class LnZapPaymentRequestEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -66,8 +66,7 @@ class LnZapPaymentRequestEvent(
) {
val serializedRequest = mapper.writeValueAsString(PayInvoiceMethod.create(lnInvoice))
val tags = mutableListOf<List<String>>()
tags.add(listOf("p", walletServicePubkey))
val tags = arrayOf(arrayOf("p", walletServicePubkey))
signer.nip04Encrypt(
serializedRequest,
@@ -16,7 +16,7 @@ class LnZapPaymentResponseEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -21,7 +21,7 @@ class LnZapPrivateEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -31,7 +31,7 @@ class LnZapPrivateEvent(
fun create(
signer: NostrSigner,
tags: List<List<String>> = emptyList(),
tags: Array<Array<String>> = emptyArray(),
content: String = "",
createdAt: Long = TimeUtils.now(),
onReady: (LnZapPrivateEvent) -> Unit
@@ -22,7 +22,7 @@ class LnZapRequestEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -89,25 +89,25 @@ class LnZapRequestEvent(
if (zapType == LnZapEvent.ZapType.NONZAP) return
var tags = listOf(
listOf("e", originalNote.id()),
listOf("p", toUserPubHex ?: originalNote.pubKey()),
listOf("relays") + relays
arrayOf("e", originalNote.id()),
arrayOf("p", toUserPubHex ?: originalNote.pubKey()),
arrayOf("relays") + relays
)
if (originalNote is AddressableEvent) {
tags = tags + listOf(listOf("a", originalNote.address().toTag()))
tags = tags + listOf(arrayOf("a", originalNote.address().toTag()))
}
if (pollOption != null && pollOption >= 0) {
tags = tags + listOf(listOf(POLL_OPTION, pollOption.toString()))
tags = tags + listOf(arrayOf(POLL_OPTION, pollOption.toString()))
}
if (zapType == LnZapEvent.ZapType.ANONYMOUS) {
tags = tags + listOf(listOf("anon"))
NostrSignerInternal(KeyPair()).sign(createdAt, kind, tags, message, onReady)
tags = tags + listOf(arrayOf("anon"))
NostrSignerInternal(KeyPair()).sign(createdAt, kind, tags.toTypedArray(), message, onReady)
} else if (zapType == LnZapEvent.ZapType.PRIVATE) {
tags = tags + listOf(listOf("anon", ""))
signer.sign(createdAt, kind, tags, message, onReady)
tags = tags + listOf(arrayOf("anon", ""))
signer.sign(createdAt, kind, tags.toTypedArray(), message, onReady)
} else {
signer.sign(createdAt, kind, tags, message, onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), message, onReady)
}
}
@@ -122,16 +122,16 @@ class LnZapRequestEvent(
) {
if (zapType == LnZapEvent.ZapType.NONZAP) return
var tags = listOf(
listOf("p", userHex),
listOf("relays") + relays
var tags = arrayOf(
arrayOf("p", userHex),
arrayOf("relays") + relays
)
if (zapType == LnZapEvent.ZapType.ANONYMOUS) {
tags = tags + listOf(listOf("anon", ""))
tags += arrayOf(arrayOf("anon", ""))
NostrSignerInternal(KeyPair()).sign(createdAt, kind, tags, message, onReady)
} else if (zapType == LnZapEvent.ZapType.PRIVATE) {
tags = tags + listOf(listOf("anon", ""))
tags += arrayOf(arrayOf("anon", ""))
signer.sign(createdAt, kind, tags, message, onReady)
} else {
signer.sign(createdAt, kind, tags, message, onReady)
@@ -13,7 +13,7 @@ class LongTextNoteEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseTextNoteEvent(id, pubKey, createdAt, kind, tags, content, sig), AddressableEvent {
@@ -42,14 +42,14 @@ class LongTextNoteEvent(
createdAt: Long = TimeUtils.now(),
onReady: (LongTextNoteEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
val tags = mutableListOf<Array<String>>()
replyTos?.forEach {
tags.add(listOf("e", it))
tags.add(arrayOf("e", it))
}
mentions?.forEach {
tags.add(listOf("p", it))
tags.add(arrayOf("p", it))
}
signer.sign(createdAt, kind, tags, msg, onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), msg, onReady)
}
}
}
@@ -123,7 +123,7 @@ class MetadataEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -157,13 +157,13 @@ class MetadataEvent(
createdAt: Long = TimeUtils.now(),
onReady: (MetadataEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
val tags = mutableListOf<Array<String>>()
identities.forEach {
tags.add(listOf("i", it.platformIdentity(), it.proof))
tags.add(arrayOf("i", it.platformIdentity(), it.proof))
}
signer.sign(createdAt, kind, tags, contactMetaData, onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), contactMetaData, onReady)
}
}
}
@@ -18,7 +18,7 @@ class MuteListEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : GeneralListEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -61,10 +61,10 @@ class MuteListEvent(
fun createListWithTag(key: String, tag: String, isPrivate: Boolean, signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (MuteListEvent) -> Unit) {
if (isPrivate) {
encryptTags(listOf(listOf(key, tag)), signer) { encryptedTags ->
encryptTags(arrayOf(arrayOf(key, tag)), signer) { encryptedTags ->
create(
content = encryptedTags,
tags = emptyList(),
tags = emptyArray(),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -73,7 +73,7 @@ class MuteListEvent(
} else {
create(
content = "",
tags = listOf(listOf(key, tag)),
tags = arrayOf(arrayOf(key, tag)),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -95,7 +95,7 @@ class MuteListEvent(
encryptTags(
privateTags = privateTags.plus(
listPubKeyHex.map {
listOf("p", it)
arrayOf("p", it)
}
),
signer = signer
@@ -114,7 +114,7 @@ class MuteListEvent(
content = earlierVersion.content,
tags = earlierVersion.tags.plus(
listPubKeyHex.map {
listOf("p", it)
arrayOf("p", it)
}
),
signer = signer,
@@ -138,7 +138,7 @@ class MuteListEvent(
if (isPrivate) {
earlierVersion.privateTagsOrEmpty(signer) { privateTags ->
encryptTags(
privateTags = privateTags.plus(element = listOf(key, tag)),
privateTags = privateTags.plus(element = arrayOf(key, tag)),
signer = signer
) { encryptedTags ->
create(
@@ -153,7 +153,7 @@ class MuteListEvent(
} else {
create(
content = earlierVersion.content,
tags = earlierVersion.tags.plus(element = listOf(key, tag)),
tags = earlierVersion.tags.plus(element = arrayOf(key, tag)),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -177,12 +177,12 @@ class MuteListEvent(
if (isPrivate) {
earlierVersion.privateTagsOrEmpty(signer) { privateTags ->
encryptTags(
privateTags = privateTags.filter { it.size > 1 && !(it[0] == key && it[1] == tag) },
privateTags = privateTags.filter { it.size > 1 && !(it[0] == key && it[1] == tag) }.toTypedArray(),
signer = signer
) { encryptedTags ->
create(
content = encryptedTags,
tags = earlierVersion.tags.filter { it.size > 1 && !(it[0] == key && it[1] == tag) },
tags = earlierVersion.tags.filter { it.size > 1 && !(it[0] == key && it[1] == tag) }.toTypedArray(),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -192,7 +192,7 @@ class MuteListEvent(
} else {
create(
content = earlierVersion.content,
tags = earlierVersion.tags.filter { it.size > 1 && !(it[0] == key && it[1] == tag) },
tags = earlierVersion.tags.filter { it.size > 1 && !(it[0] == key && it[1] == tag) }.toTypedArray(),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -204,7 +204,7 @@ class MuteListEvent(
fun create(
content: String,
tags: List<List<String>>,
tags: Array<Array<String>>,
signer: NostrSigner,
createdAt: Long = TimeUtils.now(),
onReady: (MuteListEvent) -> Unit
@@ -13,7 +13,7 @@ class NNSEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -29,7 +29,7 @@ class NNSEvent(
createdAt: Long = TimeUtils.now(),
onReady: (NNSEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
val tags = emptyArray<Array<String>>()
signer.sign(createdAt, kind, tags, "", onReady)
}
}
@@ -15,7 +15,7 @@ class PeopleListEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : GeneralListEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -94,10 +94,10 @@ class PeopleListEvent(
fun createListWithTag(name: String, key: String, tag: String, isPrivate: Boolean, signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (PeopleListEvent) -> Unit) {
if (isPrivate) {
encryptTags(listOf(listOf(key, tag)), signer) { encryptedTags ->
encryptTags(arrayOf(arrayOf(key, tag)), signer) { encryptedTags ->
create(
content = encryptedTags,
tags = listOf(listOf("d", name)),
tags = arrayOf(arrayOf("d", name)),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -106,7 +106,7 @@ class PeopleListEvent(
} else {
create(
content = "",
tags = listOf(listOf("d", name), listOf(key, tag)),
tags = arrayOf(arrayOf("d", name), arrayOf(key, tag)),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -128,7 +128,7 @@ class PeopleListEvent(
encryptTags(
privateTags = privateTags.plus(
listPubKeyHex.map {
listOf("p", it)
arrayOf("p", it)
}
),
signer = signer
@@ -147,7 +147,7 @@ class PeopleListEvent(
content = earlierVersion.content,
tags = earlierVersion.tags.plus(
listPubKeyHex.map {
listOf("p", it)
arrayOf("p", it)
}
),
signer = signer,
@@ -171,7 +171,7 @@ class PeopleListEvent(
if (isPrivate) {
earlierVersion.privateTagsOrEmpty(signer) { privateTags ->
encryptTags(
privateTags = privateTags.plus(element = listOf(key, tag)),
privateTags = privateTags.plus(element = arrayOf(key, tag)),
signer = signer
) { encryptedTags ->
create(
@@ -186,7 +186,7 @@ class PeopleListEvent(
} else {
create(
content = earlierVersion.content,
tags = earlierVersion.tags.plus(element = listOf(key, tag)),
tags = earlierVersion.tags.plus(element = arrayOf(key, tag)),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -210,12 +210,12 @@ class PeopleListEvent(
if (isPrivate) {
earlierVersion.privateTagsOrEmpty(signer) { privateTags ->
encryptTags(
privateTags = privateTags.filter { it.size > 1 && !(it[0] == key && it[1] == tag) },
privateTags = privateTags.filter { it.size > 1 && !(it[0] == key && it[1] == tag) }.toTypedArray(),
signer = signer
) { encryptedTags ->
create(
content = encryptedTags,
tags = earlierVersion.tags.filter { it.size > 1 && !(it[0] == key && it[1] == tag) },
tags = earlierVersion.tags.filter { it.size > 1 && !(it[0] == key && it[1] == tag) }.toTypedArray(),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -225,7 +225,7 @@ class PeopleListEvent(
} else {
create(
content = earlierVersion.content,
tags = earlierVersion.tags.filter { it.size > 1 && !(it[0] == key && it[1] == tag) },
tags = earlierVersion.tags.filter { it.size > 1 && !(it[0] == key && it[1] == tag) }.toTypedArray(),
signer = signer,
createdAt = createdAt,
onReady = onReady
@@ -237,7 +237,7 @@ class PeopleListEvent(
fun create(
content: String,
tags: List<List<String>>,
tags: Array<Array<String>>,
signer: NostrSigner,
createdAt: Long = TimeUtils.now(),
onReady: (PeopleListEvent) -> Unit
@@ -13,7 +13,7 @@ class PinListEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -29,12 +29,12 @@ class PinListEvent(
createdAt: Long = TimeUtils.now(),
onReady: (PinListEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
val tags = mutableListOf<Array<String>>()
pins.forEach {
tags.add(listOf("pin", it))
tags.add(arrayOf("pin", it))
}
signer.sign(createdAt, kind, tags, "", onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), "", onReady)
}
}
}
@@ -19,7 +19,7 @@ class PollNoteEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
// ots: String?, TODO implement OTS: https://github.com/opentimestamps/java-opentimestamps
content: String,
sig: HexKey
@@ -62,45 +62,45 @@ class PollNoteEvent(
geohash: String? = null,
onReady: (PollNoteEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
val tags = mutableListOf<Array<String>>()
replyTos?.forEach {
tags.add(listOf("e", it))
tags.add(arrayOf("e", it))
}
mentions?.forEach {
tags.add(listOf("p", it))
tags.add(arrayOf("p", it))
}
addresses?.forEach {
tags.add(listOf("a", it.toTag()))
tags.add(arrayOf("a", it.toTag()))
}
pollOptions.forEach { poll_op ->
tags.add(listOf(POLL_OPTION, poll_op.key.toString(), poll_op.value))
tags.add(arrayOf(POLL_OPTION, poll_op.key.toString(), poll_op.value))
}
valueMaximum?.let {
tags.add(listOf(VALUE_MAXIMUM, valueMaximum.toString()))
tags.add(arrayOf(VALUE_MAXIMUM, valueMaximum.toString()))
}
valueMinimum?.let {
tags.add(listOf(VALUE_MINIMUM, valueMinimum.toString()))
tags.add(arrayOf(VALUE_MINIMUM, valueMinimum.toString()))
}
consensusThreshold?.let {
tags.add(listOf(CONSENSUS_THRESHOLD, consensusThreshold.toString()))
tags.add(arrayOf(CONSENSUS_THRESHOLD, consensusThreshold.toString()))
}
closedAt?.let {
tags.add(listOf(CLOSED_AT, closedAt.toString()))
tags.add(arrayOf(CLOSED_AT, closedAt.toString()))
}
zapReceiver?.forEach {
tags.add(listOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString()))
tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString()))
}
if (markAsSensitive) {
tags.add(listOf("content-warning", ""))
tags.add(arrayOf("content-warning", ""))
}
zapRaiserAmount?.let {
tags.add(listOf("zapraiser", "$it"))
tags.add(arrayOf("zapraiser", "$it"))
}
geohash?.let {
tags.addAll(geohashMipMap(it))
}
signer.sign(createdAt, kind, tags, msg, onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), msg, onReady)
}
}
}
@@ -19,7 +19,7 @@ class PrivateDmEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig), ChatroomKeyable {
@@ -109,38 +109,38 @@ class PrivateDmEvent(
onReady: (PrivateDmEvent) -> Unit
) {
val message = if (advertiseNip18) { nip18Advertisement } else { "" } + msg
val tags = mutableListOf<List<String>>()
val tags = mutableListOf<Array<String>>()
publishedRecipientPubKey?.let {
tags.add(listOf("p", publishedRecipientPubKey))
tags.add(arrayOf("p", publishedRecipientPubKey))
}
replyTos?.forEach {
tags.add(listOf("e", it))
tags.add(arrayOf("e", it))
}
mentions?.forEach {
tags.add(listOf("p", it))
tags.add(arrayOf("p", it))
}
zapReceiver?.forEach {
tags.add(listOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString()))
tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString()))
}
if (markAsSensitive) {
tags.add(listOf("content-warning", ""))
tags.add(arrayOf("content-warning", ""))
}
zapRaiserAmount?.let {
tags.add(listOf("zapraiser", "$it"))
tags.add(arrayOf("zapraiser", "$it"))
}
geohash?.let {
tags.addAll(geohashMipMap(it))
}
signer.nip04Encrypt(message, recipientPubKey) { content ->
signer.sign(createdAt, kind, tags, content, onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady)
}
}
}
}
fun geohashMipMap(geohash: String): List<List<String>> {
fun geohashMipMap(geohash: String): Array<Array<String>> {
return geohash.indices.asSequence().map {
listOf("g", geohash.substring(0, it+1))
}.toList().reversed()
arrayOf("g", geohash.substring(0, it+1))
}.toList().reversed().toTypedArray()
}
@@ -13,7 +13,7 @@ class ReactionEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -33,25 +33,25 @@ class ReactionEvent(
}
fun create(content: String, originalNote: EventInterface, signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (ReactionEvent) -> Unit) {
var tags = listOf(listOf("e", originalNote.id()), listOf("p", originalNote.pubKey()))
var tags = listOf(arrayOf("e", originalNote.id()), arrayOf("p", originalNote.pubKey()))
if (originalNote is AddressableEvent) {
tags = tags + listOf(listOf("a", originalNote.address().toTag()))
tags = tags + listOf(arrayOf("a", originalNote.address().toTag()))
}
return signer.sign(createdAt, kind, tags, content, onReady)
return signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady)
}
fun create(emojiUrl: EmojiUrl, originalNote: EventInterface, signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (ReactionEvent) -> Unit) {
val content = ":${emojiUrl.code}:"
var tags = listOf(
listOf("e", originalNote.id()),
listOf("p", originalNote.pubKey()),
listOf("emoji", emojiUrl.code, emojiUrl.url)
var tags = arrayOf(
arrayOf("e", originalNote.id()),
arrayOf("p", originalNote.pubKey()),
arrayOf("emoji", emojiUrl.code, emojiUrl.url)
)
if (originalNote is AddressableEvent) {
tags = tags + listOf(listOf("a", originalNote.address().toTag()))
tags += arrayOf(arrayOf("a", originalNote.address().toTag()))
}
signer.sign(createdAt, kind, tags, content, onReady)
@@ -13,7 +13,7 @@ class RecommendRelayEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -30,8 +30,7 @@ class RecommendRelayEvent(
onReady: (RecommendRelayEvent) -> Unit
) {
val content = relay.toString()
val tags = listOf<List<String>>()
signer.sign(createdAt, kind, tags, content, onReady)
signer.sign(createdAt, kind, emptyArray(), content, onReady)
}
}
}
@@ -12,7 +12,7 @@ class RelayAuthEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -30,9 +30,9 @@ class RelayAuthEvent(
onReady: (RelayAuthEvent) -> Unit
) {
val content = ""
val tags = listOf(
listOf("relay", relay),
listOf("challenge", challenge)
val tags = arrayOf(
arrayOf("relay", relay),
arrayOf("challenge", challenge)
)
signer.sign(createdAt, kind, tags, content, onReady)
}
@@ -13,7 +13,7 @@ class RelaySetEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -29,12 +29,12 @@ class RelaySetEvent(
createdAt: Long = TimeUtils.now(),
onReady: (RelaySetEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
val tags = mutableListOf<Array<String>>()
relays.forEach {
tags.add(listOf("r", it))
tags.add(arrayOf("r", it))
}
signer.sign(createdAt, kind, tags, "", onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), "", onReady)
}
}
}
@@ -17,7 +17,7 @@ class ReportEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -63,13 +63,13 @@ class ReportEvent(
createdAt: Long = TimeUtils.now(),
onReady: (ReportEvent) -> Unit
) {
val reportPostTag = listOf("e", reportedPost.id(), type.name.lowercase())
val reportAuthorTag = listOf("p", reportedPost.pubKey(), type.name.lowercase())
val reportPostTag = arrayOf("e", reportedPost.id(), type.name.lowercase())
val reportAuthorTag = arrayOf("p", reportedPost.pubKey(), type.name.lowercase())
var tags: List<List<String>> = listOf(reportPostTag, reportAuthorTag)
var tags: Array<Array<String>> = arrayOf(reportPostTag, reportAuthorTag)
if (reportedPost is AddressableEvent) {
tags = tags + listOf(listOf("a", reportedPost.address().toTag()))
tags = tags + listOf(arrayOf("a", reportedPost.address().toTag()))
}
signer.sign(createdAt, kind, tags, content, onReady)
@@ -84,9 +84,9 @@ class ReportEvent(
) {
val content = ""
val reportAuthorTag = listOf("p", reportedUser, type.name.lowercase())
val reportAuthorTag = arrayOf("p", reportedUser, type.name.lowercase())
val tags: List<List<String>> = listOf(reportAuthorTag)
val tags: Array<Array<String>> = arrayOf(reportAuthorTag)
signer.sign(createdAt, kind, tags, content, onReady)
}
}
@@ -13,7 +13,7 @@ class RepostEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : Event(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -38,13 +38,13 @@ class RepostEvent(
) {
val content = boostedPost.toJson()
val replyToPost = listOf("e", boostedPost.id())
val replyToAuthor = listOf("p", boostedPost.pubKey())
val replyToPost = arrayOf("e", boostedPost.id())
val replyToAuthor = arrayOf("p", boostedPost.pubKey())
var tags: List<List<String>> = listOf(replyToPost, replyToAuthor)
var tags: Array<Array<String>> = arrayOf(replyToPost, replyToAuthor)
if (boostedPost is AddressableEvent) {
tags = tags + listOf(listOf("a", boostedPost.address().toTag()))
tags = tags + listOf(arrayOf("a", boostedPost.address().toTag()))
}
signer.sign(createdAt, kind, tags, content, onReady)
@@ -19,7 +19,7 @@ class SealedGossipEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
): WrappedEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -85,10 +85,9 @@ class SealedGossipEvent(
onReady: (SealedGossipEvent) -> Unit
) {
val msg = Gossip.toJson(gossip)
val tags = listOf<List<String>>()
signer.nip44Encrypt(msg, encryptTo) { content ->
signer.sign(createdAt, kind, tags, content, onReady)
signer.sign(createdAt, kind, emptyArray(), content, onReady)
}
}
}
@@ -101,14 +100,14 @@ class Gossip(
@JsonProperty("created_at")
val createdAt: Long?,
val kind: Int?,
val tags: List<List<String>>?,
val tags: Array<Array<String>>?,
val content: String?
) {
fun mergeWith(event: SealedGossipEvent): Event {
val newPubKey = pubKey?.ifBlank { null } ?: event.pubKey
val newCreatedAt = if (createdAt != null && createdAt > 1000) createdAt else event.createdAt
val newKind = kind ?: -1
val newTags = (tags ?: emptyList()).plus(event.tags)
val newTags = (tags ?: emptyArray()).plus(event.tags)
val newContent = content ?: ""
val newID = id?.ifBlank { null } ?: Event.generateId(newPubKey, newCreatedAt, newKind, newTags, newContent).toHexKey()
val sig = ""
@@ -14,7 +14,7 @@ class StatusEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -30,12 +30,12 @@ class StatusEvent(
createdAt: Long = TimeUtils.now(),
onReady: (StatusEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
val tags = mutableListOf<Array<String>>()
tags.add(listOf("d", type))
expiration?.let { tags.add(listOf("expiration", it.toString())) }
tags.add(arrayOf("d", type))
expiration?.let { tags.add(arrayOf("expiration", it.toString())) }
signer.sign(createdAt, kind, tags, msg, onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), msg, onReady)
}
fun update(
@@ -57,7 +57,7 @@ class StatusEvent(
) {
val msg = ""
val tags = event.tags.filter { it.size > 1 && it[0] == "d" }
signer.sign(createdAt, kind, tags, msg, onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), msg, onReady)
}
}
}
@@ -16,7 +16,7 @@ class TextNoteEvent(
id: HexKey,
pubKey: HexKey,
createdAt: Long,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
sig: HexKey
) : BaseTextNoteEvent(id, pubKey, createdAt, kind, tags, content, sig) {
@@ -43,61 +43,61 @@ class TextNoteEvent(
createdAt: Long = TimeUtils.now(),
onReady: (TextNoteEvent) -> Unit
) {
val tags = mutableListOf<List<String>>()
val tags = mutableListOf<Array<String>>()
replyTos?.forEach {
if (it == root) {
tags.add(listOf("e", it, "", "root"))
tags.add(arrayOf("e", it, "", "root"))
} else if (it == replyingTo) {
tags.add(listOf("e", it, "", "reply"))
tags.add(arrayOf("e", it, "", "reply"))
} else if (it in directMentions) {
tags.add(listOf("e", it, "", "mention"))
tags.add(arrayOf("e", it, "", "mention"))
} else {
tags.add(listOf("e", it))
tags.add(arrayOf("e", it))
}
}
mentions?.forEach {
if (it in directMentions) {
tags.add(listOf("p", it, "", "mention"))
tags.add(arrayOf("p", it, "", "mention"))
} else {
tags.add(listOf("p", it))
tags.add(arrayOf("p", it))
}
}
addresses?.forEach {
val aTag = it.toTag()
if (aTag == root) {
tags.add(listOf("a", aTag, "", "root"))
tags.add(arrayOf("a", aTag, "", "root"))
} else if (aTag == replyingTo) {
tags.add(listOf("a", aTag, "", "reply"))
tags.add(arrayOf("a", aTag, "", "reply"))
} else if (aTag in directMentions) {
tags.add(listOf("a", aTag, "", "mention"))
tags.add(arrayOf("a", aTag, "", "mention"))
} else {
tags.add(listOf("a", aTag))
tags.add(arrayOf("a", aTag))
}
}
findHashtags(msg).forEach {
tags.add(listOf("t", it))
tags.add(listOf("t", it.lowercase()))
tags.add(arrayOf("t", it))
tags.add(arrayOf("t", it.lowercase()))
}
extraTags?.forEach {
tags.add(listOf("t", it))
tags.add(arrayOf("t", it))
}
zapReceiver?.forEach {
tags.add(listOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString()))
tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString()))
}
findURLs(msg).forEach {
tags.add(listOf("r", it))
tags.add(arrayOf("r", it))
}
if (markAsSensitive) {
tags.add(listOf("content-warning", ""))
tags.add(arrayOf("content-warning", ""))
}
zapRaiserAmount?.let {
tags.add(listOf("zapraiser", "$it"))
tags.add(arrayOf("zapraiser", "$it"))
}
geohash?.let {
tags.addAll(geohashMipMap(it))
}
signer.sign(createdAt, kind, tags, msg, onReady)
signer.sign(createdAt, kind, tags.toTypedArray(), msg, onReady)
}
}
}
@@ -11,7 +11,7 @@ import kotlinx.coroutines.withContext
abstract class NostrSigner(val pubKey: HexKey) {
abstract fun <T: Event> sign(createdAt: Long, kind: Int, tags: List<List<String>>, content: String, onReady: (T) -> Unit)
abstract fun <T: Event> sign(createdAt: Long, kind: Int, tags: Array<Array<String>>, content: String, onReady: (T) -> Unit)
abstract fun nip04Encrypt(decryptedContent: String, toPublicKey: HexKey, onReady: (String)-> Unit)
abstract fun nip04Decrypt(encryptedContent: String, fromPublicKey: HexKey, onReady: (String)-> Unit)
@@ -17,7 +17,7 @@ class NostrSignerExternal(
override fun <T: Event> sign(
createdAt: Long,
kind: Int,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
onReady: (T) -> Unit
) {
@@ -21,7 +21,7 @@ class NostrSignerInternal(val keyPair: KeyPair): NostrSigner(keyPair.pubKey.toHe
override fun <T: Event> sign(
createdAt: Long,
kind: Int,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
onReady: (T)-> Unit
) {
@@ -37,7 +37,7 @@ class NostrSignerInternal(val keyPair: KeyPair): NostrSigner(keyPair.pubKey.toHe
fun isUnsignedPrivateEvent(
kind: Int,
tags: List<List<String>>,
tags: Array<Array<String>>,
): Boolean {
return kind == LnZapRequestEvent.kind && tags.any { t -> t.size > 1 && t[0] == "anon" && t[1].isBlank() }
}
@@ -45,7 +45,7 @@ class NostrSignerInternal(val keyPair: KeyPair): NostrSigner(keyPair.pubKey.toHe
fun <T: Event> signNormal(
createdAt: Long,
kind: Int,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
onReady: (T)-> Unit
) {
@@ -123,7 +123,7 @@ class NostrSignerInternal(val keyPair: KeyPair): NostrSigner(keyPair.pubKey.toHe
private fun <T> signPrivateZap(
createdAt: Long,
kind: Int,
tags: List<List<String>>,
tags: Array<Array<String>>,
content: String,
onReady: (T)-> Unit
) {
@@ -138,7 +138,7 @@ class NostrSignerInternal(val keyPair: KeyPair): NostrSigner(keyPair.pubKey.toHe
val encryptionPrivateKey =
LnZapRequestEvent.createEncryptionPrivateKey(keyPair.privKey.toHexKey(), idToGeneratePrivateKey, createdAt)
val fullTagsNoAnon = tags.filter { t -> t.getOrNull(0) != "anon" }
val fullTagsNoAnon = tags.filter { t -> t.getOrNull(0) != "anon" }.toTypedArray()
LnZapPrivateEvent.create(this, fullTagsNoAnon, content) {
val noteJson = it.toJson()
@@ -148,10 +148,10 @@ class NostrSignerInternal(val keyPair: KeyPair): NostrSigner(keyPair.pubKey.toHe
userHex.hexToByteArray()
)
val newTags = tags.filter { t -> t.getOrNull(0) != "anon" } + listOf(listOf("anon", encryptedContent))
val newTags = tags.filter { t -> t.getOrNull(0) != "anon" } + listOf(arrayOf("anon", encryptedContent))
val newContent = ""
NostrSignerInternal(KeyPair(encryptionPrivateKey)).signNormal(createdAt, kind, newTags, newContent, onReady)
NostrSignerInternal(KeyPair(encryptionPrivateKey)).signNormal(createdAt, kind, newTags.toTypedArray(), newContent, onReady)
}
}