Adds support for Custom Reaction selection on new posts and direct GIF url usage.

This commit is contained in:
Vitor Pamplona
2025-01-03 20:29:31 -05:00
parent c9a6b63f67
commit aa44560714
23 changed files with 443 additions and 17 deletions
@@ -50,6 +50,24 @@ class Nip30CustomEmoji {
fun createEmojiMap(tags: ImmutableListOfLists<String>): Map<String, String> = tags.lists.filter { it.size > 2 && it[0] == "emoji" }.associate { ":${it[1]}:" to it[2] }
fun findAllEmojis(input: String): List<String> {
val matcher = customEmojiPattern.matcher(input)
val emojiNamesInOrder = mutableListOf<String>()
while (matcher.find()) {
emojiNamesInOrder.add(matcher.group())
}
return emojiNamesInOrder
}
fun findAllEmojiCodes(input: String): List<String> {
val matcher = customEmojiPattern.matcher(input)
val emojiNamesInOrder = mutableListOf<String>()
while (matcher.find()) {
matcher.group(1)?.let { emojiNamesInOrder.add(it) }
}
return emojiNamesInOrder
}
fun assembleAnnotatedList(
input: String,
allTags: ImmutableListOfLists<String>?,
@@ -65,12 +83,7 @@ class Nip30CustomEmoji {
input: String,
emojiPairs: Map<String, String>,
): ImmutableList<Renderable>? {
val matcher = customEmojiPattern.matcher(input)
val emojiNamesInOrder = mutableListOf<String>()
while (matcher.find()) {
emojiNamesInOrder.add(matcher.group())
}
val emojiNamesInOrder = findAllEmojis(input)
if (emojiNamesInOrder.isEmpty()) {
return null
}
@@ -62,6 +62,7 @@ class ChannelMessageEvent(
directMentions: Set<HexKey> = emptySet(),
geohash: String? = null,
imetas: List<IMetaTag>? = null,
emojis: List<EmojiUrl>? = null,
isDraft: Boolean,
onReady: (ChannelMessageEvent) -> Unit,
) {
@@ -88,6 +89,7 @@ class ChannelMessageEvent(
imetas?.forEach {
tags.add(Nip92MediaAttachments.createTag(it))
}
emojis?.forEach { tags.add(it.toTagArray()) }
tags.add(
arrayOf("alt", ALT),
)
@@ -84,6 +84,7 @@ class ChatMessageEvent(
signer: NostrSigner,
createdAt: Long = TimeUtils.now(),
imetas: List<IMetaTag>? = null,
emojis: List<EmojiUrl>? = null,
isDraft: Boolean,
onReady: (ChatMessageEvent) -> Unit,
) {
@@ -103,6 +104,7 @@ class ChatMessageEvent(
imetas?.forEach {
tags.add(Nip92MediaAttachments.createTag(it))
}
emojis?.forEach { tags.add(it.toTagArray()) }
// tags.add(arrayOf("alt", alt))
if (isDraft) {
@@ -115,6 +115,7 @@ class ClassifiedsEvent(
zapRaiserAmount: Long?,
geohash: String? = null,
imetas: List<IMetaTag>? = null,
emojis: List<EmojiUrl>? = null,
signer: NostrSigner,
createdAt: Long = TimeUtils.now(),
isDraft: Boolean,
@@ -190,9 +191,8 @@ class ClassifiedsEvent(
}
zapRaiserAmount?.let { tags.add(arrayOf("zapraiser", "$it")) }
geohash?.let { tags.addAll(geohashMipMap(it)) }
imetas?.forEach {
tags.add(Nip92MediaAttachments.createTag(it))
}
imetas?.forEach { tags.add(Nip92MediaAttachments.createTag(it)) }
emojis?.forEach { tags.add(it.toTagArray()) }
tags.add(arrayOf("alt", ALT))
if (isDraft) {
@@ -98,6 +98,7 @@ class CommentEvent(
addressesMentioned: Set<ATag> = emptySet(),
eventsMentioned: Set<ETag> = emptySet(),
imetas: List<IMetaTag>? = null,
emojis: List<EmojiUrl>? = null,
geohash: String? = null,
zapReceiver: List<ZapSplitSetup>? = null,
markAsSensitive: Boolean = false,
@@ -120,7 +121,7 @@ class CommentEvent(
tags.add(removeTrailingNullsAndEmptyOthers("e", replyingTo.event.id, replyingTo.relay, replyingTo.event.pubKey))
tags.add(arrayOf("k", "${replyingTo.event.kind}"))
create(msg, tags, usersMentioned, addressesMentioned, eventsMentioned, imetas, geohash, zapReceiver, markAsSensitive, zapRaiserAmount, isDraft, signer, createdAt, onReady)
create(msg, tags, usersMentioned, addressesMentioned, eventsMentioned, imetas, emojis, geohash, zapReceiver, markAsSensitive, zapRaiserAmount, isDraft, signer, createdAt, onReady)
}
fun replyComment(
@@ -130,6 +131,7 @@ class CommentEvent(
addressesMentioned: Set<ATag> = emptySet(),
eventsMentioned: Set<ETag> = emptySet(),
imetas: List<IMetaTag>? = null,
emojis: List<EmojiUrl>? = null,
geohash: String? = null,
zapReceiver: List<ZapSplitSetup>? = null,
markAsSensitive: Boolean = false,
@@ -147,7 +149,7 @@ class CommentEvent(
tags.add(removeTrailingNullsAndEmptyOthers("e", replyingTo.event.id, replyingTo.relay, replyingTo.event.pubKey))
tags.add(arrayOf("k", "${replyingTo.event.kind}"))
create(msg, tags, usersMentioned, addressesMentioned, eventsMentioned, imetas, geohash, zapReceiver, markAsSensitive, zapRaiserAmount, isDraft, signer, createdAt, onReady)
create(msg, tags, usersMentioned, addressesMentioned, eventsMentioned, imetas, emojis, geohash, zapReceiver, markAsSensitive, zapRaiserAmount, isDraft, signer, createdAt, onReady)
}
fun createGeoComment(
@@ -157,6 +159,7 @@ class CommentEvent(
addressesMentioned: Set<ATag> = emptySet(),
eventsMentioned: Set<ETag> = emptySet(),
imetas: List<IMetaTag>? = null,
emojis: List<EmojiUrl>? = null,
zapReceiver: List<ZapSplitSetup>? = null,
markAsSensitive: Boolean = false,
zapRaiserAmount: Long? = null,
@@ -169,7 +172,7 @@ class CommentEvent(
geohash?.let { tags.addAll(rootGeohashMipMap(it)) }
tags.add(arrayOf("K", "geo"))
create(msg, tags, usersMentioned, addressesMentioned, eventsMentioned, imetas, null, zapReceiver, markAsSensitive, zapRaiserAmount, isDraft, signer, createdAt, onReady)
create(msg, tags, usersMentioned, addressesMentioned, eventsMentioned, imetas, emojis, null, zapReceiver, markAsSensitive, zapRaiserAmount, isDraft, signer, createdAt, onReady)
}
private fun create(
@@ -179,6 +182,7 @@ class CommentEvent(
addressesMentioned: Set<ATag> = emptySet(),
eventsMentioned: Set<ETag> = emptySet(),
imetas: List<IMetaTag>? = null,
emojis: List<EmojiUrl>? = null,
geohash: String? = null,
zapReceiver: List<ZapSplitSetup>? = null,
markAsSensitive: Boolean = false,
@@ -202,6 +206,8 @@ class CommentEvent(
findURLs(msg).forEach { tags.add(arrayOf("r", it)) }
emojis?.forEach { tags.add(it.toTagArray()) }
zapReceiver?.forEach {
tags.add(arrayOf("zap", it.lnAddressOrPubKeyHex, it.relay ?: "", it.weight.toString()))
}
@@ -62,6 +62,8 @@ data class EmojiUrl(
) {
fun encode(): String = ":$code:$url"
fun toTagArray() = arrayOf("emoji", code, url)
companion object {
fun decode(encodedEmojiSetup: String): EmojiUrl? {
val emojiParts = encodedEmojiSetup.split(":", limit = 3)
@@ -71,5 +73,12 @@ data class EmojiUrl(
null
}
}
fun parse(tag: Array<String>): EmojiUrl? =
if (tag.size > 2 && tag[0] == "emoji") {
EmojiUrl(tag[1], tag[2])
} else {
null
}
}
}
@@ -42,6 +42,10 @@ class EmojiPackSelectionEvent(
const val FIXED_D_TAG = ""
const val ALT = "Emoji selection"
fun createAddressATag(pubKey: HexKey): ATag = ATag(KIND, pubKey, AdvertisedRelayListEvent.FIXED_D_TAG, null)
fun createAddressTag(pubKey: HexKey): String = ATag.assembleATag(KIND, pubKey, AdvertisedRelayListEvent.FIXED_D_TAG)
fun create(
listOfEmojiPacks: List<ATag>?,
signer: NostrSigner,
@@ -164,7 +164,7 @@ open class Event(
ATag.parse(aTagValue, relay)
}
override fun taggedEmojis() = tags.filter { it.size > 2 && it[0] == "emoji" }.map { EmojiUrl(it[1], it[2]) }
override fun taggedEmojis() = tags.filter { it.size > 2 && it[0] == "emoji" }.mapNotNull { EmojiUrl.parse(it) }
override fun isSensitive() =
tags.any {
@@ -92,6 +92,7 @@ class GitReplyEvent(
directMentions: Set<HexKey> = emptySet(),
geohash: String? = null,
imetas: List<IMetaTag>? = null,
emojis: List<EmojiUrl>? = null,
forkedFrom: Event? = null,
signer: NostrSigner,
createdAt: Long = TimeUtils.now(),
@@ -152,6 +153,7 @@ class GitReplyEvent(
imetas?.forEach {
tags.add(Nip92MediaAttachments.createTag(it))
}
emojis?.forEach { tags.add(it.toTagArray()) }
tags.add(arrayOf("alt", "a git issue reply"))
if (isDraft) {
@@ -53,6 +53,7 @@ open class InteractiveStoryBaseEvent(
zapRaiserAmount: Long? = null,
geohash: String? = null,
imetas: List<IMetaTag>? = null,
emojis: List<EmojiUrl>? = null,
): Array<Array<String>> {
val tags = mutableListOf<Array<String>>()
findHashtags(content).forEach {
@@ -75,6 +76,7 @@ open class InteractiveStoryBaseEvent(
imetas?.forEach {
tags.add(Nip92MediaAttachments.createTag(it))
}
emojis?.forEach { tags.add(it.toTagArray()) }
return tags.toTypedArray()
}
@@ -75,6 +75,7 @@ class LiveActivitiesChatMessageEvent(
zapRaiserAmount: Long?,
geohash: String? = null,
imetas: List<IMetaTag>? = null,
emojis: List<EmojiUrl>? = null,
isDraft: Boolean,
onReady: (LiveActivitiesChatMessageEvent) -> Unit,
) {
@@ -96,6 +97,7 @@ class LiveActivitiesChatMessageEvent(
imetas?.forEach {
tags.add(Nip92MediaAttachments.createTag(it))
}
emojis?.forEach { tags.add(it.toTagArray()) }
tags.add(arrayOf("alt", ALT))
if (isDraft) {
@@ -82,6 +82,7 @@ class NIP17Factory {
zapRaiserAmount: Long? = null,
geohash: String? = null,
imetas: List<IMetaTag>? = null,
emojis: List<EmojiUrl>? = null,
draftTag: String? = null,
onReady: (Result) -> Unit,
) {
@@ -100,6 +101,7 @@ class NIP17Factory {
geohash = geohash,
isDraft = draftTag != null,
imetas = imetas,
emojis = emojis,
) { senderMessage ->
if (draftTag != null) {
onReady(
@@ -81,6 +81,7 @@ class PollNoteEvent(
zapRaiserAmount: Long?,
geohash: String? = null,
imetas: List<IMetaTag>? = null,
emojis: List<EmojiUrl>? = null,
isDraft: Boolean,
onReady: (PollNoteEvent) -> Unit,
) {
@@ -108,6 +109,7 @@ class PollNoteEvent(
imetas?.forEach {
tags.add(Nip92MediaAttachments.createTag(it))
}
emojis?.forEach { tags.add(it.toTagArray()) }
tags.add(arrayOf("alt", ALT))
if (isDraft) {
@@ -58,6 +58,7 @@ class TextNoteEvent(
directMentions: Set<HexKey> = emptySet(),
geohash: String? = null,
imetas: List<IMetaTag>? = null,
emojis: List<EmojiUrl>? = null,
forkedFrom: Event? = null,
signer: NostrSigner,
createdAt: Long = TimeUtils.now(),
@@ -123,9 +124,8 @@ class TextNoteEvent(
}
zapRaiserAmount?.let { tags.add(arrayOf("zapraiser", "$it")) }
geohash?.let { tags.addAll(geohashMipMap(it)) }
imetas?.forEach {
tags.add(Nip92MediaAttachments.createTag(it))
}
imetas?.forEach { tags.add(Nip92MediaAttachments.createTag(it)) }
emojis?.forEach { tags.add(it.toTagArray()) }
if (isDraft) {
signer.assembleRumor(createdAt, KIND, tags.toTypedArray(), msg, onReady)
@@ -63,6 +63,7 @@ class TorrentCommentEvent(
zapRaiserAmount: Long?,
geohash: String? = null,
imetas: List<IMetaTag>? = null,
emojis: List<EmojiUrl>? = null,
forkedFrom: Event? = null,
isDraft: Boolean,
onReady: (TorrentCommentEvent) -> Unit,
@@ -126,6 +127,7 @@ class TorrentCommentEvent(
imetas?.forEach {
tags.add(Nip92MediaAttachments.createTag(it))
}
emojis?.forEach { tags.add(it.toTagArray()) }
tags.add(arrayOf("alt", ALT))
if (isDraft) {