diff --git a/src/main/scala/Components.scala b/src/main/scala/Components.scala index 9596337..35f9025 100644 --- a/src/main/scala/Components.scala +++ b/src/main/scala/Components.scala @@ -160,15 +160,20 @@ object Components { def renderAddressPointer( store: Store, addr: snow.AddressPointer - ): Resource[IO, HtmlDivElement[IO]] = + ): Resource[IO, HtmlDivElement[IO]] = { + val nip33atag = + s"${addr.kind}:${addr.author.value.toHex}:${addr.d}" + div( cls := "text-md", entry("author (pubkey hex)", addr.author.value.toHex), entry("identifier (d tag)", addr.d), entry("kind", addr.kind.toString), relayHints(store, addr.relays), - nip19_21(store, "naddr", NIP19.encode(addr)) + nip19_21(store, "naddr", NIP19.encode(addr)), + entry("nip33 'a' tag", nip33atag, Some(editable(store, nip33atag))) ) + } def renderEvent( store: Store, @@ -285,7 +290,7 @@ object Components { div( cls := "flex items-center space-x-3", span(cls := "font-bold", key + " "), - span(Styles.mono, cls := "max-w-xl", value), + span(Styles.mono, cls := "max-w-xl break-all", value), editLink ) diff --git a/src/main/scala/Parser.scala b/src/main/scala/Parser.scala index 12ce8cd..9033aaa 100644 --- a/src/main/scala/Parser.scala +++ b/src/main/scala/Parser.scala @@ -22,11 +22,27 @@ object Parser { .flatMap(b => Try(Right(ByteVector32(b))).toOption) .getOrElse( NIP19.decode(input) match { - case Right(pp: ProfilePointer) => Right(pp) - case Right(evp: EventPointer) => Right(evp) - case Right(sk: PrivateKey) => Right(sk) - case Right(addr: AddressPointer) => Right(addr) + case Right(pp: ProfilePointer) => Right(pp) + case Right(evp: EventPointer) => Right(evp) + case Right(sk: PrivateKey) => Right(sk) + case Right(addr: AddressPointer) => Right(addr) + case Left(_) if input.split(":").size == 3 => + // parse "a" tag format, nip 33 + val spl = input.split(":") + ( + spl(0).toIntOption, + ByteVector.fromHex(spl(1)), + Some(spl(2)) + ).mapN((kind, author, identifier) => + AddressPointer( + identifier, + kind, + scoin.XOnlyPublicKey(ByteVector32(author)), + relays = List.empty + ) + ).toRight("couldn't parse as a nip33 'a' tag") case Left(_) => + // parse event json parse(input) match { case Left(err: io.circe.ParsingFailure) => Left("not valid JSON or NIP-19 code")