diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index f6bd8067a..6c1783ec8 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -119,7 +119,7 @@ import com.vitorpamplona.quartz.nip53LiveActivities.LiveActivitiesChatMessageEve import com.vitorpamplona.quartz.nip56Reports.ReportEvent import com.vitorpamplona.quartz.nip57Zaps.LnZapEvent import com.vitorpamplona.quartz.nip57Zaps.LnZapRequestEvent -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup import com.vitorpamplona.quartz.nip59Giftwrap.GiftWrapEvent import com.vitorpamplona.quartz.nip59Giftwrap.SealedGossipEvent import com.vitorpamplona.quartz.nip59Giftwrap.WrappedEvent diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/ZapPaymentHandler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/ZapPaymentHandler.kt index 7e77179cf..252f90d34 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/ZapPaymentHandler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/ZapPaymentHandler.kt @@ -34,8 +34,10 @@ import com.vitorpamplona.amethyst.ui.stringRes import com.vitorpamplona.quartz.nip47WalletConnect.PayInvoiceErrorResponse import com.vitorpamplona.quartz.nip53LiveActivities.LiveActivitiesEvent import com.vitorpamplona.quartz.nip57Zaps.LnZapEvent -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup -import com.vitorpamplona.quartz.nip57Zaps.zapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.BaseZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetupLnAddress +import com.vitorpamplona.quartz.nip57Zaps.splits.zapSplitSetup import com.vitorpamplona.quartz.nip65RelayList.AdvertisedRelayListEvent import com.vitorpamplona.quartz.nip89AppHandlers.AppDefinitionEvent import kotlinx.collections.immutable.ImmutableList @@ -49,7 +51,7 @@ class ZapPaymentHandler( ) { @Immutable data class Payable( - val info: ZapSplitSetup, + val info: BaseZapSplitSetup, val user: User?, val amountMilliSats: Long, val invoice: String, @@ -75,11 +77,11 @@ class ZapPaymentHandler( if (!zapSplitSetup.isNullOrEmpty()) { zapSplitSetup } else if (noteEvent is LiveActivitiesEvent && noteEvent.hasHost()) { - noteEvent.hosts().map { ZapSplitSetup(it, null, weight = 1.0, false) } + noteEvent.hosts().map { ZapSplitSetup(it.pubKeyHex, it.relay, weight = 1.0) } } else if (noteEvent is AppDefinitionEvent) { val appLud16 = noteEvent.appMetaData()?.lnAddress() if (appLud16 != null) { - listOf(ZapSplitSetup(appLud16, null, weight = 1.0, true)) + listOf(ZapSplitSetupLnAddress(appLud16, weight = 1.0)) } else { val lud16 = note.author?.info?.lnAddress() @@ -97,7 +99,7 @@ class ZapPaymentHandler( return@withContext } - listOf(ZapSplitSetup(lud16, null, weight = 1.0, true)) + listOf(ZapSplitSetupLnAddress(lud16, weight = 1.0)) } } else { val lud16 = note.author?.info?.lnAddress() @@ -116,7 +118,7 @@ class ZapPaymentHandler( return@withContext } - listOf(ZapSplitSetup(lud16, null, weight = 1.0, true)) + listOf(ZapSplitSetupLnAddress(lud16, weight = 1.0)) } onProgress(0.02f) @@ -166,7 +168,7 @@ class ZapPaymentHandler( } class ZapRequestReady( - val inputSetup: ZapSplitSetup, + val inputSetup: BaseZapSplitSetup, val zapRequestJson: String?, val user: User? = null, ) @@ -176,7 +178,7 @@ class ZapPaymentHandler( pollOption: Int?, message: String, zapType: LnZapEvent.ZapType, - zapsToSend: List, + zapsToSend: List, onAllDone: suspend (List) -> Unit, ) { val authorRelayList = @@ -191,23 +193,23 @@ class ZapPaymentHandler( )?.readRelays() }?.toSet() - collectSuccessfulOperations( + collectSuccessfulOperations( items = zapsToSend, - runRequestFor = { next: ZapSplitSetup, onReady -> - if (next.isLnAddress) { + runRequestFor = { next: BaseZapSplitSetup, onReady -> + if (next is ZapSplitSetupLnAddress) { prepareZapRequestIfNeeded(note, pollOption, message, zapType) { zapRequestJson -> if (zapRequestJson != null) { onReady(ZapRequestReady(next, zapRequestJson)) } } - } else { - val user = LocalCache.getUserIfExists(next.lnAddressOrPubKeyHex) + } else if (next is ZapSplitSetup) { + val user = LocalCache.getUserIfExists(next.pubKeyHex) val userRelayList = ( ( LocalCache .getAddressableNoteIfExists( - AdvertisedRelayListEvent.createAddressTag(next.lnAddressOrPubKeyHex), + AdvertisedRelayListEvent.createAddressTag(next.pubKeyHex), )?.event as? AdvertisedRelayListEvent? )?.readRelays()?.toSet() ?: emptySet() ) + (authorRelayList ?: emptySet()) @@ -311,7 +313,7 @@ class ZapPaymentHandler( } private fun assembleInvoice( - splitSetup: ZapSplitSetup, + splitSetup: BaseZapSplitSetup, nostrZapRequest: String?, toUser: User?, zapValue: Long, @@ -326,8 +328,8 @@ class ZapPaymentHandler( var progressThisPayment = 0.00f val lud16 = - if (splitSetup.isLnAddress) { - splitSetup.lnAddressOrPubKeyHex + if (splitSetup is ZapSplitSetupLnAddress) { + splitSetup.lnAddress } else { toUser?.info?.lnAddress() } @@ -371,7 +373,7 @@ class ZapPaymentHandler( stringRes( context, R.string.user_x_does_not_have_a_lightning_address_setup_to_receive_sats, - user?.toBestDisplayName() ?: splitSetup.lnAddressOrPubKeyHex, + user?.toBestDisplayName() ?: splitSetup.mainId(), ), null, ) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/uploads/nip96/Nip96Uploader.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/uploads/nip96/Nip96Uploader.kt index 5b3759c95..7d1ad2e08 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/uploads/nip96/Nip96Uploader.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/uploads/nip96/Nip96Uploader.kt @@ -34,6 +34,7 @@ import com.vitorpamplona.amethyst.service.checkNotInMainThread import com.vitorpamplona.amethyst.service.okhttp.HttpClientManager import com.vitorpamplona.amethyst.service.uploads.MediaUploadResult import com.vitorpamplona.amethyst.ui.stringRes +import com.vitorpamplona.quartz.nip36SensitiveContent.CONTENT_WARNING import com.vitorpamplona.quartz.nip94FileMetadata.Dimension import com.vitorpamplona.quartz.nip96FileStorage.AuthToken import com.vitorpamplona.quartz.nip96FileStorage.Nip96Result @@ -152,7 +153,7 @@ class Nip96Uploader { .addFormDataPart("size", length.toString()) .also { body -> alt?.ifBlank { null }?.let { body.addFormDataPart("alt", it) } - sensitiveContent?.let { body.addFormDataPart("content-warning", it) } + sensitiveContent?.let { body.addFormDataPart(CONTENT_WARNING, it) } contentType?.let { body.addFormDataPart("content_type", it) } }.addFormDataPart( "file", diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt index 656f1c55f..d92db895f 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/NewPostViewModel.kt @@ -64,7 +64,7 @@ import com.vitorpamplona.quartz.nip01Core.tags.geohash.getGeoHash import com.vitorpamplona.quartz.nip04Dm.PrivateDmEvent import com.vitorpamplona.quartz.nip10Notes.BaseTextNoteEvent import com.vitorpamplona.quartz.nip10Notes.TextNoteEvent -import com.vitorpamplona.quartz.nip10Notes.findURLs +import com.vitorpamplona.quartz.nip10Notes.content.findURLs import com.vitorpamplona.quartz.nip14Subject.subject import com.vitorpamplona.quartz.nip17Dm.NIP17Group import com.vitorpamplona.quartz.nip19Bech32.toNpub @@ -75,11 +75,13 @@ import com.vitorpamplona.quartz.nip30CustomEmoji.EmojiUrl import com.vitorpamplona.quartz.nip34Git.GitIssueEvent import com.vitorpamplona.quartz.nip35Torrents.TorrentCommentEvent import com.vitorpamplona.quartz.nip35Torrents.TorrentEvent +import com.vitorpamplona.quartz.nip36SensitiveContent.isSensitive import com.vitorpamplona.quartz.nip36SensitiveContent.isSensitiveOrNSFW import com.vitorpamplona.quartz.nip37Drafts.DraftEvent -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup -import com.vitorpamplona.quartz.nip57Zaps.zapSplitSetup -import com.vitorpamplona.quartz.nip57Zaps.zapraiserAmount +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetupLnAddress +import com.vitorpamplona.quartz.nip57Zaps.splits.zapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.zapraiser.zapraiserAmount import com.vitorpamplona.quartz.nip65RelayList.AdvertisedRelayListEvent import com.vitorpamplona.quartz.nip72ModCommunities.CommunityDefinitionEvent import com.vitorpamplona.quartz.nip92IMeta.IMetaTag @@ -316,11 +318,11 @@ open class NewPostViewModel : ViewModel() { } it.event?.zapSplitSetup()?.let { - val totalWeight = it.sumOf { if (it.isLnAddress) 0.0 else it.weight } + val totalWeight = it.sumOf { if (it is ZapSplitSetupLnAddress) 0.0 else it.weight } it.forEach { - if (!it.isLnAddress) { - forwardZapTo.addItem(LocalCache.getOrCreateUser(it.lnAddressOrPubKeyHex), (it.weight / totalWeight).toFloat()) + if (it is ZapSplitSetup) { + forwardZapTo.addItem(LocalCache.getOrCreateUser(it.pubKeyHex), (it.weight / totalWeight).toFloat()) } } } @@ -378,7 +380,7 @@ open class NewPostViewModel : ViewModel() { forwardZapToEditting = TextFieldValue("") wantsForwardZapTo = localfowardZapTo.isNotEmpty() - wantsToMarkAsSensitive = draftEvent.tags.any { it.size > 1 && it[0] == "content-warning" } + wantsToMarkAsSensitive = draftEvent.isSensitive() val geohash = draftEvent.getGeoHash() wantsToAddGeoHash = geohash != null @@ -386,11 +388,11 @@ open class NewPostViewModel : ViewModel() { wantsExclusiveGeoPost = draftEvent.kind == CommentEvent.KIND } - val zapraiser = draftEvent.tags.filter { it.size > 1 && it[0] == "zapraiser" } - wantsZapraiser = zapraiser.isNotEmpty() + val zapraiser = draftEvent.zapraiserAmount() + wantsZapraiser = zapraiser != null zapRaiserAmount = null - if (wantsZapraiser) { - zapRaiserAmount = zapraiser.first()[1].toLongOrNull() ?: 0 + if (zapraiser != null) { + zapRaiserAmount = zapraiser } eTags = @@ -566,10 +568,9 @@ open class NewPostViewModel : ViewModel() { .firstOrNull { !it.contains("localhost") } ZapSplitSetup( - lnAddressOrPubKeyHex = split.key.pubkeyHex, + pubKeyHex = split.key.pubkeyHex, relay = homeRelay, weight = round(split.percentage.toDouble() * 10000) / 10000, - isLnAddress = false, ) } else { null diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiUserMessageDialog.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiUserMessageDialog.kt index 3ce3fbf16..ab3e42772 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiUserMessageDialog.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiUserMessageDialog.kt @@ -54,7 +54,6 @@ import androidx.lifecycle.viewmodel.compose.viewModel import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.User -import com.vitorpamplona.amethyst.service.NostrUserProfileDataSource.user import com.vitorpamplona.amethyst.ui.navigation.EmptyNav import com.vitorpamplona.amethyst.ui.navigation.INav import com.vitorpamplona.amethyst.ui.navigation.routeToMessage diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index b3b6955e2..19f5ecca5 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -189,7 +189,7 @@ import com.vitorpamplona.quartz.nip53LiveActivities.LiveActivitiesChatMessageEve import com.vitorpamplona.quartz.nip53LiveActivities.LiveActivitiesEvent import com.vitorpamplona.quartz.nip54Wiki.WikiNoteEvent import com.vitorpamplona.quartz.nip56Reports.ReportEvent -import com.vitorpamplona.quartz.nip57Zaps.hasZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.hasZapSplitSetup import com.vitorpamplona.quartz.nip58Badges.BadgeAwardEvent import com.vitorpamplona.quartz.nip58Badges.BadgeDefinitionEvent import com.vitorpamplona.quartz.nip65RelayList.AdvertisedRelayListEvent diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt index 208de6b75..518f766ca 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/PollNote.kt @@ -97,6 +97,7 @@ import com.vitorpamplona.quartz.experimental.zapPolls.PollNoteEvent import com.vitorpamplona.quartz.nip02FollowList.EmptyTagList import com.vitorpamplona.quartz.nip02FollowList.ImmutableListOfLists import com.vitorpamplona.quartz.nip02FollowList.toImmutableListOfLists +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.nip57Zaps.LnZapEvent import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf @@ -123,7 +124,7 @@ fun PollNotePreview() { arrayOf("poll_option", "2", "OP3"), arrayOf("value_maximum", "2"), arrayOf("value_minimum", "2"), - arrayOf("alt", "Poll event"), + AltTagSerializer.toTagArray("Poll event"), ), ) @@ -195,7 +196,7 @@ fun PollNotePreview2() { arrayOf("poll_option", "1", "Pesquisa em ingles"), arrayOf("value_maximum", "2"), arrayOf("value_minimum", "2"), - arrayOf("alt", "Poll event"), + AltTagSerializer.toTagArray("Poll event"), ), ) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt index 56b1c3742..af5e11a53 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/ReactionsRow.kt @@ -149,7 +149,7 @@ import com.vitorpamplona.amethyst.ui.theme.ripple24dp import com.vitorpamplona.amethyst.ui.theme.selectedReactionBoxModifier import com.vitorpamplona.quartz.nip10Notes.BaseTextNoteEvent import com.vitorpamplona.quartz.nip30CustomEmoji.CustomEmoji -import com.vitorpamplona.quartz.nip57Zaps.zapraiserAmount +import com.vitorpamplona.quartz.nip57Zaps.zapraiser.zapraiserAmount import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableSet import kotlinx.collections.immutable.persistentListOf diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/elements/DisplayZapSplits.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/elements/DisplayZapSplits.kt index c14767b80..f94b2983d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/elements/DisplayZapSplits.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/elements/DisplayZapSplits.kt @@ -39,8 +39,9 @@ import com.vitorpamplona.amethyst.ui.theme.BitcoinOrange import com.vitorpamplona.amethyst.ui.theme.Size25dp import com.vitorpamplona.amethyst.ui.theme.StdHorzSpacer import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup -import com.vitorpamplona.quartz.nip57Zaps.zapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetupLnAddress +import com.vitorpamplona.quartz.nip57Zaps.splits.zapSplitSetup @OptIn(ExperimentalLayoutApi::class) @Composable @@ -56,10 +57,9 @@ fun DisplayZapSplits( if (list.isEmpty() && useAuthorIfEmpty) { listOf( ZapSplitSetup( - lnAddressOrPubKeyHex = noteEvent.pubKey, + pubKeyHex = noteEvent.pubKey, relay = null, weight = 1.0, - isLnAddress = false, ), ) } else { @@ -75,19 +75,20 @@ fun DisplayZapSplits( FlowRow { list.forEach { - if (it.isLnAddress) { - ClickableText( - text = AnnotatedString(it.lnAddressOrPubKeyHex), - onClick = {}, - style = LocalTextStyle.current.copy(color = MaterialTheme.colorScheme.primary), - ) - } else { - UserPicture( - userHex = it.lnAddressOrPubKeyHex, - size = Size25dp, - accountViewModel = accountViewModel, - nav = nav, - ) + when (it) { + is ZapSplitSetupLnAddress -> + ClickableText( + text = AnnotatedString(it.lnAddress), + onClick = {}, + style = LocalTextStyle.current.copy(color = MaterialTheme.colorScheme.primary), + ) + is ZapSplitSetup -> + UserPicture( + userHex = it.pubKeyHex, + size = Size25dp, + accountViewModel = accountViewModel, + nav = nav, + ) } } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt index e59853f4b..837a13996 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt @@ -102,7 +102,7 @@ import com.vitorpamplona.quartz.nip50Search.SearchRelayListEvent import com.vitorpamplona.quartz.nip56Reports.ReportEvent import com.vitorpamplona.quartz.nip57Zaps.LnZapEvent import com.vitorpamplona.quartz.nip57Zaps.LnZapRequestEvent -import com.vitorpamplona.quartz.nip57Zaps.zapraiserAmount +import com.vitorpamplona.quartz.nip57Zaps.zapraiser.zapraiserAmount import com.vitorpamplona.quartz.nip59Giftwrap.GiftWrapEvent import com.vitorpamplona.quartz.nip59Giftwrap.SealedGossipEvent import com.vitorpamplona.quartz.nip65RelayList.AdvertisedRelayListEvent diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChannelScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChannelScreen.kt index e5eecb4bd..995113294 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChannelScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChannelScreen.kt @@ -170,7 +170,7 @@ import com.vitorpamplona.quartz.nip01Core.tags.events.isTaggedEvent import com.vitorpamplona.quartz.nip01Core.tags.hashtags.hasHashtags import com.vitorpamplona.quartz.nip02FollowList.EmptyTagList import com.vitorpamplona.quartz.nip02FollowList.toImmutableListOfLists -import com.vitorpamplona.quartz.nip10Notes.findURLs +import com.vitorpamplona.quartz.nip10Notes.content.findURLs import com.vitorpamplona.quartz.nip21UriScheme.toNostrUri import com.vitorpamplona.quartz.nip53LiveActivities.LiveActivitiesEvent.Companion.STATUS_LIVE import kotlinx.collections.immutable.ImmutableList diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChatroomScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChatroomScreen.kt index 146b5a9ed..e1f2019d9 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChatroomScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chatrooms/ChatroomScreen.kt @@ -118,7 +118,7 @@ import com.vitorpamplona.amethyst.ui.theme.Size34dp import com.vitorpamplona.amethyst.ui.theme.StdPadding import com.vitorpamplona.amethyst.ui.theme.ZeroPadding import com.vitorpamplona.amethyst.ui.theme.placeholderText -import com.vitorpamplona.quartz.nip10Notes.findURLs +import com.vitorpamplona.quartz.nip10Notes.content.findURLs import com.vitorpamplona.quartz.nip17Dm.ChatroomKey import com.vitorpamplona.quartz.nip17Dm.NIP17Group import kotlinx.collections.immutable.ImmutableList diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt index d716d4a5e..f55c6f699 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/ThreadFeedView.kt @@ -197,7 +197,7 @@ import com.vitorpamplona.quartz.nip51Lists.PinListEvent import com.vitorpamplona.quartz.nip51Lists.RelaySetEvent import com.vitorpamplona.quartz.nip53LiveActivities.LiveActivitiesChatMessageEvent import com.vitorpamplona.quartz.nip54Wiki.WikiNoteEvent -import com.vitorpamplona.quartz.nip57Zaps.hasZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.hasZapSplitSetup import com.vitorpamplona.quartz.nip58Badges.BadgeDefinitionEvent import com.vitorpamplona.quartz.nip65RelayList.AdvertisedRelayListEvent import com.vitorpamplona.quartz.nip68Picture.PictureEvent diff --git a/amethyst/src/main/res/values-cy-rGB/strings.xml b/amethyst/src/main/res/values-cy-rGB/strings.xml index 66a570486..3ea04e700 100644 --- a/amethyst/src/main/res/values-cy-rGB/strings.xml +++ b/amethyst/src/main/res/values-cy-rGB/strings.xml @@ -1,2 +1,2 @@ - + diff --git a/amethyst/src/main/res/values-da-rDK/strings.xml b/amethyst/src/main/res/values-da-rDK/strings.xml index 66a570486..3ea04e700 100644 --- a/amethyst/src/main/res/values-da-rDK/strings.xml +++ b/amethyst/src/main/res/values-da-rDK/strings.xml @@ -1,2 +1,2 @@ - + diff --git a/amethyst/src/main/res/values-en-rGB/strings.xml b/amethyst/src/main/res/values-en-rGB/strings.xml index 2e780a134..48dcf6594 100644 --- a/amethyst/src/main/res/values-en-rGB/strings.xml +++ b/amethyst/src/main/res/values-en-rGB/strings.xml @@ -1,5 +1,5 @@ - + Point to the QR Code Show QR Profile Image diff --git a/amethyst/src/main/res/values-gu-rIN/strings.xml b/amethyst/src/main/res/values-gu-rIN/strings.xml index 66a570486..3ea04e700 100644 --- a/amethyst/src/main/res/values-gu-rIN/strings.xml +++ b/amethyst/src/main/res/values-gu-rIN/strings.xml @@ -1,2 +1,2 @@ - + diff --git a/amethyst/src/main/res/values-hr-rHR/strings.xml b/amethyst/src/main/res/values-hr-rHR/strings.xml index 66a570486..3ea04e700 100644 --- a/amethyst/src/main/res/values-hr-rHR/strings.xml +++ b/amethyst/src/main/res/values-hr-rHR/strings.xml @@ -1,2 +1,2 @@ - + diff --git a/amethyst/src/main/res/values-iw-rIL/strings.xml b/amethyst/src/main/res/values-iw-rIL/strings.xml index 66a570486..3ea04e700 100644 --- a/amethyst/src/main/res/values-iw-rIL/strings.xml +++ b/amethyst/src/main/res/values-iw-rIL/strings.xml @@ -1,2 +1,2 @@ - + diff --git a/amethyst/src/main/res/values-kk-rKZ/strings.xml b/amethyst/src/main/res/values-kk-rKZ/strings.xml index 66a570486..3ea04e700 100644 --- a/amethyst/src/main/res/values-kk-rKZ/strings.xml +++ b/amethyst/src/main/res/values-kk-rKZ/strings.xml @@ -1,2 +1,2 @@ - + diff --git a/amethyst/src/main/res/values-ko-rKR/strings.xml b/amethyst/src/main/res/values-ko-rKR/strings.xml index 66a570486..3ea04e700 100644 --- a/amethyst/src/main/res/values-ko-rKR/strings.xml +++ b/amethyst/src/main/res/values-ko-rKR/strings.xml @@ -1,2 +1,2 @@ - + diff --git a/amethyst/src/main/res/values-ks-rIN/strings.xml b/amethyst/src/main/res/values-ks-rIN/strings.xml index 66a570486..3ea04e700 100644 --- a/amethyst/src/main/res/values-ks-rIN/strings.xml +++ b/amethyst/src/main/res/values-ks-rIN/strings.xml @@ -1,2 +1,2 @@ - + diff --git a/amethyst/src/main/res/values-lt-rLT/strings.xml b/amethyst/src/main/res/values-lt-rLT/strings.xml index 66a570486..3ea04e700 100644 --- a/amethyst/src/main/res/values-lt-rLT/strings.xml +++ b/amethyst/src/main/res/values-lt-rLT/strings.xml @@ -1,2 +1,2 @@ - + diff --git a/amethyst/src/main/res/values-ne-rNP/strings.xml b/amethyst/src/main/res/values-ne-rNP/strings.xml index 66a570486..3ea04e700 100644 --- a/amethyst/src/main/res/values-ne-rNP/strings.xml +++ b/amethyst/src/main/res/values-ne-rNP/strings.xml @@ -1,2 +1,2 @@ - + diff --git a/amethyst/src/main/res/values-pcm-rNG/strings.xml b/amethyst/src/main/res/values-pcm-rNG/strings.xml index 66a570486..3ea04e700 100644 --- a/amethyst/src/main/res/values-pcm-rNG/strings.xml +++ b/amethyst/src/main/res/values-pcm-rNG/strings.xml @@ -1,2 +1,2 @@ - + diff --git a/amethyst/src/main/res/values-pt-rPT/strings.xml b/amethyst/src/main/res/values-pt-rPT/strings.xml index 66a570486..3ea04e700 100644 --- a/amethyst/src/main/res/values-pt-rPT/strings.xml +++ b/amethyst/src/main/res/values-pt-rPT/strings.xml @@ -1,2 +1,2 @@ - + diff --git a/amethyst/src/main/res/values-ru-rUA/strings.xml b/amethyst/src/main/res/values-ru-rUA/strings.xml index 66a570486..3ea04e700 100644 --- a/amethyst/src/main/res/values-ru-rUA/strings.xml +++ b/amethyst/src/main/res/values-ru-rUA/strings.xml @@ -1,2 +1,2 @@ - + diff --git a/amethyst/src/main/res/values-sa-rIN/strings.xml b/amethyst/src/main/res/values-sa-rIN/strings.xml index 66a570486..3ea04e700 100644 --- a/amethyst/src/main/res/values-sa-rIN/strings.xml +++ b/amethyst/src/main/res/values-sa-rIN/strings.xml @@ -1,2 +1,2 @@ - + diff --git a/amethyst/src/main/res/values-sr-rSP/strings.xml b/amethyst/src/main/res/values-sr-rSP/strings.xml index 25197aa21..4e434e5ce 100644 --- a/amethyst/src/main/res/values-sr-rSP/strings.xml +++ b/amethyst/src/main/res/values-sr-rSP/strings.xml @@ -1,5 +1,5 @@ - + Покажите на КР код Прикажи КР слика профила diff --git a/amethyst/src/main/res/values-sw-rTZ/strings.xml b/amethyst/src/main/res/values-sw-rTZ/strings.xml index 66a570486..3ea04e700 100644 --- a/amethyst/src/main/res/values-sw-rTZ/strings.xml +++ b/amethyst/src/main/res/values-sw-rTZ/strings.xml @@ -1,2 +1,2 @@ - + diff --git a/amethyst/src/main/res/values-tr/strings.xml b/amethyst/src/main/res/values-tr/strings.xml index 0c9d8ae64..0cd4766e1 100644 --- a/amethyst/src/main/res/values-tr/strings.xml +++ b/amethyst/src/main/res/values-tr/strings.xml @@ -1,5 +1,5 @@ - + QR Code\'a yönlendir QR Göster Profil Resmi diff --git a/amethyst/src/main/res/values-uz-rUZ/strings.xml b/amethyst/src/main/res/values-uz-rUZ/strings.xml index 66a570486..3ea04e700 100644 --- a/amethyst/src/main/res/values-uz-rUZ/strings.xml +++ b/amethyst/src/main/res/values-uz-rUZ/strings.xml @@ -1,2 +1,2 @@ - + diff --git a/amethyst/src/main/res/values-vi-rVN/strings.xml b/amethyst/src/main/res/values-vi-rVN/strings.xml index d374dcabd..2392d4a79 100644 --- a/amethyst/src/main/res/values-vi-rVN/strings.xml +++ b/amethyst/src/main/res/values-vi-rVN/strings.xml @@ -1,5 +1,5 @@ - + Hình ảnh nhóm Hành vi trái pháp luật Không xác định diff --git a/amethyst/src/main/res/values-zh-rSG/strings.xml b/amethyst/src/main/res/values-zh-rSG/strings.xml index 66a570486..3ea04e700 100644 --- a/amethyst/src/main/res/values-zh-rSG/strings.xml +++ b/amethyst/src/main/res/values-zh-rSG/strings.xml @@ -1,2 +1,2 @@ - + diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/richtext/RichTextParser.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/richtext/RichTextParser.kt index 60b6c1a9a..c7b4584b7 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/richtext/RichTextParser.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/richtext/RichTextParser.kt @@ -27,6 +27,7 @@ import com.linkedin.urls.detection.UrlDetectorOptions import com.vitorpamplona.quartz.experimental.inlineMetadata.Nip54InlineMetadata import com.vitorpamplona.quartz.nip02FollowList.ImmutableListOfLists import com.vitorpamplona.quartz.nip30CustomEmoji.CustomEmoji +import com.vitorpamplona.quartz.nip36SensitiveContent.CONTENT_WARNING import com.vitorpamplona.quartz.nip92IMeta.Nip92MediaAttachments import com.vitorpamplona.quartz.nip94FileMetadata.Dimension import com.vitorpamplona.quartz.nip94FileMetadata.FileHeaderEvent @@ -76,7 +77,7 @@ class RichTextParser { hash = frags[FileHeaderEvent.HASH] ?: tags[FileHeaderEvent.HASH], blurhash = frags[FileHeaderEvent.BLUR_HASH] ?: tags[FileHeaderEvent.BLUR_HASH], dim = frags[FileHeaderEvent.DIMENSION]?.let { Dimension.parse(it) } ?: tags[FileHeaderEvent.DIMENSION]?.let { Dimension.parse(it) }, - contentWarning = frags["content-warning"] ?: tags["content-warning"], + contentWarning = frags[CONTENT_WARNING] ?: tags[CONTENT_WARNING], uri = callbackUri, mimeType = contentType, ) @@ -87,7 +88,7 @@ class RichTextParser { hash = frags[FileHeaderEvent.HASH] ?: tags[FileHeaderEvent.HASH], blurhash = frags[FileHeaderEvent.BLUR_HASH] ?: tags[FileHeaderEvent.BLUR_HASH], dim = frags[FileHeaderEvent.DIMENSION]?.let { Dimension.parse(it) } ?: tags[FileHeaderEvent.DIMENSION]?.let { Dimension.parse(it) }, - contentWarning = frags["content-warning"] ?: tags["content-warning"], + contentWarning = frags[CONTENT_WARNING] ?: tags[CONTENT_WARNING], uri = callbackUri, mimeType = contentType, ) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/blossom/BlossomServersEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/blossom/BlossomServersEvent.kt index e4fa19a3a..d2a3f37d1 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/blossom/BlossomServersEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/blossom/BlossomServersEvent.kt @@ -25,6 +25,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -60,7 +61,7 @@ class BlossomServersEvent( servers .map { arrayOf("server", it) - }.plusElement(arrayOf("alt", ALT)) + }.plusElement(AltTagSerializer.toTagArray(ALT)) .toTypedArray() fun updateRelayList( diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/audio/AudioHeaderEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/audio/AudioHeaderEvent.kt index 78dec108d..6326bd253 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/audio/AudioHeaderEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/audio/AudioHeaderEvent.kt @@ -26,6 +26,8 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.jackson.EventMapper import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -72,12 +74,12 @@ class AudioHeaderEvent( wavefront?.let { arrayOf(WAVEFORM, it) }, sensitiveContent?.let { if (it) { - arrayOf("content-warning", "") + ContentWarningSerializer.toTagArray() } else { null } }, - arrayOf("alt", ALT), + AltTagSerializer.toTagArray(ALT), ).toTypedArray() signer.sign(createdAt, KIND, tags, description, onReady) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/audio/AudioTrackEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/audio/AudioTrackEvent.kt index 3bdfeddcc..25c04be6c 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/audio/AudioTrackEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/audio/AudioTrackEvent.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -73,7 +74,7 @@ class AudioTrackEvent( price?.let { arrayOf(PRICE, it) }, cover?.let { arrayOf(COVER, it) }, subject?.let { arrayOf(SUBJECT, it) }, - arrayOf("alt", ALT), + AltTagSerializer.toTagArray(ALT), ).toTypedArray() signer.sign(createdAt, KIND, tags, "", onReady) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/edits/PrivateOutboxRelayListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/edits/PrivateOutboxRelayListEvent.kt index 654b7a406..5d4429f92 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/edits/PrivateOutboxRelayListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/edits/PrivateOutboxRelayListEvent.kt @@ -29,6 +29,7 @@ import com.vitorpamplona.quartz.nip01Core.jackson.EventMapper import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag import com.vitorpamplona.quartz.nip21UriScheme.toNostrUri +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.bytesUsedInMemory import com.vitorpamplona.quartz.utils.pointerSizeInBytes @@ -101,7 +102,7 @@ class PrivateOutboxRelayListEvent( companion object { const val KIND = 10013 const val FIXED_D_TAG = "" - val TAGS = arrayOf(arrayOf("alt", "Relay list to store private content from this author")) + val TAGS = arrayOf(AltTagSerializer.toTagArray("Relay list to store private content from this author")) fun createAddressATag(pubKey: HexKey): ATag = ATag(KIND, pubKey, FIXED_D_TAG, null) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/edits/TextNoteModificationEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/edits/TextNoteModificationEvent.kt index 9af8d7389..116b01825 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/edits/TextNoteModificationEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/edits/TextNoteModificationEvent.kt @@ -25,6 +25,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.events.firstTaggedEvent +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -63,7 +64,7 @@ class TextNoteModificationEvent( tags.add(arrayOf("summary", it)) } - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags.toTypedArray(), content, onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/InteractiveStoryBaseEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/InteractiveStoryBaseEvent.kt index 8c8e47160..753f26017 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/InteractiveStoryBaseEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/InteractiveStoryBaseEvent.kt @@ -31,7 +31,11 @@ import com.vitorpamplona.quartz.nip10Notes.content.findHashtags import com.vitorpamplona.quartz.nip10Notes.content.findURLs import com.vitorpamplona.quartz.nip19Bech32.parse import com.vitorpamplona.quartz.nip30CustomEmoji.EmojiUrl -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetupSerializer +import com.vitorpamplona.quartz.nip57Zaps.zapraiser.ZapRaiserSerializer import com.vitorpamplona.quartz.nip92IMeta.IMetaTag import com.vitorpamplona.quartz.nip92IMeta.Nip92MediaAttachments @@ -69,14 +73,13 @@ open class InteractiveStoryBaseEvent( tags.addAll(buildHashtagTags(findHashtags(content))) tags.addAll(buildUrlRefs(findURLs(content))) + zapReceiver?.forEach { tags.add(ZapSplitSetupSerializer.toTagArray(it)) } + zapRaiserAmount?.let { tags.add(ZapRaiserSerializer.toTagArray(it)) } - zapReceiver?.forEach { - tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString())) - } if (markAsSensitive) { - tags.add(arrayOf("content-warning", "")) + tags.add(ContentWarningSerializer.toTagArray()) } - zapRaiserAmount?.let { tags.add(arrayOf("zapraiser", "$it")) } + geohash?.let { tags.addAll(geohashMipMap(it)) } imetas?.forEach { tags.add(Nip92MediaAttachments.createTag(it)) @@ -99,7 +102,7 @@ open class InteractiveStoryBaseEvent( arrayOf("title", title), summary?.let { arrayOf("summary", it) }, image?.let { arrayOf("image", it) }, - arrayOf("alt", alt), + AltTagSerializer.toTagArray(alt), ) + options.map { val relayUrl = it.address.relay diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/InteractiveStoryPrologueEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/InteractiveStoryPrologueEvent.kt index 6233a2415..9952f71a1 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/InteractiveStoryPrologueEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/InteractiveStoryPrologueEvent.kt @@ -24,7 +24,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag import com.vitorpamplona.quartz.nip22Comments.RootScope -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup import com.vitorpamplona.quartz.nip92IMeta.IMetaTag import com.vitorpamplona.quartz.utils.TimeUtils diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/InteractiveStoryReadingStateEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/InteractiveStoryReadingStateEvent.kt index 4f3c25758..de8bf6463 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/InteractiveStoryReadingStateEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/InteractiveStoryReadingStateEvent.kt @@ -28,6 +28,7 @@ import com.vitorpamplona.quartz.nip01Core.core.firstTagValue import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag import com.vitorpamplona.quartz.nip19Bech32.parse +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.removeTrailingNullsAndEmptyOthers @@ -120,7 +121,7 @@ class InteractiveStoryReadingStateEvent( val tags = listOfNotNull( arrayOf("d", rootTag), - arrayOf("alt", root.title()?.let { ALT2 + it } ?: ALT1), + AltTagSerializer.toTagArray(root.title()?.let { ALT2 + it } ?: ALT1), root.title()?.let { arrayOf("title", it) }, root.summary()?.let { arrayOf("summary", it) }, root.image()?.let { arrayOf("image", it) }, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/InteractiveStorySceneEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/InteractiveStorySceneEvent.kt index 61fbf527c..c4c47a47c 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/InteractiveStorySceneEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/interactiveStories/InteractiveStorySceneEvent.kt @@ -24,7 +24,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag import com.vitorpamplona.quartz.nip22Comments.RootScope -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup import com.vitorpamplona.quartz.nip92IMeta.IMetaTag import com.vitorpamplona.quartz.utils.TimeUtils diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/nip95/FileStorageEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/nip95/FileStorageEvent.kt index f154fb8b8..9bcb44ad0 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/nip95/FileStorageEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/nip95/FileStorageEvent.kt @@ -25,6 +25,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils import java.util.Base64 @@ -68,7 +69,7 @@ class FileStorageEvent( val tags = listOfNotNull( arrayOf(TYPE, mimeType), - arrayOf("alt", ALT), + AltTagSerializer.toTagArray(ALT), ) val content = encode(data) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/nip95/FileStorageHeaderEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/nip95/FileStorageHeaderEvent.kt index 735191fb8..b21bdd6f8 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/nip95/FileStorageHeaderEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/nip95/FileStorageHeaderEvent.kt @@ -24,6 +24,8 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer import com.vitorpamplona.quartz.nip94FileMetadata.Dimension import com.vitorpamplona.quartz.nip94FileMetadata.FileHeaderEvent import com.vitorpamplona.quartz.utils.TimeUtils @@ -91,7 +93,7 @@ class FileStorageHeaderEvent( arrayOf("e", storageEvent.id), mimeType?.let { arrayOf(MIME_TYPE, mimeType) }, hash?.let { arrayOf(HASH, it) }, - alt?.let { arrayOf(ALT, it) } ?: arrayOf("alt", ALT_DESCRIPTION), + alt?.let { arrayOf(ALT, it) } ?: AltTagSerializer.toTagArray(ALT_DESCRIPTION), size?.let { arrayOf(FILE_SIZE, it) }, dimensions?.let { arrayOf(DIMENSION, it.toString()) }, blurhash?.let { arrayOf(BLUR_HASH, it) }, @@ -99,7 +101,7 @@ class FileStorageHeaderEvent( torrentInfoHash?.let { arrayOf(TORRENT_INFOHASH, it) }, sensitiveContent?.let { if (it) { - arrayOf("content-warning", "") + ContentWarningSerializer.toTagArray() } else { null } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/nns/NNSEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/nns/NNSEvent.kt index 4ab1387db..dac617f41 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/nns/NNSEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/nns/NNSEvent.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -50,7 +51,7 @@ class NNSEvent( createdAt: Long = TimeUtils.now(), onReady: (NNSEvent) -> Unit, ) { - val tags = arrayOf(arrayOf("alt", ALT)) + val tags = arrayOf(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags, "", onReady) } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/profileGallery/GalleryListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/profileGallery/GalleryListEvent.kt index fbfca6424..69a8c389b 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/profileGallery/GalleryListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/profileGallery/GalleryListEvent.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.nip51Lists.GeneralListEvent import com.vitorpamplona.quartz.utils.TimeUtils @@ -141,7 +142,7 @@ class GalleryListEvent( if (tags.any { it.size > 1 && it[0] == "alt" }) { tags } else { - tags + arrayOf("alt", ALT) + tags + AltTagSerializer.toTagArray(ALT) } signer.sign(createdAt, KIND, newTags, content, onReady) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/profileGallery/ProfileGalleryEntryEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/profileGallery/ProfileGalleryEntryEvent.kt index 5f30d48f8..f0f36824a 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/profileGallery/ProfileGalleryEntryEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/profileGallery/ProfileGalleryEntryEvent.kt @@ -24,6 +24,8 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer import com.vitorpamplona.quartz.nip94FileMetadata.Dimension import com.vitorpamplona.quartz.utils.TimeUtils @@ -108,7 +110,7 @@ class ProfileGalleryEntryEvent( eventid?.let { etag }, magnetUri?.let { arrayOf(MAGNET_URI, it) }, mimeType?.let { arrayOf(MIME_TYPE, it) }, - alt?.ifBlank { null }?.let { arrayOf(ALT, it) } ?: arrayOf("alt", ALT_DESCRIPTION), + alt?.ifBlank { null }?.let { arrayOf(ALT, it) } ?: AltTagSerializer.toTagArray(ALT_DESCRIPTION), hash?.let { arrayOf(HASH, it) }, size?.let { arrayOf(FILE_SIZE, it) }, dimensions?.let { arrayOf(DIMENSION, it.toString()) }, @@ -118,7 +120,7 @@ class ProfileGalleryEntryEvent( torrentInfoHash?.let { arrayOf(TORRENT_INFOHASH, it) }, sensitiveContent?.let { if (it) { - arrayOf("content-warning", "") + ContentWarningSerializer.toTagArray() } else { null } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/relationshipStatus/RelationshipStatusEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/relationshipStatus/RelationshipStatusEvent.kt index d1fe449fa..90a24d87c 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/relationshipStatus/RelationshipStatusEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/relationshipStatus/RelationshipStatusEvent.kt @@ -23,6 +23,7 @@ package com.vitorpamplona.quartz.experimental.relationshipStatus import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.nip51Lists.PrivateTagArrayEvent import com.vitorpamplona.quartz.utils.TimeUtils @@ -53,7 +54,7 @@ class RelationshipStatusEvent( if (tags.any { it.size > 1 && it[0] == "alt" }) { tags } else { - tags + arrayOf("alt", ALT) + tags + AltTagSerializer.toTagArray(ALT) } signer.sign(createdAt, KIND, newTags, content, onReady) @@ -69,7 +70,7 @@ class RelationshipStatusEvent( ) { val tags = mutableListOf>() tags.add(arrayOf("d", targetUser)) - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) val privateTags = mutableListOf>() petname?.let { privateTags.add(arrayOf(PETNAME, it)) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/zapPolls/PollNoteEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/zapPolls/PollNoteEvent.kt index 268f113ef..63fe66daf 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/experimental/zapPolls/PollNoteEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/experimental/zapPolls/PollNoteEvent.kt @@ -27,7 +27,11 @@ import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag import com.vitorpamplona.quartz.nip01Core.tags.geohash.geohashMipMap import com.vitorpamplona.quartz.nip10Notes.BaseTextNoteEvent import com.vitorpamplona.quartz.nip30CustomEmoji.EmojiUrl -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetupSerializer +import com.vitorpamplona.quartz.nip57Zaps.zapraiser.ZapRaiserSerializer import com.vitorpamplona.quartz.nip92IMeta.IMetaTag import com.vitorpamplona.quartz.nip92IMeta.Nip92MediaAttachments import com.vitorpamplona.quartz.utils.TimeUtils @@ -102,19 +106,18 @@ class PollNoteEvent( tags.add(arrayOf(CONSENSUS_THRESHOLD, consensusThreshold.toString())) } closedAt?.let { tags.add(arrayOf(CLOSED_AT, closedAt.toString())) } - zapReceiver?.forEach { - tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString())) - } + zapReceiver?.forEach { tags.add(ZapSplitSetupSerializer.toTagArray(it)) } + zapRaiserAmount?.let { tags.add(ZapRaiserSerializer.toTagArray(it)) } + if (markAsSensitive) { - tags.add(arrayOf("content-warning", "")) + tags.add(ContentWarningSerializer.toTagArray()) } - zapRaiserAmount?.let { tags.add(arrayOf("zapraiser", "$it")) } geohash?.let { tags.addAll(geohashMipMap(it)) } imetas?.forEach { tags.add(Nip92MediaAttachments.createTag(it)) } emojis?.forEach { tags.add(it.toTagArray()) } - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) if (isDraft) { signer.assembleRumor(createdAt, KIND, tags.toTypedArray(), msg, onReady) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/MetadataEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/MetadataEvent.kt index 98968d258..f62f9cc68 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/MetadataEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/MetadataEvent.kt @@ -28,6 +28,7 @@ import com.vitorpamplona.quartz.nip01Core.jackson.EventMapper import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerSync import com.vitorpamplona.quartz.nip21UriScheme.toNostrUri +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.nip39ExtIdentities.updateClaims import com.vitorpamplona.quartz.utils.TimeUtils import java.io.ByteArrayInputStream @@ -68,7 +69,7 @@ class MetadataEvent( val tags = mutableListOf>() tags.add( - arrayOf("alt", "User profile for ${name ?: currentJson.get("name").asText() ?: ""}"), + AltTagSerializer.toTagArray("User profile for ${name ?: currentJson.get("name").asText() ?: ""}"), ) return signer.sign(createdAt, KIND, tags.toTypedArray(), writer.buffer.toString()) @@ -118,7 +119,7 @@ class MetadataEvent( ObjectMapper().writeValue(writer, currentJson) val tags = mutableListOf>() - tags.add(arrayOf("alt", "User profile for ${name ?: currentJson.get("name").asText() ?: ""}")) + tags.add(AltTagSerializer.toTagArray("User profile for ${name ?: currentJson.get("name").asText() ?: ""}")) latest?.updateClaims(twitter, github, mastodon)?.forEach { tags.add(it) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip02FollowList/ContactListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip02FollowList/ContactListEvent.kt index 7e4af3b1a..293170f69 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip02FollowList/ContactListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip02FollowList/ContactListEvent.kt @@ -39,6 +39,7 @@ import com.vitorpamplona.quartz.nip01Core.tags.people.isTaggedUser import com.vitorpamplona.quartz.nip01Core.toHexKey import com.vitorpamplona.quartz.nip19Bech32.decodePublicKey import com.vitorpamplona.quartz.nip19Bech32.parse +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable data class Contact( @@ -143,7 +144,7 @@ class ContactListEvent( } val tags = - listOf(arrayOf("alt", ALT)) + + listOf(AltTagSerializer.toTagArray(ALT)) + followUsers.map { listOfNotNull("p", it.pubKeyHex, it.relayUri).toTypedArray() } + @@ -413,7 +414,7 @@ class ContactListEvent( if (tags.any { it.size > 1 && it[0] == "alt" }) { tags } else { - tags + arrayOf("alt", ALT) + tags + AltTagSerializer.toTagArray(ALT) } signer.sign(createdAt, KIND, newTags, content, onReady) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/OtsEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/OtsEvent.kt index 4f012cc2f..bfac829ec 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/OtsEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/OtsEvent.kt @@ -34,6 +34,7 @@ import com.vitorpamplona.quartz.nip03Timestamp.ots.OpenTimestamps import com.vitorpamplona.quartz.nip03Timestamp.ots.VerifyResult import com.vitorpamplona.quartz.nip03Timestamp.ots.exceptions.UrlException import com.vitorpamplona.quartz.nip03Timestamp.ots.op.OpSHA256 +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.pointerSizeInBytes import kotlinx.coroutines.CancellationException @@ -178,7 +179,7 @@ class OtsEvent( val tags = arrayOf( arrayOf("e", eventId), - arrayOf("alt", ALT), + AltTagSerializer.toTagArray(ALT), ) signer.sign(createdAt, KIND, tags, otsFileBase64, onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/ots/Hash.java b/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/ots/Hash.java index ec2a4f479..939e0a52f 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/ots/Hash.java +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/ots/Hash.java @@ -1,11 +1,11 @@ package com.vitorpamplona.quartz.nip03Timestamp.ots; -import com.vitorpamplona.quartz.utils.Hex; import com.vitorpamplona.quartz.nip03Timestamp.ots.op.OpCrypto; import com.vitorpamplona.quartz.nip03Timestamp.ots.op.OpKECCAK256; import com.vitorpamplona.quartz.nip03Timestamp.ots.op.OpRIPEMD160; import com.vitorpamplona.quartz.nip03Timestamp.ots.op.OpSHA1; import com.vitorpamplona.quartz.nip03Timestamp.ots.op.OpSHA256; +import com.vitorpamplona.quartz.utils.Hex; import java.io.File; import java.io.IOException; diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/ots/OpenTimestamps.java b/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/ots/OpenTimestamps.java index 6ae51dd59..425003bd0 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/ots/OpenTimestamps.java +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/ots/OpenTimestamps.java @@ -2,7 +2,6 @@ package com.vitorpamplona.quartz.nip03Timestamp.ots; import android.util.Log; -import com.vitorpamplona.quartz.utils.Hex; import com.vitorpamplona.quartz.nip03Timestamp.ots.attestation.BitcoinBlockHeaderAttestation; import com.vitorpamplona.quartz.nip03Timestamp.ots.attestation.EthereumBlockHeaderAttestation; import com.vitorpamplona.quartz.nip03Timestamp.ots.attestation.LitecoinBlockHeaderAttestation; @@ -12,6 +11,7 @@ import com.vitorpamplona.quartz.nip03Timestamp.ots.exceptions.VerificationExcept import com.vitorpamplona.quartz.nip03Timestamp.ots.op.OpAppend; import com.vitorpamplona.quartz.nip03Timestamp.ots.op.OpCrypto; import com.vitorpamplona.quartz.nip03Timestamp.ots.op.OpSHA256; +import com.vitorpamplona.quartz.utils.Hex; import java.io.IOException; import java.nio.charset.StandardCharsets; diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/ots/Timestamp.java b/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/ots/Timestamp.java index 7e3ac7af7..3e424d9a7 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/ots/Timestamp.java +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/ots/Timestamp.java @@ -1,11 +1,11 @@ package com.vitorpamplona.quartz.nip03Timestamp.ots; -import com.vitorpamplona.quartz.utils.Hex; import com.vitorpamplona.quartz.nip03Timestamp.ots.attestation.BitcoinBlockHeaderAttestation; import com.vitorpamplona.quartz.nip03Timestamp.ots.attestation.TimeAttestation; import com.vitorpamplona.quartz.nip03Timestamp.ots.exceptions.DeserializationException; import com.vitorpamplona.quartz.nip03Timestamp.ots.op.Op; import com.vitorpamplona.quartz.nip03Timestamp.ots.op.OpBinary; +import com.vitorpamplona.quartz.utils.Hex; import java.util.ArrayList; import java.util.Arrays; diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/ots/op/OpBinary.java b/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/ots/op/OpBinary.java index 9e2e91529..3d7b5a18d 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/ots/op/OpBinary.java +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip03Timestamp/ots/op/OpBinary.java @@ -2,11 +2,11 @@ package com.vitorpamplona.quartz.nip03Timestamp.ots.op; import android.util.Log; -import com.vitorpamplona.quartz.utils.Hex; import com.vitorpamplona.quartz.nip03Timestamp.ots.StreamDeserializationContext; import com.vitorpamplona.quartz.nip03Timestamp.ots.StreamSerializationContext; import com.vitorpamplona.quartz.nip03Timestamp.ots.Utils; import com.vitorpamplona.quartz.nip03Timestamp.ots.exceptions.DeserializationException; +import com.vitorpamplona.quartz.utils.Hex; import java.util.Arrays; diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip04Dm/PrivateDmEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip04Dm/PrivateDmEvent.kt index 7e0889e40..84bb7302b 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip04Dm/PrivateDmEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip04Dm/PrivateDmEvent.kt @@ -28,7 +28,11 @@ import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.geohash.geohashMipMap import com.vitorpamplona.quartz.nip17Dm.ChatroomKey import com.vitorpamplona.quartz.nip17Dm.ChatroomKeyable -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetupSerializer +import com.vitorpamplona.quartz.nip57Zaps.zapraiser.ZapRaiserSerializer import com.vitorpamplona.quartz.nip92IMeta.IMetaTag import com.vitorpamplona.quartz.utils.Hex import com.vitorpamplona.quartz.utils.TimeUtils @@ -149,13 +153,13 @@ class PrivateDmEvent( publishedRecipientPubKey?.let { tags.add(arrayOf("p", publishedRecipientPubKey)) } replyTos?.forEach { tags.add(arrayOf("e", it, "", "reply")) } mentions?.forEach { tags.add(arrayOf("p", it)) } - zapReceiver?.forEach { - tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString())) - } + zapReceiver?.forEach { tags.add(ZapSplitSetupSerializer.toTagArray(it)) } + zapRaiserAmount?.let { tags.add(ZapRaiserSerializer.toTagArray(it)) } + if (markAsSensitive) { - tags.add(arrayOf("content-warning", "")) + tags.add(ContentWarningSerializer.toTagArray()) } - zapRaiserAmount?.let { tags.add(arrayOf("zapraiser", "$it")) } + geohash?.let { tags.addAll(geohashMipMap(it)) } /* Privacy issue: DO NOT ADD THESE TO THE TAGS. imetas?.forEach { @@ -163,7 +167,7 @@ class PrivateDmEvent( } */ - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) signer.nip04Encrypt(message, recipientPubKey) { content -> if (isDraft) { diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip09Deletions/DeletionEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip09Deletions/DeletionEvent.kt index 4187366b7..024d0262e 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip09Deletions/DeletionEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip09Deletions/DeletionEvent.kt @@ -27,6 +27,7 @@ import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.addressables.taggedAddresses import com.vitorpamplona.quartz.nip01Core.tags.events.taggedEvents +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -68,7 +69,7 @@ class DeletionEvent( tags.addAll(deleteEvents.map { arrayOf("e", it.id) }) tags.addAll(deleteEvents.mapNotNull { if (it is AddressableEvent) arrayOf("a", it.address().toTag()) else null }) tags.addAll(kinds) - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags.toTypedArray(), content, onReady) } @@ -92,7 +93,7 @@ class DeletionEvent( tags.addAll(deleteEvents.map { arrayOf("e", it.id) }) tags.addAll(kinds) - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags.toTypedArray(), content, onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip10Notes/PTag.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip10Notes/PTag.kt index 38b830b3c..06b4c2f5d 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip10Notes/PTag.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip10Notes/PTag.kt @@ -49,4 +49,11 @@ data class PTag( fun toNPub(): String = pubKeyHex.hexToByteArray().toNpub() fun toPTagArray() = removeTrailingNullsAndEmptyOthers("p", pubKeyHex, relay) + + companion object { + fun parse(tags: Array): PTag { + require(tags[0] == "p") + return PTag(tags[1], tags.getOrNull(2)) + } + } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip10Notes/TextNoteEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip10Notes/TextNoteEvent.kt index 5d302ef95..8987c7909 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip10Notes/TextNoteEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip10Notes/TextNoteEvent.kt @@ -32,7 +32,11 @@ import com.vitorpamplona.quartz.nip10Notes.content.buildUrlRefs import com.vitorpamplona.quartz.nip10Notes.content.findHashtags import com.vitorpamplona.quartz.nip10Notes.content.findURLs import com.vitorpamplona.quartz.nip30CustomEmoji.EmojiUrl -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetupSerializer +import com.vitorpamplona.quartz.nip57Zaps.zapraiser.ZapRaiserSerializer import com.vitorpamplona.quartz.nip92IMeta.IMetaTag import com.vitorpamplona.quartz.nip92IMeta.Nip92MediaAttachments import com.vitorpamplona.quartz.utils.TimeUtils @@ -50,6 +54,12 @@ class TextNoteEvent( companion object { const val KIND = 1 + const val ALT = "A short note: " + + fun shortedMessageForAlt(msg: String): String { + if (msg.length < 50) return ALT + msg + return ALT + msg.take(50) + "..." + } fun create( msg: String, @@ -73,6 +83,7 @@ class TextNoteEvent( onReady: (TextNoteEvent) -> Unit, ) { val tags = mutableListOf>() + tags.add(AltTagSerializer.toTagArray(shortedMessageForAlt(msg))) replyTos?.let { tags.addAll( it.positionalMarkedTags( @@ -116,13 +127,13 @@ class TextNoteEvent( } tags.addAll(buildHashtagTags(findHashtags(msg) + (extraTags ?: emptyList()))) tags.addAll(buildUrlRefs(findURLs(msg))) - zapReceiver?.forEach { - tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString())) - } + zapReceiver?.forEach { tags.add(ZapSplitSetupSerializer.toTagArray(it)) } + zapRaiserAmount?.let { tags.add(ZapRaiserSerializer.toTagArray(it)) } + if (markAsSensitive) { - tags.add(arrayOf("content-warning", "")) + tags.add(ContentWarningSerializer.toTagArray()) } - zapRaiserAmount?.let { tags.add(arrayOf("zapraiser", "$it")) } + geohash?.let { tags.addAll(geohashMipMap(it)) } imetas?.forEach { tags.add(Nip92MediaAttachments.createTag(it)) } emojis?.forEach { tags.add(it.toTagArray()) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip14Subject/EventExt.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip14Subject/EventExt.kt index 3901c34b4..c30e37095 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip14Subject/EventExt.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip14Subject/EventExt.kt @@ -23,4 +23,6 @@ package com.vitorpamplona.quartz.nip14Subject import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.firstTagValue -fun Event.subject() = tags.firstTagValue("subject") +val SUBJECT_TAG = "subject" + +fun Event.subject() = tags.firstTagValue(SUBJECT_TAG) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip14Subject/SubjectTagSerializer.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip14Subject/SubjectTagSerializer.kt new file mode 100644 index 000000000..afaede02f --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip14Subject/SubjectTagSerializer.kt @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2024 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.quartz.nip14Subject + +class SubjectTagSerializer { + companion object { + @JvmStatic + fun toTagArray(subject: String = "") = arrayOf(SUBJECT_TAG, subject) + } +} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/ChatMessageEncryptedFileHeaderEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/ChatMessageEncryptedFileHeaderEvent.kt index 78fd264b0..003a403b3 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/ChatMessageEncryptedFileHeaderEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/ChatMessageEncryptedFileHeaderEvent.kt @@ -25,6 +25,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.hexToByteArray import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.toHexKey +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer import com.vitorpamplona.quartz.nip59Giftwrap.WrappedEvent import com.vitorpamplona.quartz.nip94FileMetadata.Dimension import com.vitorpamplona.quartz.utils.TimeUtils @@ -150,7 +151,7 @@ class ChatMessageEncryptedFileHeaderEvent( blurhash?.let { arrayOf(BLUR_HASH, it) }, sensitiveContent?.let { if (it) { - arrayOf("content-warning", "") + ContentWarningSerializer.toTagArray() } else { null } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/ChatMessageEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/ChatMessageEvent.kt index a16d18125..af5d86b1b 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/ChatMessageEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/ChatMessageEvent.kt @@ -24,8 +24,12 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.geohash.geohashMipMap +import com.vitorpamplona.quartz.nip14Subject.SubjectTagSerializer import com.vitorpamplona.quartz.nip30CustomEmoji.EmojiUrl -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetupSerializer +import com.vitorpamplona.quartz.nip57Zaps.zapraiser.ZapRaiserSerializer import com.vitorpamplona.quartz.nip59Giftwrap.WrappedEvent import com.vitorpamplona.quartz.nip92IMeta.IMetaTag import com.vitorpamplona.quartz.nip92IMeta.Nip92MediaAttachments @@ -95,20 +99,19 @@ class ChatMessageEvent( to?.forEach { tags.add(arrayOf("p", it)) } replyTos?.forEach { tags.add(arrayOf("e", it, "", "reply")) } mentions?.forEach { tags.add(arrayOf("p", it, "", "mention")) } - zapReceiver?.forEach { - tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString())) - } + zapReceiver?.forEach { tags.add(ZapSplitSetupSerializer.toTagArray(it)) } + zapRaiserAmount?.let { tags.add(ZapRaiserSerializer.toTagArray(it)) } + if (markAsSensitive) { - tags.add(arrayOf("content-warning", "")) + tags.add(ContentWarningSerializer.toTagArray()) } - zapRaiserAmount?.let { tags.add(arrayOf("zapraiser", "$it")) } geohash?.let { tags.addAll(geohashMipMap(it)) } - subject?.let { tags.add(arrayOf("subject", it)) } + subject?.let { tags.add(SubjectTagSerializer.toTagArray(it)) } imetas?.forEach { tags.add(Nip92MediaAttachments.createTag(it)) } emojis?.forEach { tags.add(it.toTagArray()) } - // tags.add(arrayOf("alt", alt)) + // tags.add(AltTagSerializer.toTagArray(ALT)) if (isDraft) { signer.assembleRumor(createdAt, KIND, tags.toTypedArray(), msg, onReady) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/ChatMessageRelayListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/ChatMessageRelayListEvent.kt index 3893b3011..b3f5cbc77 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/ChatMessageRelayListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/ChatMessageRelayListEvent.kt @@ -26,6 +26,7 @@ import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerSync import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -60,7 +61,7 @@ class ChatMessageRelayListEvent( relays .map { arrayOf("relay", it) - }.plusElement(arrayOf("alt", "Relay list to receive private messages")) + }.plusElement(AltTagSerializer.toTagArray("Relay list to receive private messages")) .toTypedArray() fun updateRelayList( diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/NIP17Factory.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/NIP17Factory.kt index 2b08a0e2b..8f7b1296d 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/NIP17Factory.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip17Dm/NIP17Factory.kt @@ -25,7 +25,7 @@ import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip25Reactions.ReactionEvent import com.vitorpamplona.quartz.nip30CustomEmoji.EmojiUrl -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup import com.vitorpamplona.quartz.nip59Giftwrap.GiftWrapEvent import com.vitorpamplona.quartz.nip59Giftwrap.SealedGossipEvent import com.vitorpamplona.quartz.nip92IMeta.IMetaTag diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip18Reposts/GenericRepostEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip18Reposts/GenericRepostEvent.kt index 54b9f48ff..124d678b0 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip18Reposts/GenericRepostEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip18Reposts/GenericRepostEvent.kt @@ -25,6 +25,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.AddressableEvent import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -70,7 +71,7 @@ class GenericRepostEvent( } tags.add(arrayOf("k", "${boostedPost.kind}")) - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags.toTypedArray(), content, onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip18Reposts/RepostEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip18Reposts/RepostEvent.kt index 0cf2c5509..332ab407b 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip18Reposts/RepostEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip18Reposts/RepostEvent.kt @@ -27,6 +27,7 @@ import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.events.taggedEvents import com.vitorpamplona.quartz.nip01Core.tags.people.taggedUsers +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -70,7 +71,7 @@ class RepostEvent( tags += listOf(arrayOf("a", boostedPost.address().toTag())) } - tags += listOf(arrayOf("alt", ALT)) + tags += listOf(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags, content, onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip19Bech32/Nip19Parser.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip19Bech32/Nip19Parser.kt index be66f40eb..6d24c4c1a 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip19Bech32/Nip19Parser.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip19Bech32/Nip19Parser.kt @@ -72,7 +72,7 @@ object Nip19Parser { val type = matcher.group(2) // npub1 val key = matcher.group(3) // bech32 - return type + key + return type!! + key } catch (e: Throwable) { Log.e("NIP19 Parser", "Issue trying to Decode NIP19 $uri: ${e.message}", e) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip22Comments/CommentEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip22Comments/CommentEvent.kt index c77821328..34fa19ccd 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip22Comments/CommentEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip22Comments/CommentEvent.kt @@ -37,7 +37,10 @@ import com.vitorpamplona.quartz.nip10Notes.content.findHashtags import com.vitorpamplona.quartz.nip10Notes.content.findURLs import com.vitorpamplona.quartz.nip19Bech32.parseAtag import com.vitorpamplona.quartz.nip30CustomEmoji.EmojiUrl -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetupSerializer +import com.vitorpamplona.quartz.nip57Zaps.zapraiser.ZapRaiserSerializer import com.vitorpamplona.quartz.nip92IMeta.IMetaTag import com.vitorpamplona.quartz.nip92IMeta.Nip92MediaAttachments import com.vitorpamplona.quartz.utils.TimeUtils @@ -212,13 +215,12 @@ class CommentEvent( emojis?.forEach { tags.add(it.toTagArray()) } - zapReceiver?.forEach { - tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString())) - } + zapReceiver?.forEach { tags.add(ZapSplitSetupSerializer.toTagArray(it)) } + zapRaiserAmount?.let { tags.add(ZapRaiserSerializer.toTagArray(it)) } + if (markAsSensitive) { - tags.add(arrayOf("content-warning", "")) + tags.add(ContentWarningSerializer.toTagArray()) } - zapRaiserAmount?.let { tags.add(arrayOf("zapraiser", "$it")) } geohash?.let { tags.addAll(geohashMipMap(it)) } imetas?.forEach { tags.add(Nip92MediaAttachments.createTag(it)) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip23LongContent/LongTextNoteEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip23LongContent/LongTextNoteEvent.kt index b2b9058db..9f3a07cc4 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip23LongContent/LongTextNoteEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip23LongContent/LongTextNoteEvent.kt @@ -28,6 +28,7 @@ import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag import com.vitorpamplona.quartz.nip01Core.tags.addressables.dTag import com.vitorpamplona.quartz.nip01Core.tags.hashtags.hashtags import com.vitorpamplona.quartz.nip10Notes.BaseTextNoteEvent +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -77,7 +78,7 @@ class LongTextNoteEvent( replyTos?.forEach { tags.add(arrayOf("e", it)) } mentions?.forEach { tags.add(arrayOf("p", it)) } title?.let { tags.add(arrayOf("title", it)) } - tags.add(arrayOf("alt", "Blog post: $title")) + tags.add(AltTagSerializer.toTagArray("Blog post: $title")) signer.sign(createdAt, KIND, tags.toTypedArray(), msg, onReady) } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelCreateEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelCreateEvent.kt index 078c1a9cf..717f79293 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelCreateEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelCreateEvent.kt @@ -27,6 +27,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.jackson.EventMapper import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -87,7 +88,7 @@ class ChannelCreateEvent( val tags = arrayOf( - arrayOf("alt", "Public chat creation event ${channelInfo?.name?.let { "about $it" }}"), + AltTagSerializer.toTagArray("Public chat creation event ${channelInfo?.name?.let { "about $it" }}"), ) signer.sign(createdAt, KIND, tags, content, onReady) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelHideMessageEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelHideMessageEvent.kt index 099661155..27fa3e37c 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelHideMessageEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelHideMessageEvent.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -57,7 +58,7 @@ class ChannelHideMessageEvent( ( messagesToHide?.map { arrayOf("e", it) }?.toTypedArray() ?: emptyArray() - ) + arrayOf(arrayOf("alt", ALT)) + ) + arrayOf(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags, reason, onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelListEvent.kt index 56465959d..dc689c09d 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelListEvent.kt @@ -23,6 +23,7 @@ package com.vitorpamplona.quartz.nip28PublicChat import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.nip51Lists.GeneralListEvent import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.bytesUsedInMemory @@ -264,7 +265,7 @@ class ChannelListEvent( if (tags.any { it.size > 1 && it[0] == "alt" }) { tags } else { - tags + arrayOf("alt", ALT) + tags + AltTagSerializer.toTagArray(ALT) } signer.sign(createdAt, KIND, newTags, content, onReady) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelMessageEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelMessageEvent.kt index 3c0448d64..9b8d8ccb8 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelMessageEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelMessageEvent.kt @@ -26,7 +26,11 @@ import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.geohash.geohashMipMap import com.vitorpamplona.quartz.nip10Notes.BaseTextNoteEvent import com.vitorpamplona.quartz.nip30CustomEmoji.EmojiUrl -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetupSerializer +import com.vitorpamplona.quartz.nip57Zaps.zapraiser.ZapRaiserSerializer import com.vitorpamplona.quartz.nip92IMeta.IMetaTag import com.vitorpamplona.quartz.nip92IMeta.Nip92MediaAttachments import com.vitorpamplona.quartz.utils.TimeUtils @@ -82,20 +86,19 @@ class ChannelMessageEvent( tags.add(arrayOf("e", it)) } } - zapReceiver?.forEach { - tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString())) - } + zapReceiver?.forEach { tags.add(ZapSplitSetupSerializer.toTagArray(it)) } + zapRaiserAmount?.let { tags.add(ZapRaiserSerializer.toTagArray(it)) } + if (markAsSensitive) { - tags.add(arrayOf("content-warning", "")) + tags.add(ContentWarningSerializer.toTagArray()) } - zapRaiserAmount?.let { tags.add(arrayOf("zapraiser", "$it")) } geohash?.let { tags.addAll(geohashMipMap(it)) } imetas?.forEach { tags.add(Nip92MediaAttachments.createTag(it)) } emojis?.forEach { tags.add(it.toTagArray()) } tags.add( - arrayOf("alt", ALT), + AltTagSerializer.toTagArray(ALT), ) if (isDraft) { diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelMetadataEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelMetadataEvent.kt index ae566f5a9..137d39136 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelMetadataEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelMetadataEvent.kt @@ -26,6 +26,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.jackson.EventMapper import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -91,7 +92,7 @@ class ChannelMetadataEvent( val tags = listOf( arrayOf("e", originalChannelIdHex, "", "root"), - arrayOf("alt", "Public chat update to ${newChannelInfo?.name}"), + AltTagSerializer.toTagArray("Public chat update to ${newChannelInfo?.name}"), ) signer.sign(createdAt, KIND, tags.toTypedArray(), content, onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelMuteUserEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelMuteUserEvent.kt index 9bae646b2..d5b39ce35 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelMuteUserEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip28PublicChat/ChannelMuteUserEvent.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -58,7 +59,7 @@ class ChannelMuteUserEvent( ( usersToMute?.map { arrayOf("p", it) }?.toTypedArray() ?: emptyArray() - ) + arrayOf(arrayOf("alt", ALT)) + ) + arrayOf(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags, content, onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip30CustomEmoji/EmojiPackEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip30CustomEmoji/EmojiPackEvent.kt index 7ee535e93..db83d02c9 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip30CustomEmoji/EmojiPackEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip30CustomEmoji/EmojiPackEvent.kt @@ -23,6 +23,7 @@ package com.vitorpamplona.quartz.nip30CustomEmoji import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.nip51Lists.GeneralListEvent import com.vitorpamplona.quartz.utils.TimeUtils @@ -49,7 +50,7 @@ class EmojiPackEvent( val tags = mutableListOf>() tags.add(arrayOf("d", name)) - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags.toTypedArray(), content, onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip30CustomEmoji/EmojiPackSelectionEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip30CustomEmoji/EmojiPackSelectionEvent.kt index e7099f079..b670eca9a 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip30CustomEmoji/EmojiPackSelectionEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip30CustomEmoji/EmojiPackSelectionEvent.kt @@ -25,6 +25,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.nip65RelayList.AdvertisedRelayListEvent import com.vitorpamplona.quartz.utils.TimeUtils @@ -70,7 +71,7 @@ class EmojiPackSelectionEvent( listOfEmojiPacks?.forEach { tags.add(arrayOf("a", it.toTag())) } - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags.toTypedArray(), msg, onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip31Alts/AltTagSerializer.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip31Alts/AltTagSerializer.kt new file mode 100644 index 000000000..a696f5813 --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip31Alts/AltTagSerializer.kt @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2024 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.quartz.nip31Alts + +class AltTagSerializer { + companion object { + @JvmStatic + fun toTagArray(altDescriptor: String = "") = arrayOf(ALT_TAG, altDescriptor) + } +} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip31Alts/EventExt.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip31Alts/EventExt.kt new file mode 100644 index 000000000..c83d28845 --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip31Alts/EventExt.kt @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2024 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.quartz.nip31Alts + +import com.vitorpamplona.quartz.nip01Core.core.Event +import com.vitorpamplona.quartz.nip01Core.core.firstTagValue + +val ALT_TAG = "alt" + +fun Event.alt() = tags.firstTagValue(ALT_TAG) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip34Git/GitIssueEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip34Git/GitIssueEvent.kt index 84dd532db..7fb1977c6 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip34Git/GitIssueEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip34Git/GitIssueEvent.kt @@ -26,6 +26,7 @@ import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag import com.vitorpamplona.quartz.nip10Notes.BaseTextNoteEvent import com.vitorpamplona.quartz.nip19Bech32.parse +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -73,7 +74,7 @@ class GitIssueEvent( arrayOf(), ) - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags.toTypedArray(), content, onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip34Git/GitPatchEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip34Git/GitPatchEvent.kt index 7835ef0f6..befa100b7 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip34Git/GitPatchEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip34Git/GitPatchEvent.kt @@ -26,6 +26,7 @@ import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag import com.vitorpamplona.quartz.nip19Bech32.parse +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -89,7 +90,7 @@ class GitPatchEvent( arrayOf(), ) - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags.toTypedArray(), content, onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip34Git/GitReplyEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip34Git/GitReplyEvent.kt index e34c617dc..74ce3b189 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip34Git/GitReplyEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip34Git/GitReplyEvent.kt @@ -35,7 +35,11 @@ import com.vitorpamplona.quartz.nip10Notes.content.findURLs import com.vitorpamplona.quartz.nip10Notes.positionalMarkedTags import com.vitorpamplona.quartz.nip19Bech32.parse import com.vitorpamplona.quartz.nip30CustomEmoji.EmojiUrl -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetupSerializer +import com.vitorpamplona.quartz.nip57Zaps.zapraiser.ZapRaiserSerializer import com.vitorpamplona.quartz.nip92IMeta.IMetaTag import com.vitorpamplona.quartz.nip92IMeta.Nip92MediaAttachments import com.vitorpamplona.quartz.utils.TimeUtils @@ -85,7 +89,7 @@ class GitReplyEvent( arrayOf(), ) - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags.toTypedArray(), content, onReady) } @@ -149,19 +153,17 @@ class GitReplyEvent( } tags.addAll(buildHashtagTags(findHashtags(msg))) tags.addAll(buildUrlRefs(findURLs(msg))) - zapReceiver?.forEach { - tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString())) - } + zapReceiver?.forEach { tags.add(ZapSplitSetupSerializer.toTagArray(it)) } + zapRaiserAmount?.let { tags.add(ZapRaiserSerializer.toTagArray(it)) } if (markAsSensitive) { - tags.add(arrayOf("content-warning", "")) + tags.add(ContentWarningSerializer.toTagArray()) } - zapRaiserAmount?.let { tags.add(arrayOf("zapraiser", "$it")) } geohash?.let { tags.addAll(geohashMipMap(it)) } imetas?.forEach { tags.add(Nip92MediaAttachments.createTag(it)) } emojis?.forEach { tags.add(it.toTagArray()) } - tags.add(arrayOf("alt", "a git issue reply")) + tags.add(AltTagSerializer.toTagArray("a git issue reply")) if (isDraft) { signer.assembleRumor(createdAt, KIND, tags.toTypedArray(), msg, onReady) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip34Git/GitRepositoryEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip34Git/GitRepositoryEvent.kt index a696ae48b..090121e35 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip34Git/GitRepositoryEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip34Git/GitRepositoryEvent.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -53,7 +54,7 @@ class GitRepositoryEvent( onReady: (GitRepositoryEvent) -> Unit, ) { val tags = mutableListOf>() - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags.toTypedArray(), "", onReady) } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip35Torrents/TorrentCommentEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip35Torrents/TorrentCommentEvent.kt index c08938fe2..9c022b150 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip35Torrents/TorrentCommentEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip35Torrents/TorrentCommentEvent.kt @@ -34,7 +34,11 @@ import com.vitorpamplona.quartz.nip10Notes.content.findHashtags import com.vitorpamplona.quartz.nip10Notes.content.findURLs import com.vitorpamplona.quartz.nip10Notes.positionalMarkedTags import com.vitorpamplona.quartz.nip30CustomEmoji.EmojiUrl -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetupSerializer +import com.vitorpamplona.quartz.nip57Zaps.zapraiser.ZapRaiserSerializer import com.vitorpamplona.quartz.nip92IMeta.IMetaTag import com.vitorpamplona.quartz.nip92IMeta.Nip92MediaAttachments import com.vitorpamplona.quartz.utils.TimeUtils @@ -120,20 +124,18 @@ class TorrentCommentEvent( tags.addAll(buildHashtagTags(findHashtags(message))) tags.addAll(buildUrlRefs(findURLs(message))) - zapReceiver?.forEach { - tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString())) - } + zapReceiver?.forEach { tags.add(ZapSplitSetupSerializer.toTagArray(it)) } + zapRaiserAmount?.let { tags.add(ZapRaiserSerializer.toTagArray(it)) } if (markAsSensitive) { - tags.add(arrayOf("content-warning", "")) + tags.add(ContentWarningSerializer.toTagArray()) } - zapRaiserAmount?.let { tags.add(arrayOf("zapraiser", "$it")) } geohash?.let { tags.addAll(geohashMipMap(it)) } imetas?.forEach { tags.add(Nip92MediaAttachments.createTag(it)) } emojis?.forEach { tags.add(it.toTagArray()) } - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) if (isDraft) { signer.assembleRumor(createdAt, KIND, tags.toTypedArray(), content, onReady) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip35Torrents/TorrentEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip35Torrents/TorrentEvent.kt index 3c1eb40e3..5b201d6b9 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip35Torrents/TorrentEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip35Torrents/TorrentEvent.kt @@ -27,6 +27,8 @@ import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.firstTagValue import com.vitorpamplona.quartz.nip01Core.core.mapValues import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -96,10 +98,10 @@ class TorrentEvent( arrayOf("title", title), arrayOf("btih", btih), x?.let { arrayOf("x", it) }, - alt?.let { arrayOf("alt", it) } ?: arrayOf("alt", ALT_DESCRIPTION), + alt?.let { arrayOf("alt", it) } ?: AltTagSerializer.toTagArray(ALT_DESCRIPTION), sensitiveContent?.let { if (it) { - arrayOf("content-warning", "") + ContentWarningSerializer.toTagArray() } else { null } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip36SensitiveContent/ContentWarningSerializer.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip36SensitiveContent/ContentWarningSerializer.kt new file mode 100644 index 000000000..f04756dd1 --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip36SensitiveContent/ContentWarningSerializer.kt @@ -0,0 +1,27 @@ +/** + * Copyright (c) 2024 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.quartz.nip36SensitiveContent + +class ContentWarningSerializer { + companion object { + fun toTagArray(reason: String = "") = arrayOf(CONTENT_WARNING, reason) + } +} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip36SensitiveContent/EventExt.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip36SensitiveContent/EventExt.kt index 8e506b86f..1568449dc 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip36SensitiveContent/EventExt.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip36SensitiveContent/EventExt.kt @@ -22,10 +22,12 @@ package com.vitorpamplona.quartz.nip36SensitiveContent import com.vitorpamplona.quartz.nip01Core.core.Event -fun Event.isSensitive() = tags.any { (it.size > 0 && it[0] == "content-warning") } +const val CONTENT_WARNING = "content-warning" + +fun Event.isSensitive() = tags.any { (it.size > 0 && it[0] == CONTENT_WARNING) } fun Event.isSensitiveOrNSFW() = tags.any { - (it.size > 0 && it[0] == "content-warning") || + (it.size > 0 && it[0] == CONTENT_WARNING) || (it.size > 1 && it[0] == "t" && (it[1].equals("nsfw", true) || it[1].equals("nude", true))) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip46RemoteSigner/NostrConnectEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip46RemoteSigner/NostrConnectEvent.kt index ad25b4dec..e9d32c51f 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip46RemoteSigner/NostrConnectEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip46RemoteSigner/NostrConnectEvent.kt @@ -25,6 +25,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.jackson.EventMapper import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.Hex import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.pointerSizeInBytes @@ -37,16 +38,8 @@ class NostrConnectEvent( tags: Array>, content: String, sig: HexKey, -) : Event( - id, - pubKey, - createdAt, - com.vitorpamplona.quartz.nip46RemoteSigner.NostrConnectEvent.Companion.KIND, - tags, - content, - sig, - ) { - @Transient private var decryptedContent: Map = mapOf() +) : Event(id, pubKey, createdAt, KIND, tags, content, sig) { + @Transient private var decryptedContent: Map = mapOf() override fun countMemory(): Long = super.countMemory() + @@ -71,7 +64,7 @@ class NostrConnectEvent( fun plainContent( signer: NostrSigner, - onReady: (com.vitorpamplona.quartz.nip46RemoteSigner.BunkerMessage) -> Unit, + onReady: (BunkerMessage) -> Unit, ) { decryptedContent[signer.pubKey]?.let { onReady(it) @@ -80,7 +73,7 @@ class NostrConnectEvent( // decrypts using NIP-04 or NIP-44 signer.decrypt(content, talkingWith(signer.pubKey)) { retVal -> - val content = EventMapper.mapper.readValue(retVal, com.vitorpamplona.quartz.nip46RemoteSigner.BunkerMessage::class.java) + val content = EventMapper.mapper.readValue(retVal, BunkerMessage::class.java) decryptedContent = decryptedContent + Pair(signer.pubKey, content) @@ -93,35 +86,22 @@ class NostrConnectEvent( const val ALT = "Nostr Connect Event" fun create( - message: com.vitorpamplona.quartz.nip46RemoteSigner.BunkerMessage, + message: BunkerMessage, remoteKey: HexKey, signer: NostrSigner, createdAt: Long = TimeUtils.now(), - onReady: (com.vitorpamplona.quartz.nip46RemoteSigner.NostrConnectEvent) -> Unit, + onReady: (NostrConnectEvent) -> Unit, ) { val tags = arrayOf( - arrayOf("alt", com.vitorpamplona.quartz.nip46RemoteSigner.NostrConnectEvent.Companion.ALT), + AltTagSerializer.toTagArray(ALT), arrayOf("p", remoteKey), ) - signer.sign( - createdAt, - com.vitorpamplona.quartz.nip46RemoteSigner.NostrConnectEvent.Companion.KIND, - tags, - "", - onReady, - ) val encrypted = EventMapper.mapper.writeValueAsString(message) signer.nip44Encrypt(encrypted, remoteKey) { content -> - signer.sign( - createdAt, - com.vitorpamplona.quartz.nip46RemoteSigner.NostrConnectEvent.Companion.KIND, - tags, - content, - onReady, - ) + signer.sign(createdAt, KIND, tags, content, onReady) } } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip47WalletConnect/LnZapPaymentRequestEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip47WalletConnect/LnZapPaymentRequestEvent.kt index 08073ce4d..97850dd33 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip47WalletConnect/LnZapPaymentRequestEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip47WalletConnect/LnZapPaymentRequestEvent.kt @@ -26,6 +26,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.jackson.EventMapper import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.bytesUsedInMemory import com.vitorpamplona.quartz.utils.pointerSizeInBytes @@ -85,7 +86,7 @@ class LnZapPaymentRequestEvent( ) { val serializedRequest = EventMapper.mapper.writeValueAsString(PayInvoiceMethod.create(lnInvoice)) - val tags = arrayOf(arrayOf("p", walletServicePubkey), arrayOf("alt", ALT)) + val tags = arrayOf(arrayOf("p", walletServicePubkey), AltTagSerializer.toTagArray(ALT)) signer.nip04Encrypt( serializedRequest, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip50Search/SearchRelayListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip50Search/SearchRelayListEvent.kt index e2cfc1cec..93eec3527 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip50Search/SearchRelayListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip50Search/SearchRelayListEvent.kt @@ -26,6 +26,7 @@ import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerSync import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -60,7 +61,7 @@ class SearchRelayListEvent( relays .map { arrayOf("relay", it) - }.plusElement(arrayOf("alt", "Relay list to use for Search")) + }.plusElement(AltTagSerializer.toTagArray("Relay list to use for Search")) .toTypedArray() fun updateRelayList( diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/BookmarkListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/BookmarkListEvent.kt index f25df9ca9..2b14d4785 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/BookmarkListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/BookmarkListEvent.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -199,7 +200,7 @@ class BookmarkListEvent( if (tags.any { it.size > 1 && it[0] == "alt" }) { tags } else { - tags + arrayOf("alt", ALT) + tags + AltTagSerializer.toTagArray(ALT) } signer.sign(createdAt, KIND, newTags, content, onReady) @@ -223,7 +224,7 @@ class BookmarkListEvent( events?.forEach { tags.add(arrayOf("e", it)) } users?.forEach { tags.add(arrayOf("p", it)) } addresses?.forEach { tags.add(arrayOf("a", it.toTag())) } - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) createPrivateTags(privEvents, privUsers, privAddresses, signer) { content -> signer.sign(createdAt, KIND, tags.toTypedArray(), content, onReady) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/MuteListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/MuteListEvent.kt index 81b6b3b50..0cf6478d1 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/MuteListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/MuteListEvent.kt @@ -23,6 +23,7 @@ package com.vitorpamplona.quartz.nip51Lists import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.bytesUsedInMemory import com.vitorpamplona.quartz.utils.pointerSizeInBytes @@ -299,7 +300,7 @@ class MuteListEvent( if (tags.any { it.size > 1 && it[0] == "alt" }) { tags } else { - tags + arrayOf("alt", ALT) + tags + AltTagSerializer.toTagArray(ALT) } signer.sign(createdAt, KIND, newTags, content, onReady) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/PeopleListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/PeopleListEvent.kt index 10db84c0f..c1773f592 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/PeopleListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/PeopleListEvent.kt @@ -23,6 +23,7 @@ package com.vitorpamplona.quartz.nip51Lists import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.bytesUsedInMemory import com.vitorpamplona.quartz.utils.pointerSizeInBytes @@ -350,7 +351,7 @@ class PeopleListEvent( if (tags.any { it.size > 1 && it[0] == "alt" }) { tags } else { - tags + arrayOf("alt", ALT) + tags + AltTagSerializer.toTagArray(ALT) } signer.sign(createdAt, KIND, newTags, content, onReady) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/PinListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/PinListEvent.kt index de4219ea7..6b7633e59 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/PinListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/PinListEvent.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -49,7 +50,7 @@ class PinListEvent( ) { val tags = mutableListOf>() pins.forEach { tags.add(arrayOf("pin", it)) } - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags.toTypedArray(), "", onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/RelaySetEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/RelaySetEvent.kt index 2db1f9dfb..f8da08bbf 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/RelaySetEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip51Lists/RelaySetEvent.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -51,7 +52,7 @@ class RelaySetEvent( ) { val tags = mutableListOf>() relays.forEach { tags.add(arrayOf("r", it)) } - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags.toTypedArray(), "", onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip52Calendar/CalendarDateSlotEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip52Calendar/CalendarDateSlotEvent.kt index 21c6aa9fd..e07f9ba26 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip52Calendar/CalendarDateSlotEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip52Calendar/CalendarDateSlotEvent.kt @@ -25,6 +25,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.core.firstTagValue import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -54,7 +55,7 @@ class CalendarDateSlotEvent( createdAt: Long = TimeUtils.now(), onReady: (CalendarDateSlotEvent) -> Unit, ) { - val tags = arrayOf(arrayOf("alt", ALT)) + val tags = arrayOf(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags, "", onReady) } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip52Calendar/CalendarEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip52Calendar/CalendarEvent.kt index eae7efd55..8f9cd7f1e 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip52Calendar/CalendarEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip52Calendar/CalendarEvent.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -44,7 +45,7 @@ class CalendarEvent( createdAt: Long = TimeUtils.now(), onReady: (CalendarEvent) -> Unit, ) { - val tags = arrayOf(arrayOf("alt", ALT)) + val tags = arrayOf(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags, "", onReady) } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip52Calendar/CalendarRSVPEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip52Calendar/CalendarRSVPEvent.kt index f7ce1de1c..cd612d77f 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip52Calendar/CalendarRSVPEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip52Calendar/CalendarRSVPEvent.kt @@ -25,6 +25,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.core.firstTagValue import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -56,7 +57,7 @@ class CalendarRSVPEvent( createdAt: Long = TimeUtils.now(), onReady: (CalendarRSVPEvent) -> Unit, ) { - val tags = arrayOf(arrayOf("alt", ALT)) + val tags = arrayOf(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags, "", onReady) } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip52Calendar/CalendarTimeSlotEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip52Calendar/CalendarTimeSlotEvent.kt index 69bde2186..9f716ed77 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip52Calendar/CalendarTimeSlotEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip52Calendar/CalendarTimeSlotEvent.kt @@ -26,6 +26,7 @@ import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.core.firstTagValue import com.vitorpamplona.quartz.nip01Core.core.firstTagValueAsLong import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -61,7 +62,7 @@ class CalendarTimeSlotEvent( createdAt: Long = TimeUtils.now(), onReady: (CalendarTimeSlotEvent) -> Unit, ) { - val tags = arrayOf(arrayOf("alt", ALT)) + val tags = arrayOf(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags, "", onReady) } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip53LiveActivities/LiveActivitiesChatMessageEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip53LiveActivities/LiveActivitiesChatMessageEvent.kt index 4192b65de..cc2c5468d 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip53LiveActivities/LiveActivitiesChatMessageEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip53LiveActivities/LiveActivitiesChatMessageEvent.kt @@ -28,7 +28,11 @@ import com.vitorpamplona.quartz.nip01Core.tags.geohash.geohashMipMap import com.vitorpamplona.quartz.nip10Notes.BaseTextNoteEvent import com.vitorpamplona.quartz.nip19Bech32.parse import com.vitorpamplona.quartz.nip30CustomEmoji.EmojiUrl -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetupSerializer +import com.vitorpamplona.quartz.nip57Zaps.zapraiser.ZapRaiserSerializer import com.vitorpamplona.quartz.nip92IMeta.IMetaTag import com.vitorpamplona.quartz.nip92IMeta.Nip92MediaAttachments import com.vitorpamplona.quartz.utils.TimeUtils @@ -88,19 +92,17 @@ class LiveActivitiesChatMessageEvent( ) replyTos?.forEach { tags.add(arrayOf("e", it)) } mentions?.forEach { tags.add(arrayOf("p", it)) } - zapReceiver?.forEach { - tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString())) - } + zapReceiver?.forEach { tags.add(ZapSplitSetupSerializer.toTagArray(it)) } + zapRaiserAmount?.let { tags.add(ZapRaiserSerializer.toTagArray(it)) } if (markAsSensitive) { - tags.add(arrayOf("content-warning", "")) + tags.add(ContentWarningSerializer.toTagArray()) } - zapRaiserAmount?.let { tags.add(arrayOf("zapraiser", "$it")) } geohash?.let { tags.addAll(geohashMipMap(it)) } imetas?.forEach { tags.add(Nip92MediaAttachments.createTag(it)) } emojis?.forEach { tags.add(it.toTagArray()) } - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) if (isDraft) { signer.assembleRumor(createdAt, KIND, tags.toTypedArray(), content, onReady) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip53LiveActivities/LiveActivitiesEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip53LiveActivities/LiveActivitiesEvent.kt index 25b64f559..3469e9ff5 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip53LiveActivities/LiveActivitiesEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip53LiveActivities/LiveActivitiesEvent.kt @@ -25,6 +25,8 @@ import com.vitorpamplona.quartz.experimental.audio.Participant import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip10Notes.PTag +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -60,7 +62,7 @@ class LiveActivitiesEvent( fun host() = tags.firstOrNull { it.size > 3 && it[0] == "p" && it[3].equals("Host", true) }?.get(1) - fun hosts() = tags.filter { it.size > 3 && it[0] == "p" && it[3].equals("Host", true) }.map { it[1] } + fun hosts() = tags.filter { it.size > 3 && it[0] == "p" && it[3].equals("Host", true) }.map { PTag(it[1], it.getOrNull(2)) } fun checkStatus(eventStatus: String?): String? = if (eventStatus == STATUS_LIVE && createdAt < TimeUtils.eightHoursAgo()) { @@ -84,7 +86,7 @@ class LiveActivitiesEvent( createdAt: Long = TimeUtils.now(), onReady: (LiveActivitiesEvent) -> Unit, ) { - val tags = arrayOf(arrayOf("alt", ALT)) + val tags = arrayOf(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags, "", onReady) } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip54Wiki/WikiNoteEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip54Wiki/WikiNoteEvent.kt index 95db39abd..3103185ab 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip54Wiki/WikiNoteEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip54Wiki/WikiNoteEvent.kt @@ -27,6 +27,7 @@ import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag import com.vitorpamplona.quartz.nip01Core.tags.hashtags.hashtags import com.vitorpamplona.quartz.nip10Notes.BaseTextNoteEvent +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -76,7 +77,7 @@ class WikiNoteEvent( replyTos?.forEach { tags.add(arrayOf("e", it)) } mentions?.forEach { tags.add(arrayOf("p", it)) } title?.let { tags.add(arrayOf("title", it)) } - tags.add(arrayOf("alt", "Wiki Post: $title")) + tags.add(AltTagSerializer.toTagArray("Wiki Post: $title")) signer.sign(createdAt, KIND, tags.toTypedArray(), msg, onReady) } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip56Reports/ReportEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip56Reports/ReportEvent.kt index 4a8670efe..6123f73bc 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip56Reports/ReportEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip56Reports/ReportEvent.kt @@ -25,6 +25,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.AddressableEvent import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable data class ReportedKey( @@ -102,7 +103,7 @@ class ReportEvent( tags += listOf(arrayOf("a", reportedPost.address().toTag())) } - tags += listOf(arrayOf("alt", "Report for ${type.name}")) + tags += listOf(AltTagSerializer.toTagArray("Report for ${type.name}")) signer.sign(createdAt, KIND, tags, content, onReady) } @@ -117,7 +118,7 @@ class ReportEvent( val content = "" val reportAuthorTag = arrayOf("p", reportedUser, type.name.lowercase()) - val alt = arrayOf("alt", "Report for ${type.name}") + val alt = AltTagSerializer.toTagArray("Report for ${type.name}") val tags: Array> = arrayOf(reportAuthorTag, alt) signer.sign(createdAt, KIND, tags, content, onReady) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/LnZapRequestEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/LnZapRequestEvent.kt index 64b5032ca..10d3d07d8 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/LnZapRequestEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/LnZapRequestEvent.kt @@ -30,6 +30,7 @@ import com.vitorpamplona.quartz.nip01Core.core.mapValues import com.vitorpamplona.quartz.nip01Core.hexToByteArray import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.pointerSizeInBytes @@ -114,7 +115,7 @@ class LnZapRequestEvent( arrayOf("e", originalNote.id), arrayOf("p", toUserPubHex ?: originalNote.pubKey), arrayOf("relays") + relays, - arrayOf("alt", ALT), + AltTagSerializer.toTagArray(ALT), ) if (originalNote is AddressableEvent) { tags = tags + listOf(arrayOf("a", originalNote.address().toTag())) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/splits/BaseZapSplitSetup.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/splits/BaseZapSplitSetup.kt new file mode 100644 index 000000000..55a4e1d81 --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/splits/BaseZapSplitSetup.kt @@ -0,0 +1,27 @@ +/** + * Copyright (c) 2024 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.quartz.nip57Zaps.splits + +sealed interface BaseZapSplitSetup { + val weight: Double + + fun mainId(): String +} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/EventExt.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/splits/EventExt.kt similarity index 67% rename from quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/EventExt.kt rename to quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/splits/EventExt.kt index b0fcd5f14..8aa6bbece 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/EventExt.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/splits/EventExt.kt @@ -18,30 +18,12 @@ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -package com.vitorpamplona.quartz.nip57Zaps +package com.vitorpamplona.quartz.nip57Zaps.splits import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.core.firstTagValueAsLong import com.vitorpamplona.quartz.nip01Core.core.hasTagWithContent import com.vitorpamplona.quartz.nip01Core.core.mapTagged fun Event.hasZapSplitSetup() = tags.hasTagWithContent("zap") -fun Event.zapSplitSetup(): List = - tags.mapTagged("zap") { - val isLnAddress = it[0].contains("@") || it[0].startsWith("LNURL", true) - val weight = if (isLnAddress) 1.0 else (it.getOrNull(3)?.toDoubleOrNull() ?: 0.0) - - if (weight > 0) { - ZapSplitSetup( - it[1], - it.getOrNull(2), - weight, - isLnAddress, - ) - } else { - null - } - } - -fun Event.zapraiserAmount() = tags.firstTagValueAsLong("zapraiser") +fun Event.zapSplitSetup(): List = tags.mapTagged("zap") { ZapSplitSetupParser.parse(it) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/ZapSplitSetup.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/splits/ZapSplitSetup.kt similarity index 83% rename from quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/ZapSplitSetup.kt rename to quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/splits/ZapSplitSetup.kt index cabb611a0..1455ebefc 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/ZapSplitSetup.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/splits/ZapSplitSetup.kt @@ -18,11 +18,14 @@ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -package com.vitorpamplona.quartz.nip57Zaps +package com.vitorpamplona.quartz.nip57Zaps.splits + +import com.vitorpamplona.quartz.nip01Core.HexKey data class ZapSplitSetup( - val lnAddressOrPubKeyHex: String, + val pubKeyHex: HexKey, val relay: String?, - val weight: Double, - val isLnAddress: Boolean, -) + override val weight: Double, +) : BaseZapSplitSetup { + override fun mainId() = pubKeyHex +} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/splits/ZapSplitSetupLnAddress.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/splits/ZapSplitSetupLnAddress.kt new file mode 100644 index 000000000..bcde9c356 --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/splits/ZapSplitSetupLnAddress.kt @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2024 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.quartz.nip57Zaps.splits + +/** + * This is an old version on how to do zap splits + */ +data class ZapSplitSetupLnAddress( + val lnAddress: String, + override val weight: Double, +) : BaseZapSplitSetup { + override fun mainId() = lnAddress +} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/splits/ZapSplitSetupParser.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/splits/ZapSplitSetupParser.kt new file mode 100644 index 000000000..292de0a4b --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/splits/ZapSplitSetupParser.kt @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2024 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.quartz.nip57Zaps.splits + +class ZapSplitSetupParser { + companion object { + @JvmStatic + fun parse(tags: Array): BaseZapSplitSetup? { + require(tags[0] == "zap") + + val isLnAddress = tags[1].contains("@") || tags[1].startsWith("LNURL", true) + val weight = if (isLnAddress) 1.0 else (tags.getOrNull(3)?.toDoubleOrNull() ?: 0.0) + + return if (weight > 0) { + if (isLnAddress) { + ZapSplitSetupLnAddress(tags[1], 1.0) + } else { + ZapSplitSetup( + tags[1], + tags.getOrNull(2), + weight, + ) + } + } else { + null + } + } + } +} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/splits/ZapSplitSetupSerializer.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/splits/ZapSplitSetupSerializer.kt new file mode 100644 index 000000000..b10e15917 --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/splits/ZapSplitSetupSerializer.kt @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2024 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.quartz.nip57Zaps.splits + +class ZapSplitSetupSerializer { + companion object { + @JvmStatic + fun toTagArray(zapSplit: BaseZapSplitSetup): Array = + when (zapSplit) { + is ZapSplitSetupLnAddress -> arrayOf("zap", zapSplit.lnAddress) + is ZapSplitSetup -> arrayOf("zap", zapSplit.pubKeyHex, zapSplit.relay ?: "", zapSplit.weight.toString()) + } + } +} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/zapraiser/EventExt.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/zapraiser/EventExt.kt new file mode 100644 index 000000000..12c5de261 --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/zapraiser/EventExt.kt @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2024 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.quartz.nip57Zaps.zapraiser + +import com.vitorpamplona.quartz.nip01Core.core.Event +import com.vitorpamplona.quartz.nip01Core.core.firstTagValueAsLong + +fun Event.zapraiserAmount() = tags.firstTagValueAsLong("zapraiser") diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/zapraiser/ZapRaiserSerializer.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/zapraiser/ZapRaiserSerializer.kt new file mode 100644 index 000000000..f41ba3c1e --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip57Zaps/zapraiser/ZapRaiserSerializer.kt @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2024 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.quartz.nip57Zaps.zapraiser + +class ZapRaiserSerializer { + companion object { + @JvmStatic + fun toTagArray(zapRaiserAmount: Long): Array = arrayOf("zapraiser", zapRaiserAmount.toString()) + } +} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip65RelayList/AdvertisedRelayListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip65RelayList/AdvertisedRelayListEvent.kt index 6a63d1fc8..7f7047747 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip65RelayList/AdvertisedRelayListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip65RelayList/AdvertisedRelayListEvent.kt @@ -26,6 +26,7 @@ import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerSync import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -127,7 +128,7 @@ class AdvertisedRelayListEvent( fun createTagArray(relays: List): Array> = relays .map(Companion::createRelayTag) - .plusElement(arrayOf("alt", ALT)) + .plusElement(AltTagSerializer.toTagArray(ALT)) .toTypedArray() fun create( diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip68Picture/PictureEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip68Picture/PictureEvent.kt index 707141b7c..48ca9113c 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip68Picture/PictureEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip68Picture/PictureEvent.kt @@ -33,7 +33,11 @@ import com.vitorpamplona.quartz.nip10Notes.content.buildUrlRefs import com.vitorpamplona.quartz.nip10Notes.content.findHashtags import com.vitorpamplona.quartz.nip10Notes.content.findURLs import com.vitorpamplona.quartz.nip22Comments.RootScope -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetupSerializer +import com.vitorpamplona.quartz.nip57Zaps.zapraiser.ZapRaiserSerializer import com.vitorpamplona.quartz.nip92IMeta.Nip92MediaAttachments.Companion.IMETA import com.vitorpamplona.quartz.nip94FileMetadata.Dimension import com.vitorpamplona.quartz.utils.TimeUtils @@ -159,7 +163,7 @@ class PictureEvent( createdAt: Long = TimeUtils.now(), onReady: (PictureEvent) -> Unit, ) { - val tags = mutableListOf(arrayOf("alt", ALT_DESCRIPTION)) + val tags = mutableListOf(AltTagSerializer.toTagArray(ALT_DESCRIPTION)) images.forEach { tags.add(it.toIMetaArray()) @@ -187,14 +191,13 @@ class PictureEvent( tags.addAll(buildHashtagTags(findHashtags(msg))) tags.addAll(buildUrlRefs(findURLs(msg))) } + zapReceiver?.forEach { tags.add(ZapSplitSetupSerializer.toTagArray(it)) } + zapRaiserAmount?.let { tags.add(ZapRaiserSerializer.toTagArray(it)) } - zapReceiver?.forEach { - tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString())) - } if (markAsSensitive) { - tags.add(arrayOf("content-warning", "")) + tags.add(ContentWarningSerializer.toTagArray()) } - zapRaiserAmount?.let { tags.add(arrayOf("zapraiser", "$it")) } + geohash?.let { tags.addAll(geohashMipMap(it)) } signer.sign(createdAt, KIND, tags.toTypedArray(), msg ?: "", onReady) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip70ProtectedEvts/EventExt.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip70ProtectedEvts/EventExt.kt new file mode 100644 index 000000000..11ceb0b5a --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip70ProtectedEvts/EventExt.kt @@ -0,0 +1,27 @@ +/** + * Copyright (c) 2024 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.quartz.nip70ProtectedEvts + +import com.vitorpamplona.quartz.nip01Core.core.Event + +const val PROTECTED_TAG = "-" + +fun Event.isProtected() = tags.any { (it.size > 0 && it[0] == PROTECTED_TAG) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip70ProtectedEvts/ProtectedTagSerializer.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip70ProtectedEvts/ProtectedTagSerializer.kt new file mode 100644 index 000000000..4245aefd7 --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip70ProtectedEvts/ProtectedTagSerializer.kt @@ -0,0 +1,27 @@ +/** + * Copyright (c) 2024 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.quartz.nip70ProtectedEvts + +class ProtectedTagSerializer { + companion object { + fun toTagArray(reason: String = "") = arrayOf("-", reason) + } +} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip71Video/VideoEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip71Video/VideoEvent.kt index 06c2ea41d..0aea14adb 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip71Video/VideoEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip71Video/VideoEvent.kt @@ -25,6 +25,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip22Comments.RootScope +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer import com.vitorpamplona.quartz.nip92IMeta.Nip92MediaAttachments.Companion.IMETA import com.vitorpamplona.quartz.nip94FileMetadata.Dimension import com.vitorpamplona.quartz.nip94FileMetadata.FileHeaderEvent @@ -150,7 +151,7 @@ abstract class VideoEvent( tags.add(arrayOf("d", dTag)) tags.add(arrayOf(ALT, altDescription)) if (sensitiveContent == true) { - tags.add(arrayOf("content-warning", "")) + tags.add(ContentWarningSerializer.toTagArray()) } duration?.let { tags.add(arrayOf(DURATION, "duration")) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip72ModCommunities/CommunityDefinitionEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip72ModCommunities/CommunityDefinitionEvent.kt index 14eef33e0..a208d89c5 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip72ModCommunities/CommunityDefinitionEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip72ModCommunities/CommunityDefinitionEvent.kt @@ -25,6 +25,7 @@ import com.vitorpamplona.quartz.experimental.audio.Participant import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -54,7 +55,7 @@ class CommunityDefinitionEvent( onReady: (CommunityDefinitionEvent) -> Unit, ) { val tags = mutableListOf>() - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) signer.sign(createdAt, KIND, tags.toTypedArray(), "", onReady) } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip72ModCommunities/CommunityListEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip72ModCommunities/CommunityListEvent.kt index 3254779c2..29d73ae37 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip72ModCommunities/CommunityListEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip72ModCommunities/CommunityListEvent.kt @@ -25,6 +25,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag import com.vitorpamplona.quartz.nip19Bech32.parseAtag +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.nip51Lists.GeneralListEvent import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.pointerSizeInBytes @@ -269,7 +270,7 @@ class CommunityListEvent( if (tags.any { it.size > 1 && it[0] == "alt" }) { tags } else { - tags + arrayOf("alt", ALT) + tags + AltTagSerializer.toTagArray(ALT) } signer.sign(createdAt, KIND, newTags, content, onReady) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip72ModCommunities/CommunityPostApprovalEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip72ModCommunities/CommunityPostApprovalEvent.kt index a120360ee..80e4dc3a4 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip72ModCommunities/CommunityPostApprovalEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip72ModCommunities/CommunityPostApprovalEvent.kt @@ -27,6 +27,7 @@ import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag import com.vitorpamplona.quartz.nip19Bech32.parse +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -89,7 +90,7 @@ class CommunityPostApprovalEvent( val replyToPost = arrayOf("e", approvedPost.id) val replyToAuthor = arrayOf("p", approvedPost.pubKey) val innerKind = arrayOf("k", "${approvedPost.kind}") - val alt = arrayOf("alt", ALT) + val alt = AltTagSerializer.toTagArray(ALT) val tags: Array> = arrayOf(communities, replyToPost, replyToAuthor, innerKind, alt) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip75ZapGoals/GoalEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip75ZapGoals/GoalEvent.kt index f12a5f60b..49231c6ff 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip75ZapGoals/GoalEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip75ZapGoals/GoalEvent.kt @@ -26,6 +26,7 @@ import com.vitorpamplona.quartz.nip01Core.core.AddressableEvent import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -63,7 +64,7 @@ class GoalEvent( mutableListOf( arrayOf(AMOUNT, amount.toString()), arrayOf("relays") + relays, - arrayOf("alt", ALT), + AltTagSerializer.toTagArray(ALT), ) if (linkedEvent is AddressableEvent) { diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip78AppData/AppSpecificDataEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip78AppData/AppSpecificDataEvent.kt index 1f5aebe87..2b2f40cb9 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip78AppData/AppSpecificDataEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip78AppData/AppSpecificDataEvent.kt @@ -24,6 +24,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils class AppSpecificDataEvent( @@ -60,7 +61,7 @@ class AppSpecificDataEvent( val newTags = if (withD.none { it.size > 0 && it[0] == "alt" }) { - withD + arrayOf("alt", ALT) + withD + AltTagSerializer.toTagArray(ALT) } else { withD } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip84Highlights/HighlightEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip84Highlights/HighlightEvent.kt index e7832d1a8..87c4aaafa 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip84Highlights/HighlightEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip84Highlights/HighlightEvent.kt @@ -29,6 +29,7 @@ import com.vitorpamplona.quartz.nip01Core.tags.addressables.firstTaggedAddress import com.vitorpamplona.quartz.nip01Core.tags.events.firstTaggedEvent import com.vitorpamplona.quartz.nip01Core.tags.people.firstTaggedUser import com.vitorpamplona.quartz.nip10Notes.BaseTextNoteEvent +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -62,7 +63,7 @@ class HighlightEvent( createdAt: Long = TimeUtils.now(), onReady: (HighlightEvent) -> Unit, ) { - signer.sign(createdAt, KIND, arrayOf(arrayOf("alt", ALT)), msg, onReady) + signer.sign(createdAt, KIND, arrayOf(AltTagSerializer.toTagArray(ALT)), msg, onReady) } } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip89AppHandlers/AppDefinitionEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip89AppHandlers/AppDefinitionEvent.kt index 7e33c076c..e27e09ca9 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip89AppHandlers/AppDefinitionEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip89AppHandlers/AppDefinitionEvent.kt @@ -28,6 +28,7 @@ import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.jackson.EventMapper import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip21UriScheme.toNostrUri +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils import java.io.ByteArrayInputStream @@ -85,7 +86,7 @@ class AppDefinitionEvent( ) { val tags = arrayOf( - arrayOf("alt", "App definition event for ${details.name}"), + AltTagSerializer.toTagArray("App definition event for ${details.name}"), ) signer.sign(createdAt, KIND, tags, "", onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip89AppHandlers/AppRecommendationEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip89AppHandlers/AppRecommendationEvent.kt index 521655685..9cc157e28 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip89AppHandlers/AppRecommendationEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip89AppHandlers/AppRecommendationEvent.kt @@ -26,6 +26,7 @@ import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag import com.vitorpamplona.quartz.nip19Bech32.parse +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -50,7 +51,7 @@ class AppRecommendationEvent( ) { val tags = arrayOf( - arrayOf("alt", ALT), + AltTagSerializer.toTagArray(ALT), ) signer.sign(createdAt, KIND, tags, "", onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90ContentDiscoveryRequestEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90ContentDiscoveryRequestEvent.kt index 95b75a3a7..da39dc3a2 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90ContentDiscoveryRequestEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90ContentDiscoveryRequestEvent.kt @@ -25,6 +25,7 @@ import androidx.compose.runtime.Stable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Stable @@ -52,7 +53,7 @@ class NIP90ContentDiscoveryRequestEvent( val content = "" val tags = mutableListOf>() tags.add(arrayOf("p", dvmPublicKey)) - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) tags.add(arrayOf("relays") + relays.toTypedArray()) tags.add(arrayOf("param", "max_results", "200")) tags.add(arrayOf("param", "user", forUser)) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90ContentDiscoveryResponseEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90ContentDiscoveryResponseEvent.kt index 7e44fa3ed..790de2176 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90ContentDiscoveryResponseEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90ContentDiscoveryResponseEvent.kt @@ -27,6 +27,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.jackson.EventMapper import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.nip89AppHandlers.AppRecommendationEvent import com.vitorpamplona.quartz.utils.TimeUtils import com.vitorpamplona.quartz.utils.bytesUsedInMemory @@ -83,7 +84,7 @@ class NIP90ContentDiscoveryResponseEvent( ) { val tags = arrayOf( - arrayOf("alt", ALT), + AltTagSerializer.toTagArray(ALT), ) signer.sign(createdAt, KIND, tags, "", onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90StatusEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90StatusEvent.kt index f21ac8c6b..a01893037 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90StatusEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90StatusEvent.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.nip89AppHandlers.AppRecommendationEvent import com.vitorpamplona.quartz.utils.TimeUtils @@ -84,7 +85,7 @@ class NIP90StatusEvent( ) { val tags = arrayOf( - arrayOf("alt", ALT), + AltTagSerializer.toTagArray(ALT), ) signer.sign(createdAt, KIND, tags, "", onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90UserDiscoveryRequestEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90UserDiscoveryRequestEvent.kt index ec721fa7a..7a16cf522 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90UserDiscoveryRequestEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90UserDiscoveryRequestEvent.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.nip89AppHandlers.AppRecommendationEvent import com.vitorpamplona.quartz.utils.TimeUtils @@ -47,7 +48,7 @@ class NIP90UserDiscoveryRequestEvent( ) { val tags = arrayOf( - arrayOf("alt", ALT), + AltTagSerializer.toTagArray(ALT), ) signer.sign(createdAt, KIND, tags, "", onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90UserDiscoveryResponseEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90UserDiscoveryResponseEvent.kt index 313793af1..1239dd41d 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90UserDiscoveryResponseEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip90Dvms/NIP90UserDiscoveryResponseEvent.kt @@ -24,6 +24,7 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.nip89AppHandlers.AppRecommendationEvent import com.vitorpamplona.quartz.utils.TimeUtils @@ -47,7 +48,7 @@ class NIP90UserDiscoveryResponseEvent( ) { val tags = arrayOf( - arrayOf("alt", ALT), + AltTagSerializer.toTagArray(ALT), ) signer.sign(createdAt, KIND, tags, "", onReady) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip92IMeta/IMetaTagBuilder.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip92IMeta/IMetaTagBuilder.kt index 6ce51c0bf..ac81bfeef 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip92IMeta/IMetaTagBuilder.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip92IMeta/IMetaTagBuilder.kt @@ -21,6 +21,7 @@ package com.vitorpamplona.quartz.nip92IMeta import com.vitorpamplona.quartz.nip01Core.HexKey +import com.vitorpamplona.quartz.nip36SensitiveContent.CONTENT_WARNING import com.vitorpamplona.quartz.nip94FileMetadata.Dimension import com.vitorpamplona.quartz.nip94FileMetadata.FileHeaderEvent.Companion.ALT import com.vitorpamplona.quartz.nip94FileMetadata.FileHeaderEvent.Companion.BLUR_HASH @@ -63,7 +64,7 @@ class IMetaTagBuilder( fun torrent(uri: String) = add(TORRENT_INFOHASH, uri) - fun sensitiveContent(reason: String) = add("content-warning", reason) + fun sensitiveContent(reason: String) = add(CONTENT_WARNING, reason) fun build() = IMetaTag(url, properties) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip94FileMetadata/FileHeaderEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip94FileMetadata/FileHeaderEvent.kt index 65625a125..7c35038ef 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip94FileMetadata/FileHeaderEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip94FileMetadata/FileHeaderEvent.kt @@ -24,6 +24,8 @@ import androidx.compose.runtime.Immutable import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -93,7 +95,7 @@ class FileHeaderEvent( arrayOf(URL, url), magnetUri?.let { arrayOf(MAGNET_URI, it) }, mimeType?.let { arrayOf(MIME_TYPE, it) }, - alt?.ifBlank { null }?.let { arrayOf(ALT, it) } ?: arrayOf("alt", ALT_DESCRIPTION), + alt?.ifBlank { null }?.let { arrayOf(ALT, it) } ?: AltTagSerializer.toTagArray(ALT_DESCRIPTION), hash?.let { arrayOf(HASH, it) }, size?.let { arrayOf(FILE_SIZE, it) }, dimensions?.let { arrayOf(DIMENSION, it.toString()) }, @@ -103,7 +105,7 @@ class FileHeaderEvent( torrentInfoHash?.let { arrayOf(TORRENT_INFOHASH, it) }, sensitiveContent?.let { if (it) { - arrayOf("content-warning", "") + ContentWarningSerializer.toTagArray() } else { null } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip96FileStorage/FileServersEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip96FileStorage/FileServersEvent.kt index 94fe7b183..0c36a8783 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip96FileStorage/FileServersEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip96FileStorage/FileServersEvent.kt @@ -25,6 +25,7 @@ import com.vitorpamplona.quartz.nip01Core.HexKey import com.vitorpamplona.quartz.nip01Core.core.BaseAddressableEvent import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.tags.addressables.ATag +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer import com.vitorpamplona.quartz.utils.TimeUtils @Immutable @@ -60,7 +61,7 @@ class FileServersEvent( servers .map { arrayOf("server", it) - }.plusElement(arrayOf("alt", ALT)) + }.plusElement(AltTagSerializer.toTagArray(ALT)) .toTypedArray() fun updateRelayList( diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip99Classifieds/ClassifiedsEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip99Classifieds/ClassifiedsEvent.kt index 62bcc4ce4..41240d58c 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip99Classifieds/ClassifiedsEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip99Classifieds/ClassifiedsEvent.kt @@ -30,7 +30,11 @@ import com.vitorpamplona.quartz.nip01Core.tags.hashtags.buildHashtagTags import com.vitorpamplona.quartz.nip10Notes.content.findHashtags import com.vitorpamplona.quartz.nip10Notes.content.findURLs import com.vitorpamplona.quartz.nip30CustomEmoji.EmojiUrl -import com.vitorpamplona.quartz.nip57Zaps.ZapSplitSetup +import com.vitorpamplona.quartz.nip31Alts.AltTagSerializer +import com.vitorpamplona.quartz.nip36SensitiveContent.ContentWarningSerializer +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetup +import com.vitorpamplona.quartz.nip57Zaps.splits.ZapSplitSetupSerializer +import com.vitorpamplona.quartz.nip57Zaps.zapraiser.ZapRaiserSerializer import com.vitorpamplona.quartz.nip92IMeta.IMetaTag import com.vitorpamplona.quartz.nip92IMeta.Nip92MediaAttachments import com.vitorpamplona.quartz.utils.TimeUtils @@ -171,9 +175,9 @@ class ClassifiedsEvent( publishedAt?.let { tags.add(arrayOf("publishedAt", it.toString())) } condition?.let { tags.add(arrayOf("condition", it.value)) } tags.addAll(buildHashtagTags(findHashtags(message))) - zapReceiver?.forEach { - tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString())) - } + zapReceiver?.forEach { tags.add(ZapSplitSetupSerializer.toTagArray(it)) } + zapRaiserAmount?.let { tags.add(ZapRaiserSerializer.toTagArray(it)) } + findURLs(message).forEach { val removedParamsFromUrl = if (it.contains("?")) { @@ -190,13 +194,12 @@ class ClassifiedsEvent( tags.add(arrayOf("r", it)) } if (markAsSensitive) { - tags.add(arrayOf("content-warning", "")) + tags.add(ContentWarningSerializer.toTagArray()) } - zapRaiserAmount?.let { tags.add(arrayOf("zapraiser", "$it")) } geohash?.let { tags.addAll(geohashMipMap(it)) } imetas?.forEach { tags.add(Nip92MediaAttachments.createTag(it)) } emojis?.forEach { tags.add(it.toTagArray()) } - tags.add(arrayOf("alt", ALT)) + tags.add(AltTagSerializer.toTagArray(ALT)) if (isDraft) { signer.assembleRumor(createdAt, KIND, tags.toTypedArray(), message, onReady)