diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip30CustomEmoji/EmojiUrlTag.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip30CustomEmoji/EmojiUrlTag.kt index 4919ec960..4795f770e 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip30CustomEmoji/EmojiUrlTag.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip30CustomEmoji/EmojiUrlTag.kt @@ -21,12 +21,13 @@ package com.vitorpamplona.quartz.nip30CustomEmoji import androidx.compose.runtime.Immutable +import com.vitorpamplona.quartz.nip01Core.core.Address @Immutable data class EmojiUrlTag( val code: String, val url: String, - val emojiSet: String? = null, + val emojiSet: Address? = null, ) { fun encode(): String = ":$code:$url" @@ -34,7 +35,7 @@ data class EmojiUrlTag( fun toTagArray() = if (emojiSet != null) { - arrayOf(TAG_NAME, code, url, emojiSet) + arrayOf(TAG_NAME, code, url, emojiSet.toValue()) } else { arrayOf(TAG_NAME, code, url) } @@ -60,7 +61,7 @@ data class EmojiUrlTag( fun parse(tag: Array): EmojiUrlTag? = if (tag.size > 2 && tag[0] == TAG_NAME) { - EmojiUrlTag(tag[1], tag[2], tag.getOrNull(3)) + EmojiUrlTag(tag[1], tag[2], tag.getOrNull(3)?.let(Address::parse)) } else { null } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip30CustomEmoji/TagArrayBuilderExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip30CustomEmoji/TagArrayBuilderExt.kt index eedccf90c..152370c16 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip30CustomEmoji/TagArrayBuilderExt.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip30CustomEmoji/TagArrayBuilderExt.kt @@ -20,6 +20,7 @@ */ package com.vitorpamplona.quartz.nip30CustomEmoji +import com.vitorpamplona.quartz.nip01Core.core.Address import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder @@ -28,7 +29,7 @@ fun TagArrayBuilder.emoji(tag: EmojiUrlTag) = add(tag.toTagArray( fun TagArrayBuilder.emoji( code: String, url: String, - emojiSet: String? = null, + emojiSet: Address? = null, ) = add(EmojiUrlTag(code, url, emojiSet).toTagArray()) fun TagArrayBuilder.emojis(tags: List) = addAll(tags.map { it.toTagArray() }) diff --git a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip30CustomEmoji/Nip30Test.kt b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip30CustomEmoji/Nip30Test.kt index b76fc651a..d8fd8bc5f 100644 --- a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip30CustomEmoji/Nip30Test.kt +++ b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip30CustomEmoji/Nip30Test.kt @@ -20,6 +20,7 @@ */ package com.vitorpamplona.quartz.nip30CustomEmoji +import com.vitorpamplona.quartz.nip01Core.core.Address import kotlin.test.Test import kotlin.test.assertContentEquals import kotlin.test.assertEquals @@ -28,6 +29,10 @@ import kotlin.test.assertNull import kotlin.test.assertTrue class Nip30Test { + companion object { + private const val TEST_PUBKEY = "0000000000000000000000000000000000000000000000000000000000000abc" + } + @Test() fun parseEmoji() { val tags = mapOf(":soapbox:" to "http://soapbox") @@ -177,17 +182,25 @@ class Nip30Test { @Test fun emojiTagWithEmojiSetRoundtrip() { - val setAddress = "30030:abc123:emojis-fall" + val setAddress = Address(30030, TEST_PUBKEY, "emojis-fall") val tag = EmojiUrlTag("soapbox", "http://soapbox", setAddress) - assertContentEquals(arrayOf("emoji", "soapbox", "http://soapbox", setAddress), tag.toTagArray()) + assertContentEquals(arrayOf("emoji", "soapbox", "http://soapbox", setAddress.toValue()), tag.toTagArray()) assertEquals(tag, EmojiUrlTag.parse(tag.toTagArray())) } @Test fun parseIgnoresTrailingFields() { - val tag = arrayOf("emoji", "soapbox", "http://soapbox", "30030:abc123:pack", "extra") + val setAddress = Address(30030, TEST_PUBKEY, "pack") + val tag = arrayOf("emoji", "soapbox", "http://soapbox", setAddress.toValue(), "extra") val parsed = EmojiUrlTag.parse(tag) - assertEquals(EmojiUrlTag("soapbox", "http://soapbox", "30030:abc123:pack"), parsed) + assertEquals(EmojiUrlTag("soapbox", "http://soapbox", setAddress), parsed) + } + + @Test + fun parseMalformedEmojiSetAddressYieldsNull() { + val tag = arrayOf("emoji", "soapbox", "http://soapbox", "not-an-address") + val parsed = EmojiUrlTag.parse(tag) + assertEquals(EmojiUrlTag("soapbox", "http://soapbox", null), parsed) } @Test