Extract TlvTypes to nip19 module

This commit is contained in:
Chemaclass 2023-03-08 12:53:39 +01:00
parent 9ab1828634
commit 1998711e60
3 changed files with 31 additions and 30 deletions
app/src/main/java/com/vitorpamplona/amethyst/service

@ -1,6 +1,7 @@
package com.vitorpamplona.amethyst.service
import com.vitorpamplona.amethyst.model.toHexKey
import com.vitorpamplona.amethyst.service.nip19.TlvTypes
import nostr.postr.bechToBytes
import java.nio.ByteBuffer
import java.nio.ByteOrder
@ -11,7 +12,7 @@ class Nip19 {
USER, NOTE, RELAY, ADDRESS
}
data class Return(val type: Type, val hex: String, val relay: String?)
data class Return(val type: Type, val hex: String, val relay: String? = null)
fun uriToRoute(uri: String?): Return? {
try {
@ -39,21 +40,21 @@ class Nip19 {
}
private fun npub(bytes: ByteArray): Return {
return Return(Type.USER, bytes.toHexKey(), null)
return Return(Type.USER, bytes.toHexKey())
}
private fun note(bytes: ByteArray): Return {
return Return(Type.NOTE, bytes.toHexKey(), null)
return Return(Type.NOTE, bytes.toHexKey())
}
private fun nprofile(bytes: ByteArray): Return? {
val tlv = parseTLV(bytes)
val hex = tlv.get(NIP19TLVTypes.SPECIAL.id)
val hex = tlv.get(TlvTypes.SPECIAL.id)
?.get(0)
?.toHexKey() ?: return null
val relay = tlv.get(NIP19TLVTypes.RELAY.id)
val relay = tlv.get(TlvTypes.RELAY.id)
?.get(0)
?.toString(Charsets.UTF_8)
@ -63,11 +64,11 @@ class Nip19 {
private fun nevent(bytes: ByteArray): Return? {
val tlv = parseTLV(bytes)
val hex = tlv.get(NIP19TLVTypes.SPECIAL.id)
val hex = tlv.get(TlvTypes.SPECIAL.id)
?.get(0)
?.toHexKey() ?: return null
val relay = tlv.get(NIP19TLVTypes.RELAY.id)
val relay = tlv.get(TlvTypes.RELAY.id)
?.get(0)
?.toString(Charsets.UTF_8)
@ -76,29 +77,29 @@ class Nip19 {
private fun nrelay(bytes: ByteArray): Return? {
val relayUrl = parseTLV(bytes)
.get(NIP19TLVTypes.SPECIAL.id)
.get(TlvTypes.SPECIAL.id)
?.get(0)
?.toString(Charsets.UTF_8) ?: return null
return Return(Type.RELAY, relayUrl, null)
return Return(Type.RELAY, relayUrl)
}
private fun naddr(bytes: ByteArray): Return? {
val tlv = parseTLV(bytes)
val d = tlv.get(NIP19TLVTypes.SPECIAL.id)
val d = tlv.get(TlvTypes.SPECIAL.id)
?.get(0)
?.toString(Charsets.UTF_8) ?: return null
val relay = tlv.get(NIP19TLVTypes.RELAY.id)
val relay = tlv.get(TlvTypes.RELAY.id)
?.get(0)
?.toString(Charsets.UTF_8)
val author = tlv.get(NIP19TLVTypes.AUTHOR.id)
val author = tlv.get(TlvTypes.AUTHOR.id)
?.get(0)
?.toHexKey()
val kind = tlv.get(NIP19TLVTypes.KIND.id)
val kind = tlv.get(TlvTypes.KIND.id)
?.get(0)
?.let { toInt32(it) }
@ -106,14 +107,6 @@ class Nip19 {
}
}
// Classes should start with an uppercase letter in kotlin
enum class NIP19TLVTypes(val id: Byte) {
SPECIAL(0),
RELAY(1),
AUTHOR(2),
KIND(3);
}
fun toInt32(bytes: ByteArray): Int {
require(bytes.size == 4) { "length must be 4, got: ${bytes.size}" }
return ByteBuffer.wrap(bytes, 0, 4).order(ByteOrder.BIG_ENDIAN).int

@ -3,7 +3,7 @@ package com.vitorpamplona.amethyst.service.model
import android.util.Log
import com.vitorpamplona.amethyst.model.toByteArray
import com.vitorpamplona.amethyst.model.toHexKey
import com.vitorpamplona.amethyst.service.NIP19TLVTypes
import com.vitorpamplona.amethyst.service.nip19.TlvTypes
import com.vitorpamplona.amethyst.service.parseTLV
import com.vitorpamplona.amethyst.service.toInt32
import fr.acinq.secp256k1.Hex
@ -21,15 +21,15 @@ data class ATag(val kind: Int, val pubKeyHex: String, val dTag: String, val rela
val relay = relay?.toByteArray(Charsets.UTF_8)
var fullArray =
byteArrayOf(NIP19TLVTypes.SPECIAL.id, dTag.size.toByte()) + dTag
byteArrayOf(TlvTypes.SPECIAL.id, dTag.size.toByte()) + dTag
if (relay != null) {
fullArray = fullArray + byteArrayOf(NIP19TLVTypes.RELAY.id, relay.size.toByte()) + relay
fullArray = fullArray + byteArrayOf(TlvTypes.RELAY.id, relay.size.toByte()) + relay
}
fullArray = fullArray +
byteArrayOf(NIP19TLVTypes.AUTHOR.id, author.size.toByte()) + author +
byteArrayOf(NIP19TLVTypes.KIND.id, kind.size.toByte()) + kind
byteArrayOf(TlvTypes.AUTHOR.id, author.size.toByte()) + author +
byteArrayOf(TlvTypes.KIND.id, kind.size.toByte()) + kind
return Bech32.encodeBytes(hrp = "naddr", fullArray, Bech32.Encoding.Bech32)
}
@ -64,10 +64,10 @@ data class ATag(val kind: Int, val pubKeyHex: String, val dTag: String, val rela
if (key.startsWith("naddr")) {
val tlv = parseTLV(key.bechToBytes())
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) }
val d = tlv.get(TlvTypes.SPECIAL.id)?.get(0)?.toString(Charsets.UTF_8) ?: ""
val relay = tlv.get(TlvTypes.RELAY.id)?.get(0)?.toString(Charsets.UTF_8)
val author = tlv.get(TlvTypes.AUTHOR.id)?.get(0)?.toHexKey()
val kind = tlv.get(TlvTypes.KIND.id)?.get(0)?.let { toInt32(it) }
if (kind != null && author != null) {
return ATag(kind, author, d, relay)

@ -0,0 +1,8 @@
package com.vitorpamplona.amethyst.service.nip19
enum class TlvTypes(val id: Byte) {
SPECIAL(0),
RELAY(1),
AUTHOR(2),
KIND(3);
}