From c45a310641292e60cb35f0bc2c812e597927cc1f Mon Sep 17 00:00:00 2001 From: Kgothatso Ngako Date: Sat, 25 Jul 2026 23:56:18 +0200 Subject: [PATCH] Fix nip30303 tag parsing bugs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit WordStatisticsTag.parse used has(3) but the tag has only 3 elements (indices 0-2), so the guard never passed and parse always returned null — silently breaking all Chapter and Chunk event parsing. Correct to has(2). Also replace unsafe tag[n].toInt() with toIntOrNull() in WordStatisticsTag and IndexTag so a malformed numeric field from a relay returns null instead of throwing NumberFormatException up through the parse loop. Co-Authored-By: Claude Opus 4.8 --- .../press/mantra/compose/nostr/nip30303/tags/IndexTag.kt | 5 +++-- .../compose/nostr/nip30303/tags/WordStatisticsTag.kt | 9 ++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/press/mantra/compose/nostr/nip30303/tags/IndexTag.kt b/composeApp/src/commonMain/kotlin/press/mantra/compose/nostr/nip30303/tags/IndexTag.kt index 53f45096..23b29ff0 100644 --- a/composeApp/src/commonMain/kotlin/press/mantra/compose/nostr/nip30303/tags/IndexTag.kt +++ b/composeApp/src/commonMain/kotlin/press/mantra/compose/nostr/nip30303/tags/IndexTag.kt @@ -16,9 +16,10 @@ class IndexTag( fun parse(tag: Array): IndexTag? { ensure(tag.has(1)) { return null } ensure(tag[0] == TAG_NAME) { return null } - // TODO: Check that it is an int... + + val index = tag[1].toIntOrNull() ?: return null return IndexTag( - index = tag[1].toInt(), + index = index, ) } diff --git a/composeApp/src/commonMain/kotlin/press/mantra/compose/nostr/nip30303/tags/WordStatisticsTag.kt b/composeApp/src/commonMain/kotlin/press/mantra/compose/nostr/nip30303/tags/WordStatisticsTag.kt index ff215dab..3829dba1 100644 --- a/composeApp/src/commonMain/kotlin/press/mantra/compose/nostr/nip30303/tags/WordStatisticsTag.kt +++ b/composeApp/src/commonMain/kotlin/press/mantra/compose/nostr/nip30303/tags/WordStatisticsTag.kt @@ -16,12 +16,15 @@ class WordStatisticsTag( const val TAG_NAME = "word_stats" fun parse(tag: Array): WordStatisticsTag? { - ensure(tag.has(3)) { return null } + ensure(tag.has(2)) { return null } ensure(tag[0] == TAG_NAME) { return null } + val wordCount = tag[1].toIntOrNull() ?: return null + val characterCount = tag[2].toIntOrNull() ?: return null + return WordStatisticsTag( - wordCount = tag[1].toInt(), - characterCount = tag[2].toInt(), + wordCount = wordCount, + characterCount = characterCount, ) }