Support for NIP-31 alt tags

This commit is contained in:
Vitor Pamplona
2023-12-15 18:19:37 -05:00
parent 7b55b69c12
commit fccfb2aaba
53 changed files with 162 additions and 45 deletions
@@ -477,10 +477,10 @@ class Account(
} }
} }
suspend fun sendNewUserMetadata(toString: String, identities: List<IdentityClaim>) { suspend fun sendNewUserMetadata(toString: String, newName: String, identities: List<IdentityClaim>) {
if (!isWriteable()) return if (!isWriteable()) return
MetadataEvent.create(toString, identities, signer) { MetadataEvent.create(toString, newName, identities, signer) {
Client.send(it) Client.send(it)
LocalCache.justConsume(it, null) LocalCache.justConsume(it, null)
} }
@@ -124,7 +124,7 @@ class NewUserMetadataViewModel : ViewModel() {
ObjectMapper().writeValue(writer, currentJson) ObjectMapper().writeValue(writer, currentJson)
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
account.sendNewUserMetadata(writer.buffer.toString(), newClaims) account.sendNewUserMetadata(writer.buffer.toString(), displayName.value.trim(), newClaims)
} }
clear() clear()
} }
@@ -51,7 +51,7 @@ class AdvertisedRelayListEvent(
} else { } else {
arrayOf(it.relayUrl, it.type.code) arrayOf(it.relayUrl, it.type.code)
} }
}.toTypedArray() }.plusElement(arrayOf("alt", "Relay list event with ${list.size} relays")).toTypedArray()
val msg = "" val msg = ""
signer.sign(createdAt, kind, tags, msg, onReady) signer.sign(createdAt, kind, tags, msg, onReady)
@@ -50,11 +50,14 @@ class AppDefinitionEvent(
const val kind = 31990 const val kind = 31990
fun create( fun create(
details: UserMetadata,
signer: NostrSigner, signer: NostrSigner,
createdAt: Long = TimeUtils.now(), createdAt: Long = TimeUtils.now(),
onReady: (AppDefinitionEvent) -> Unit onReady: (AppDefinitionEvent) -> Unit
) { ) {
val tags = emptyArray<Array<String>>() val tags = arrayOf(
arrayOf("alt", "App definition event for ${details.name}")
)
signer.sign(createdAt, kind, tags, "", onReady) signer.sign(createdAt, kind, tags, "", onReady)
} }
} }
@@ -21,13 +21,16 @@ class AppRecommendationEvent(
companion object { companion object {
const val kind = 31989 const val kind = 31989
const val alt = "App recommendations by the author"
fun create( fun create(
signer: NostrSigner, signer: NostrSigner,
createdAt: Long = TimeUtils.now(), createdAt: Long = TimeUtils.now(),
onReady: (AppRecommendationEvent) -> Unit onReady: (AppRecommendationEvent) -> Unit
) { ) {
val tags = emptyArray<Array<String>>() val tags = arrayOf(
arrayOf("alt", alt)
)
signer.sign(createdAt, kind, tags, "", onReady) signer.sign(createdAt, kind, tags, "", onReady)
} }
} }
@@ -24,6 +24,7 @@ class AudioHeaderEvent(
companion object { companion object {
const val kind = 1808 const val kind = 1808
const val alt = "Audio header"
private const val DOWNLOAD_URL = "download_url" private const val DOWNLOAD_URL = "download_url"
private const val STREAM_URL = "stream_url" private const val STREAM_URL = "stream_url"
@@ -49,7 +50,8 @@ class AudioHeaderEvent(
} else { } else {
null null
} }
} },
arrayOf("alt", alt)
).toTypedArray() ).toTypedArray()
signer.sign(createdAt, kind, tags, description, onReady) signer.sign(createdAt, kind, tags, description, onReady)
@@ -28,6 +28,7 @@ class AudioTrackEvent(
companion object { companion object {
const val kind = 31337 const val kind = 31337
const val alt = "Audio track"
private const val TYPE = "c" private const val TYPE = "c"
private const val PRICE = "price" private const val PRICE = "price"
@@ -50,7 +51,8 @@ class AudioTrackEvent(
arrayOf(TYPE, type), arrayOf(TYPE, type),
price?.let { arrayOf(PRICE, it) }, price?.let { arrayOf(PRICE, it) },
cover?.let { arrayOf(COVER, it) }, cover?.let { arrayOf(COVER, it) },
subject?.let { arrayOf(SUBJECT, it) } subject?.let { arrayOf(SUBJECT, it) },
arrayOf("alt", alt)
).toTypedArray() ).toTypedArray()
signer.sign(createdAt, kind, tags, "", onReady) signer.sign(createdAt, kind, tags, "", onReady)
@@ -18,5 +18,6 @@ class BadgeAwardEvent(
companion object { companion object {
const val kind = 8 const val kind = 8
const val alt = "Badge award"
} }
} }
@@ -20,5 +20,6 @@ class BadgeDefinitionEvent(
companion object { companion object {
const val kind = 30009 const val kind = 30009
const val alt = "Badge definition"
} }
} }
@@ -24,5 +24,6 @@ class BadgeProfilesEvent(
companion object { companion object {
const val kind = 30008 const val kind = 30008
const val standardDTAg = "profile_badges" const val standardDTAg = "profile_badges"
const val alt = "List of accepted badges by the author"
} }
} }
@@ -19,6 +19,7 @@ class BookmarkListEvent(
) : GeneralListEvent(id, pubKey, createdAt, kind, tags, content, sig) { ) : GeneralListEvent(id, pubKey, createdAt, kind, tags, content, sig) {
companion object { companion object {
const val kind = 30001 const val kind = 30001
const val alt = "List of bookmarks"
fun addEvent( fun addEvent(
earlierVersion: BookmarkListEvent?, earlierVersion: BookmarkListEvent?,
@@ -166,7 +167,13 @@ class BookmarkListEvent(
createdAt: Long = TimeUtils.now(), createdAt: Long = TimeUtils.now(),
onReady: (BookmarkListEvent) -> Unit onReady: (BookmarkListEvent) -> Unit
) { ) {
signer.sign(createdAt, kind, tags, content, onReady) val newTags = if (tags.any { it.size > 1 && it[0] == "alt" }) {
tags
} else {
tags + arrayOf("alt", alt)
}
signer.sign(createdAt, kind, newTags, content, onReady)
} }
fun create( fun create(
@@ -196,6 +203,7 @@ class BookmarkListEvent(
addresses?.forEach { addresses?.forEach {
tags.add(arrayOf("a", it.toTag())) tags.add(arrayOf("a", it.toTag()))
} }
tags.add(arrayOf("alt", alt))
createPrivateTags(privEvents, privUsers, privAddresses, signer) { content -> createPrivateTags(privEvents, privUsers, privAddresses, signer) { content ->
signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady) signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady)
@@ -27,13 +27,14 @@ class CalendarDateSlotEvent(
companion object { companion object {
const val kind = 31922 const val kind = 31922
const val alt = "Full-day calendar event"
fun create( fun create(
signer: NostrSigner, signer: NostrSigner,
createdAt: Long = TimeUtils.now(), createdAt: Long = TimeUtils.now(),
onReady: (CalendarDateSlotEvent) -> Unit onReady: (CalendarDateSlotEvent) -> Unit
) { ) {
val tags = emptyArray<Array<String>>() val tags = arrayOf(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags, "", onReady) signer.sign(createdAt, kind, tags, "", onReady)
} }
} }
@@ -19,13 +19,14 @@ class CalendarEvent(
) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) { ) : BaseAddressableEvent(id, pubKey, createdAt, kind, tags, content, sig) {
companion object { companion object {
const val kind = 31924 const val kind = 31924
const val alt = "Calendar"
fun create( fun create(
signer: NostrSigner, signer: NostrSigner,
createdAt: Long = TimeUtils.now(), createdAt: Long = TimeUtils.now(),
onReady: (CalendarEvent) -> Unit onReady: (CalendarEvent) -> Unit
) { ) {
val tags = emptyArray<Array<String>>() val tags = arrayOf(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags, "", onReady) signer.sign(createdAt, kind, tags, "", onReady)
} }
} }
@@ -29,13 +29,14 @@ class CalendarRSVPEvent(
companion object { companion object {
const val kind = 31925 const val kind = 31925
const val alt = "Calendar event's invitation response"
fun create( fun create(
signer: NostrSigner, signer: NostrSigner,
createdAt: Long = TimeUtils.now(), createdAt: Long = TimeUtils.now(),
onReady: (CalendarRSVPEvent) -> Unit onReady: (CalendarRSVPEvent) -> Unit
) { ) {
val tags = emptyArray<Array<String>>() val tags = arrayOf(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags, "", onReady) signer.sign(createdAt, kind, tags, "", onReady)
} }
} }
@@ -31,13 +31,14 @@ class CalendarTimeSlotEvent(
companion object { companion object {
const val kind = 31923 const val kind = 31923
const val alt = "Calendar time-slot event"
fun create( fun create(
signer: NostrSigner, signer: NostrSigner,
createdAt: Long = TimeUtils.now(), createdAt: Long = TimeUtils.now(),
onReady: (CalendarTimeSlotEvent) -> Unit onReady: (CalendarTimeSlotEvent) -> Unit
) { ) {
val tags = emptyArray<Array<String>>() val tags = arrayOf(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags, "", onReady) signer.sign(createdAt, kind, tags, "", onReady)
} }
} }
@@ -65,7 +65,11 @@ class ChannelCreateEvent(
"" ""
} }
signer.sign(createdAt, kind, emptyArray(), content, onReady) val tags = arrayOf(
arrayOf("alt", "Public chat creation event ${channelInfo?.name?.let { "about ${it}" }}")
)
signer.sign(createdAt, kind, tags, content, onReady)
} }
} }
@@ -26,6 +26,7 @@ class ChannelHideMessageEvent(
companion object { companion object {
const val kind = 43 const val kind = 43
const val alt = "Hide message instruction for public chats"
fun create( fun create(
reason: String, reason: String,
@@ -35,9 +36,9 @@ class ChannelHideMessageEvent(
onReady: (ChannelHideMessageEvent) -> Unit onReady: (ChannelHideMessageEvent) -> Unit
) { ) {
val tags = val tags =
messagesToHide?.map { (messagesToHide?.map {
arrayOf("e", it) arrayOf("e", it)
}?.toTypedArray() ?: emptyArray() }?.toTypedArray() ?: emptyArray()) + arrayOf(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags, reason, onReady) signer.sign(createdAt, kind, tags, reason, onReady)
} }
@@ -25,6 +25,7 @@ class ChannelMessageEvent(
companion object { companion object {
const val kind = 42 const val kind = 42
const val alt = "Public chat message"
fun create( fun create(
message: String, message: String,
@@ -66,6 +67,9 @@ class ChannelMessageEvent(
//tags.add(arrayOf("nip94", it.toJson())) //tags.add(arrayOf("nip94", it.toJson()))
} }
} }
tags.add(
arrayOf("alt", alt)
)
signer.sign(createdAt, kind, tags.toTypedArray(), message, onReady) signer.sign(createdAt, kind, tags.toTypedArray(), message, onReady)
} }
@@ -30,6 +30,7 @@ class ChannelMetadataEvent(
companion object { companion object {
const val kind = 41 const val kind = 41
const val alt = "This is a public chat definition update"
fun create( fun create(
name: String?, name: String?,
@@ -65,7 +66,10 @@ class ChannelMetadataEvent(
"" ""
} }
val tags = listOf(arrayOf("e", originalChannelIdHex, "", "root")) val tags = listOf(
arrayOf("e", originalChannelIdHex, "", "root"),
arrayOf("alt", "Public chat update to ${newChannelInfo?.name}")
)
signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady) signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady)
} }
} }
@@ -26,6 +26,7 @@ class ChannelMuteUserEvent(
companion object { companion object {
const val kind = 44 const val kind = 44
const val alt = "Mute user instruction for public chats"
fun create( fun create(
reason: String, reason: String,
@@ -35,9 +36,9 @@ class ChannelMuteUserEvent(
onReady: (ChannelMuteUserEvent) -> Unit onReady: (ChannelMuteUserEvent) -> Unit
) { ) {
val content = reason val content = reason
val tags = usersToMute?.map { val tags = (usersToMute?.map {
arrayOf("p", it) arrayOf("p", it)
}?.toTypedArray() ?: emptyArray() }?.toTypedArray() ?: emptyArray()) + arrayOf(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags, content, onReady) signer.sign(createdAt, kind, tags, content, onReady)
} }
@@ -49,6 +49,7 @@ class ChatMessageEvent(
companion object { companion object {
const val kind = 14 const val kind = 14
const val alt = "Direct message"
fun create( fun create(
msg: String, msg: String,
@@ -89,6 +90,7 @@ class ChatMessageEvent(
subject?.let { subject?.let {
tags.add(arrayOf("subject", it)) tags.add(arrayOf("subject", it))
} }
tags.add(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags.toTypedArray(), msg, onReady) signer.sign(createdAt, kind, tags.toTypedArray(), msg, onReady)
} }
@@ -43,6 +43,7 @@ class ClassifiedsEvent(
companion object { companion object {
const val kind = 30402 const val kind = 30402
private val imageExtensions = listOf("png", "jpg", "gif", "bmp", "jpeg", "webp", "svg") private val imageExtensions = listOf("png", "jpg", "gif", "bmp", "jpeg", "webp", "svg")
const val alt = "Classifieds listing"
fun create( fun create(
dTag: String, dTag: String,
@@ -145,6 +146,7 @@ class ClassifiedsEvent(
//tags.add(arrayOf("nip94", it.toJson())) //tags.add(arrayOf("nip94", it.toJson()))
} }
} }
tags.add(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags.toTypedArray(), message, onReady) signer.sign(createdAt, kind, tags.toTypedArray(), message, onReady)
} }
@@ -25,14 +25,16 @@ class CommunityDefinitionEvent(
companion object { companion object {
const val kind = 34550 const val kind = 34550
const val alt = "Community definition"
fun create( fun create(
signer: NostrSigner, signer: NostrSigner,
createdAt: Long = TimeUtils.now(), createdAt: Long = TimeUtils.now(),
onReady: (CommunityDefinitionEvent) -> Unit onReady: (CommunityDefinitionEvent) -> Unit
) { ) {
val tags = emptyArray<Array<String>>() val tags = mutableListOf<Array<String>>()
signer.sign(createdAt, kind, tags, "", onReady) tags.add(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags.toTypedArray(), "", onReady)
} }
} }
} }
@@ -45,6 +45,7 @@ class CommunityPostApprovalEvent(
companion object { companion object {
const val kind = 4550 const val kind = 4550
const val alt = "Community post approval"
fun create( fun create(
approvedPost: Event, approvedPost: Event,
@@ -59,8 +60,9 @@ class CommunityPostApprovalEvent(
val replyToPost = arrayOf("e", approvedPost.id()) val replyToPost = arrayOf("e", approvedPost.id())
val replyToAuthor = arrayOf("p", approvedPost.pubKey()) val replyToAuthor = arrayOf("p", approvedPost.pubKey())
val innerKind = arrayOf("k", "${approvedPost.kind()}") val innerKind = arrayOf("k", "${approvedPost.kind()}")
val alt = arrayOf("alt", alt)
val tags: Array<Array<String>> = arrayOf(communities, replyToPost, replyToAuthor, innerKind) val tags: Array<Array<String>> = arrayOf(communities, replyToPost, replyToAuthor, innerKind, alt)
signer.sign(createdAt, kind, tags, content, onReady) signer.sign(createdAt, kind, tags, content, onReady)
} }
@@ -92,6 +92,7 @@ class ContactListEvent(
companion object { companion object {
const val kind = 3 const val kind = 3
const val alt = "Follow List"
fun createFromScratch( fun createFromScratch(
followUsers: List<Contact>, followUsers: List<Contact>,
@@ -282,7 +283,13 @@ class ContactListEvent(
createdAt: Long = TimeUtils.now(), createdAt: Long = TimeUtils.now(),
onReady: (ContactListEvent) -> Unit onReady: (ContactListEvent) -> Unit
) { ) {
signer.sign(createdAt, kind, tags, content, onReady) val newTags = if (tags.any { it.size > 1 && it[0] == "alt" }) {
tags
} else {
tags + arrayOf("alt", alt)
}
signer.sign(createdAt, kind, newTags, content, onReady)
} }
} }
@@ -21,10 +21,11 @@ class DeletionEvent(
companion object { companion object {
const val kind = 5 const val kind = 5
const val alt = "Deletion event"
fun create(deleteEvents: List<String>, signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (DeletionEvent) -> Unit) { fun create(deleteEvents: List<String>, signer: NostrSigner, createdAt: Long = TimeUtils.now(), onReady: (DeletionEvent) -> Unit) {
val content = "" val content = ""
val tags = deleteEvents.map { arrayOf("e", it) }.toTypedArray() val tags = deleteEvents.map { arrayOf("e", it) }.plusElement(arrayOf("alt", alt)).toTypedArray()
signer.sign(createdAt, kind, tags, content, onReady) signer.sign(createdAt, kind, tags, content, onReady)
} }
} }
@@ -19,6 +19,7 @@ class EmojiPackEvent(
companion object { companion object {
const val kind = 30030 const val kind = 30030
const val alt = "Emoji pack"
fun create( fun create(
name: String = "", name: String = "",
@@ -30,6 +31,7 @@ class EmojiPackEvent(
val tags = mutableListOf<Array<String>>() val tags = mutableListOf<Array<String>>()
tags.add(arrayOf("d", name)) tags.add(arrayOf("d", name))
tags.add(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady) signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady)
} }
@@ -23,6 +23,7 @@ class EmojiPackSelectionEvent(
companion object { companion object {
const val kind = 10030 const val kind = 10030
const val fixedDTag = "" const val fixedDTag = ""
const val alt = "Emoji selection"
fun create( fun create(
listOfEmojiPacks: List<ATag>?, listOfEmojiPacks: List<ATag>?,
@@ -37,6 +38,8 @@ class EmojiPackSelectionEvent(
tags.add(arrayOf("a", it.toTag())) tags.add(arrayOf("a", it.toTag()))
} }
tags.add(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags.toTypedArray(), msg, onReady) signer.sign(createdAt, kind, tags.toTypedArray(), msg, onReady)
} }
} }
@@ -35,6 +35,7 @@ class FileHeaderEvent(
companion object { companion object {
const val kind = 1063 const val kind = 1063
const val altDescription = "Verifiable file url"
private const val URL = "url" private const val URL = "url"
private const val ENCRYPTION_KEY = "aes-256-gcm" private const val ENCRYPTION_KEY = "aes-256-gcm"
@@ -70,7 +71,7 @@ class FileHeaderEvent(
arrayOf(URL, url), arrayOf(URL, url),
magnetUri?.let { arrayOf(MAGNET_URI, it) }, magnetUri?.let { arrayOf(MAGNET_URI, it) },
mimeType?.let { arrayOf(MIME_TYPE, it) }, mimeType?.let { arrayOf(MIME_TYPE, it) },
alt?.ifBlank { null }?.let { arrayOf(ALT, it) }, alt?.ifBlank { null }?.let { arrayOf(ALT, it) } ?: arrayOf("alt", altDescription),
hash?.let { arrayOf(HASH, it) }, hash?.let { arrayOf(HASH, it) },
size?.let { arrayOf(FILE_SIZE, it) }, size?.let { arrayOf(FILE_SIZE, it) },
dimensions?.let { arrayOf(DIMENSION, it) }, dimensions?.let { arrayOf(DIMENSION, it) },
@@ -23,6 +23,7 @@ class FileServersEvent(
companion object { companion object {
const val kind = 10096 const val kind = 10096
const val fixedDTag = "" const val fixedDTag = ""
const val alt = "File servers used by the author"
fun create( fun create(
listOfServers: List<String>, listOfServers: List<String>,
@@ -36,6 +37,7 @@ class FileServersEvent(
listOfServers.forEach { listOfServers.forEach {
tags.add(arrayOf("server", it)) tags.add(arrayOf("server", it))
} }
tags.add(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags.toTypedArray(), msg, onReady) signer.sign(createdAt, kind, tags.toTypedArray(), msg, onReady)
} }
@@ -33,6 +33,7 @@ class FileStorageEvent(
companion object { companion object {
const val kind = 1064 const val kind = 1064
const val alt = "Binary data"
private const val TYPE = "type" private const val TYPE = "type"
private const val DECRYPT = "decrypt" private const val DECRYPT = "decrypt"
@@ -49,7 +50,8 @@ class FileStorageEvent(
onReady: (FileStorageEvent) -> Unit onReady: (FileStorageEvent) -> Unit
) { ) {
val tags = listOfNotNull( val tags = listOfNotNull(
arrayOf(TYPE, mimeType) arrayOf(TYPE, mimeType),
arrayOf("alt", alt)
) )
val content = encode(data) val content = encode(data)
@@ -31,6 +31,7 @@ class FileStorageHeaderEvent(
companion object { companion object {
const val kind = 1065 const val kind = 1065
const val altDescription = "Descriptors for a binary file"
private const val ENCRYPTION_KEY = "aes-256-gcm" private const val ENCRYPTION_KEY = "aes-256-gcm"
private const val MIME_TYPE = "m" private const val MIME_TYPE = "m"
@@ -62,7 +63,7 @@ class FileStorageHeaderEvent(
arrayOf("e", storageEvent.id), arrayOf("e", storageEvent.id),
mimeType?.let { arrayOf(MIME_TYPE, mimeType) }, mimeType?.let { arrayOf(MIME_TYPE, mimeType) },
hash?.let { arrayOf(HASH, it) }, hash?.let { arrayOf(HASH, it) },
alt?.let { arrayOf(ALT, it) }, alt?.let { arrayOf(ALT, it) } ?: arrayOf("alt", altDescription),
size?.let { arrayOf(FILE_SIZE, it) }, size?.let { arrayOf(FILE_SIZE, it) },
dimensions?.let { arrayOf(DIMENSION, it) }, dimensions?.let { arrayOf(DIMENSION, it) },
blurhash?.let { arrayOf(BLUR_HASH, it) }, blurhash?.let { arrayOf(BLUR_HASH, it) },
@@ -29,6 +29,7 @@ class GenericRepostEvent(
companion object { companion object {
const val kind = 16 const val kind = 16
const val alt = "Generic repost"
fun create( fun create(
boostedPost: EventInterface, boostedPost: EventInterface,
@@ -38,16 +39,17 @@ class GenericRepostEvent(
) { ) {
val content = boostedPost.toJson() val content = boostedPost.toJson()
val replyToPost = arrayOf("e", boostedPost.id()) val tags = mutableListOf(
val replyToAuthor = arrayOf("p", boostedPost.pubKey()) arrayOf("e", boostedPost.id()),
arrayOf("p", boostedPost.pubKey())
var tags: List<Array<String>> = listOf(replyToPost, replyToAuthor) )
if (boostedPost is AddressableEvent) { if (boostedPost is AddressableEvent) {
tags = tags + listOf(arrayOf("a", boostedPost.address().toTag())) tags.add(arrayOf("a", boostedPost.address().toTag()))
} }
tags = tags + listOf(arrayOf("k", "${boostedPost.kind()}")) tags.add(arrayOf("k", "${boostedPost.kind()}"))
tags.add(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady) signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady)
} }
@@ -62,6 +62,7 @@ class GiftWrapEvent(
companion object { companion object {
const val kind = 1059 const val kind = 1059
const val alt = "Encrypted event"
fun create( fun create(
event: Event, event: Event,
@@ -71,7 +72,7 @@ class GiftWrapEvent(
) { ) {
val signer = NostrSignerInternal(KeyPair()) // GiftWrap is always a random key val signer = NostrSignerInternal(KeyPair()) // GiftWrap is always a random key
val serializedContent = toJson(event) val serializedContent = toJson(event)
val tags = arrayOf(arrayOf("p", recipientPubKey)) val tags = arrayOf(arrayOf("p", recipientPubKey), arrayOf("alt", alt))
signer.nip44Encrypt(serializedContent, recipientPubKey) { signer.nip44Encrypt(serializedContent, recipientPubKey) {
signer.sign(createdAt, kind, tags, it, onReady) signer.sign(createdAt, kind, tags, it, onReady)
@@ -25,6 +25,7 @@ class HighlightEvent(
companion object { companion object {
const val kind = 9802 const val kind = 9802
const val alt = "Highlight/quote event"
fun create( fun create(
msg: String, msg: String,
@@ -32,7 +33,7 @@ class HighlightEvent(
createdAt: Long = TimeUtils.now(), createdAt: Long = TimeUtils.now(),
onReady: (HighlightEvent) -> Unit onReady: (HighlightEvent) -> Unit
) { ) {
signer.sign(createdAt, kind, emptyArray(), msg, onReady) signer.sign(createdAt, kind, arrayOf(arrayOf("alt", alt)), msg, onReady)
} }
} }
} }
@@ -44,6 +44,7 @@ class LiveActivitiesChatMessageEvent(
companion object { companion object {
const val kind = 1311 const val kind = 1311
const val alt = "Live activity chat message"
fun create( fun create(
message: String, message: String,
@@ -86,6 +87,7 @@ class LiveActivitiesChatMessageEvent(
//tags.add(arrayOf("nip94", it.toJson())) //tags.add(arrayOf("nip94", it.toJson()))
} }
} }
tags.add(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady) signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady)
} }
@@ -45,6 +45,7 @@ class LiveActivitiesEvent(
companion object { companion object {
const val kind = 30311 const val kind = 30311
const val alt = "Live activity event"
const val STATUS_LIVE = "live" const val STATUS_LIVE = "live"
const val STATUS_PLANNED = "planned" const val STATUS_PLANNED = "planned"
@@ -55,7 +56,7 @@ class LiveActivitiesEvent(
createdAt: Long = TimeUtils.now(), createdAt: Long = TimeUtils.now(),
onReady: (LiveActivitiesEvent) -> Unit onReady: (LiveActivitiesEvent) -> Unit
) { ) {
val tags = emptyArray<Array<String>>() val tags = arrayOf(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags, "", onReady) signer.sign(createdAt, kind, tags, "", onReady)
} }
} }
@@ -63,6 +63,7 @@ class LnZapEvent(
companion object { companion object {
const val kind = 9735 const val kind = 9735
const val alt = "Zap event"
} }
enum class ZapType() { enum class ZapType() {
@@ -56,6 +56,7 @@ class LnZapPaymentRequestEvent(
companion object { companion object {
const val kind = 23194 const val kind = 23194
const val alt = "Zap payment request"
fun create( fun create(
lnInvoice: String, lnInvoice: String,
@@ -66,7 +67,7 @@ class LnZapPaymentRequestEvent(
) { ) {
val serializedRequest = mapper.writeValueAsString(PayInvoiceMethod.create(lnInvoice)) val serializedRequest = mapper.writeValueAsString(PayInvoiceMethod.create(lnInvoice))
val tags = arrayOf(arrayOf("p", walletServicePubkey)) val tags = arrayOf(arrayOf("p", walletServicePubkey), arrayOf("alt", alt))
signer.nip04Encrypt( signer.nip04Encrypt(
serializedRequest, serializedRequest,
@@ -63,6 +63,7 @@ class LnZapPaymentResponseEvent(
companion object { companion object {
const val kind = 23195 const val kind = 23195
const val alt = "Zap payment response"
} }
} }
@@ -28,6 +28,7 @@ class LnZapPrivateEvent(
companion object { companion object {
const val kind = 9733 const val kind = 9733
const val alt = "Private zap"
fun create( fun create(
signer: NostrSigner, signer: NostrSigner,
@@ -74,6 +74,7 @@ class LnZapRequestEvent(
companion object { companion object {
const val kind = 9734 const val kind = 9734
const val alt = "Zap request"
fun create( fun create(
originalNote: EventInterface, originalNote: EventInterface,
@@ -91,7 +92,8 @@ class LnZapRequestEvent(
var tags = listOf( var tags = listOf(
arrayOf("e", originalNote.id()), arrayOf("e", originalNote.id()),
arrayOf("p", toUserPubHex ?: originalNote.pubKey()), arrayOf("p", toUserPubHex ?: originalNote.pubKey()),
arrayOf("relays") + relays arrayOf("relays") + relays,
arrayOf("alt", alt)
) )
if (originalNote is AddressableEvent) { if (originalNote is AddressableEvent) {
tags = tags + listOf(arrayOf("a", originalNote.address().toTag())) tags = tags + listOf(arrayOf("a", originalNote.address().toTag()))
@@ -36,6 +36,7 @@ class LongTextNoteEvent(
fun create( fun create(
msg: String, msg: String,
title: String?,
replyTos: List<String>?, replyTos: List<String>?,
mentions: List<String>?, mentions: List<String>?,
signer: NostrSigner, signer: NostrSigner,
@@ -49,6 +50,10 @@ class LongTextNoteEvent(
mentions?.forEach { mentions?.forEach {
tags.add(arrayOf("p", it)) tags.add(arrayOf("p", it))
} }
title?.let {
tags.add(arrayOf("title", it))
}
tags.add(arrayOf("alt","Blog post: $title"))
signer.sign(createdAt, kind, tags.toTypedArray(), msg, onReady) signer.sign(createdAt, kind, tags.toTypedArray(), msg, onReady)
} }
} }
@@ -152,6 +152,7 @@ class MetadataEvent(
fun create( fun create(
contactMetaData: String, contactMetaData: String,
newName: String,
identities: List<IdentityClaim>, identities: List<IdentityClaim>,
signer: NostrSigner, signer: NostrSigner,
createdAt: Long = TimeUtils.now(), createdAt: Long = TimeUtils.now(),
@@ -159,6 +160,10 @@ class MetadataEvent(
) { ) {
val tags = mutableListOf<Array<String>>() val tags = mutableListOf<Array<String>>()
tags.add(
arrayOf("alt", "User profile for ${newName}")
)
identities.forEach { identities.forEach {
tags.add(arrayOf("i", it.platformIdentity(), it.proof)) tags.add(arrayOf("i", it.platformIdentity(), it.proof))
} }
@@ -54,6 +54,7 @@ class MuteListEvent(
companion object { companion object {
const val kind = 10000 const val kind = 10000
const val fixedDTag = "" const val fixedDTag = ""
const val alt = "Mute List"
fun blockListFor(pubKeyHex: HexKey): String { fun blockListFor(pubKeyHex: HexKey): String {
return "10000:$pubKeyHex:" return "10000:$pubKeyHex:"
@@ -209,7 +210,13 @@ class MuteListEvent(
createdAt: Long = TimeUtils.now(), createdAt: Long = TimeUtils.now(),
onReady: (MuteListEvent) -> Unit onReady: (MuteListEvent) -> Unit
) { ) {
signer.sign(createdAt, kind, tags, content, onReady) val newTags = if (tags.any { it.size > 1 && it[0] == "alt" }) {
tags
} else {
tags + arrayOf("alt", alt)
}
signer.sign(createdAt, kind, newTags, content, onReady)
} }
} }
} }
@@ -23,13 +23,14 @@ class NNSEvent(
companion object { companion object {
const val kind = 30053 const val kind = 30053
const val alt = "DNS records"
fun create( fun create(
signer: NostrSigner, signer: NostrSigner,
createdAt: Long = TimeUtils.now(), createdAt: Long = TimeUtils.now(),
onReady: (NNSEvent) -> Unit onReady: (NNSEvent) -> Unit
) { ) {
val tags = emptyArray<Array<String>>() val tags = arrayOf(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags, "", onReady) signer.sign(createdAt, kind, tags, "", onReady)
} }
} }
@@ -87,6 +87,7 @@ class PeopleListEvent(
companion object { companion object {
const val kind = 30000 const val kind = 30000
const val blockList = "mute" const val blockList = "mute"
const val alt = "List of people"
fun blockListFor(pubKeyHex: HexKey): String { fun blockListFor(pubKeyHex: HexKey): String {
return "30000:$pubKeyHex:$blockList" return "30000:$pubKeyHex:$blockList"
@@ -242,7 +243,13 @@ class PeopleListEvent(
createdAt: Long = TimeUtils.now(), createdAt: Long = TimeUtils.now(),
onReady: (PeopleListEvent) -> Unit onReady: (PeopleListEvent) -> Unit
) { ) {
signer.sign(createdAt, kind, tags, content, onReady) val newTags = if (tags.any { it.size > 1 && it[0] == "alt" }) {
tags
} else {
tags + arrayOf("alt", alt)
}
signer.sign(createdAt, kind, newTags, content, onReady)
} }
} }
} }
@@ -22,6 +22,7 @@ class PinListEvent(
companion object { companion object {
const val kind = 33888 const val kind = 33888
const val alt = "Pinned Posts"
fun create( fun create(
pins: List<String>, pins: List<String>,
@@ -33,6 +34,7 @@ class PinListEvent(
pins.forEach { pins.forEach {
tags.add(arrayOf("pin", it)) tags.add(arrayOf("pin", it))
} }
tags.add(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags.toTypedArray(), "", onReady) signer.sign(createdAt, kind, tags.toTypedArray(), "", onReady)
} }
@@ -43,6 +43,7 @@ class PollNoteEvent(
companion object { companion object {
const val kind = 6969 const val kind = 6969
const val alt = "Poll event"
fun create( fun create(
msg: String, msg: String,
@@ -105,6 +106,7 @@ class PollNoteEvent(
//tags.add(arrayOf("nip94", it.toJson())) //tags.add(arrayOf("nip94", it.toJson()))
} }
} }
tags.add(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags.toTypedArray(), msg, onReady) signer.sign(createdAt, kind, tags.toTypedArray(), msg, onReady)
} }
@@ -90,7 +90,7 @@ class PrivateDmEvent(
companion object { companion object {
const val kind = 4 const val kind = 4
const val alt = "Private Message"
const val nip18Advertisement = "[//]: # (nip18)\n" const val nip18Advertisement = "[//]: # (nip18)\n"
fun create( fun create(
@@ -131,6 +131,7 @@ class PrivateDmEvent(
geohash?.let { geohash?.let {
tags.addAll(geohashMipMap(it)) tags.addAll(geohashMipMap(it))
} }
tags.add(arrayOf("alt", alt))
signer.nip04Encrypt(message, recipientPubKey) { content -> signer.nip04Encrypt(message, recipientPubKey) { content ->
signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady) signer.sign(createdAt, kind, tags.toTypedArray(), content, onReady)
@@ -22,6 +22,7 @@ class RelaySetEvent(
companion object { companion object {
const val kind = 30022 const val kind = 30022
const val alt = "Relay list"
fun create( fun create(
relays: List<String>, relays: List<String>,
@@ -33,6 +34,7 @@ class RelaySetEvent(
relays.forEach { relays.forEach {
tags.add(arrayOf("r", it)) tags.add(arrayOf("r", it))
} }
tags.add(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags.toTypedArray(), "", onReady) signer.sign(createdAt, kind, tags.toTypedArray(), "", onReady)
} }
@@ -69,9 +69,11 @@ class ReportEvent(
var tags: Array<Array<String>> = arrayOf(reportPostTag, reportAuthorTag) var tags: Array<Array<String>> = arrayOf(reportPostTag, reportAuthorTag)
if (reportedPost is AddressableEvent) { if (reportedPost is AddressableEvent) {
tags = tags + listOf(arrayOf("a", reportedPost.address().toTag())) tags += listOf(arrayOf("a", reportedPost.address().toTag()))
} }
tags += listOf(arrayOf("alt", "Report for ${type.name}"))
signer.sign(createdAt, kind, tags, content, onReady) signer.sign(createdAt, kind, tags, content, onReady)
} }
@@ -85,8 +87,9 @@ class ReportEvent(
val content = "" val content = ""
val reportAuthorTag = arrayOf("p", reportedUser, type.name.lowercase()) val reportAuthorTag = arrayOf("p", reportedUser, type.name.lowercase())
val alt = arrayOf("alt", "Report for ${type.name}")
val tags: Array<Array<String>> = arrayOf(reportAuthorTag) val tags: Array<Array<String>> = arrayOf(reportAuthorTag, alt)
signer.sign(createdAt, kind, tags, content, onReady) signer.sign(createdAt, kind, tags, content, onReady)
} }
} }
@@ -29,6 +29,7 @@ class RepostEvent(
companion object { companion object {
const val kind = 6 const val kind = 6
const val alt = "Repost event"
fun create( fun create(
boostedPost: EventInterface, boostedPost: EventInterface,
@@ -44,9 +45,11 @@ class RepostEvent(
var tags: Array<Array<String>> = arrayOf(replyToPost, replyToAuthor) var tags: Array<Array<String>> = arrayOf(replyToPost, replyToAuthor)
if (boostedPost is AddressableEvent) { if (boostedPost is AddressableEvent) {
tags = tags + listOf(arrayOf("a", boostedPost.address().toTag())) tags += listOf(arrayOf("a", boostedPost.address().toTag()))
} }
tags += listOf(arrayOf("alt", alt))
signer.sign(createdAt, kind, tags, content, onReady) signer.sign(createdAt, kind, tags, content, onReady)
} }
} }