diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/Nip19.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/Nip19.kt index d2d20b6df..db73fbc5f 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/Nip19.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/Nip19.kt @@ -14,47 +14,46 @@ class Nip19 { enum class Type { USER, NOTE, RELAY, ADDRESS } + data class Return(val type: Type, val hex: String) fun uriToRoute(uri: String?): Return? { try { - val key = uri?.removePrefix("nostr:") + val key = uri?.removePrefix("nostr:") ?: return null - if (key != null) { - val bytes = key.bechToBytes() - if (key.startsWith("npub")) { - return Return(Type.USER, bytes.toHexKey()) - } - if (key.startsWith("note")) { - return Return(Type.NOTE, bytes.toHexKey()) - } - if (key.startsWith("nprofile")) { - val tlv = parseTLV(bytes) - val hex = tlv.get(NIP19TLVTypes.SPECIAL.id)?.get(0)?.toHexKey() - if (hex != null) - return Return(Type.USER, hex) - } - if (key.startsWith("nevent")) { - val tlv = parseTLV(bytes) - val hex = tlv.get(NIP19TLVTypes.SPECIAL.id)?.get(0)?.toHexKey() - if (hex != null) - return Return(Type.USER, hex) - } - if (key.startsWith("nrelay")) { - val tlv = parseTLV(bytes) - val relayUrl = tlv.get(NIP19TLVTypes.SPECIAL.id)?.get(0)?.toString(Charsets.UTF_8) - if (relayUrl != null) - return Return(Type.RELAY, relayUrl) - } - if (key.startsWith("naddr")) { - val tlv = parseTLV(bytes) - val d = tlv.get(NIP19TLVTypes.SPECIAL.id)?.get(0)?.toString(Charsets.UTF_8) - val relay = tlv.get(NIP19TLVTypes.RELAY.id)?.get(0)?.toString(Charsets.UTF_8) - val author = tlv.get(NIP19TLVTypes.AUTHOR.id)?.get(0)?.toHexKey() - val kind = tlv.get(NIP19TLVTypes.KIND.id)?.get(0)?.let { toInt32(it) } - if (d != null) - return Return(Type.ADDRESS, "$kind:$author:$d") - } + val bytes = key.bechToBytes() + if (key.startsWith("npub")) { + return Return(Type.USER, bytes.toHexKey()) + } + if (key.startsWith("note")) { + return Return(Type.NOTE, bytes.toHexKey()) + } + if (key.startsWith("nprofile")) { + val tlv = parseTLV(bytes) + val hex = tlv.get(NIP19TLVTypes.SPECIAL.id)?.get(0)?.toHexKey() + if (hex != null) + return Return(Type.USER, hex) + } + if (key.startsWith("nevent")) { + val tlv = parseTLV(bytes) + val hex = tlv.get(NIP19TLVTypes.SPECIAL.id)?.get(0)?.toHexKey() + if (hex != null) + return Return(Type.USER, hex) + } + if (key.startsWith("nrelay")) { + val tlv = parseTLV(bytes) + val relayUrl = tlv.get(NIP19TLVTypes.SPECIAL.id)?.get(0)?.toString(Charsets.UTF_8) + if (relayUrl != null) + return Return(Type.RELAY, relayUrl) + } + if (key.startsWith("naddr")) { + val tlv = parseTLV(bytes) + val d = tlv.get(NIP19TLVTypes.SPECIAL.id)?.get(0)?.toString(Charsets.UTF_8) + val relay = tlv.get(NIP19TLVTypes.RELAY.id)?.get(0)?.toString(Charsets.UTF_8) + val author = tlv.get(NIP19TLVTypes.AUTHOR.id)?.get(0)?.toHexKey() + val kind = tlv.get(NIP19TLVTypes.KIND.id)?.get(0)?.let { toInt32(it) } + if (d != null) + return Return(Type.ADDRESS, "$kind:$author:$d") } } catch (e: Throwable) { println("Issue trying to Decode NIP19 ${uri}: ${e.message}") @@ -84,7 +83,7 @@ fun parseTLV(data: ByteArray): Map> { val t = rest[0] val l = rest[1] val v = rest.sliceArray(IntRange(2, (2 + l) - 1)) - rest = rest.sliceArray(IntRange(2 + l, rest.size-1)) + rest = rest.sliceArray(IntRange(2 + l, rest.size - 1)) if (v.size < l) continue if (!result.containsKey(t)) {