From 2042b14578f60c352eaafb595d9ac3cd7fde22aa Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Tue, 20 Aug 2024 10:48:08 -0300 Subject: [PATCH] nak fetch: support nip05 codes. addresses https://github.com/fiatjaf/nak/issues/19 --- fetch.go | 87 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 49 insertions(+), 38 deletions(-) diff --git a/fetch.go b/fetch.go index 9952b81..49b27d1 100644 --- a/fetch.go +++ b/fetch.go @@ -5,13 +5,14 @@ import ( "github.com/fiatjaf/cli/v3" "github.com/nbd-wtf/go-nostr" + "github.com/nbd-wtf/go-nostr/nip05" "github.com/nbd-wtf/go-nostr/nip19" sdk "github.com/nbd-wtf/nostr-sdk" ) var fetch = &cli.Command{ Name: "fetch", - Usage: "fetches events related to the given nip19 code from the included relay hints or the author's NIP-65 relays.", + Usage: "fetches events related to the given nip19 or nip05 code from the included relay hints or the author's NIP-65 relays.", Description: `example usage: nak fetch nevent1qqsxrwm0hd3s3fddh4jc2574z3xzufq6qwuyz2rvv3n087zvym3dpaqprpmhxue69uhhqatzd35kxtnjv4kxz7tfdenju6t0xpnej4 echo npub1h8spmtw9m2huyv6v2j2qd5zv956z2zdugl6mgx02f2upffwpm3nqv0j4ps | nak fetch --relay wss://relay.nostr.band`, @@ -23,7 +24,7 @@ var fetch = &cli.Command{ Usage: "also use these relays to fetch from", }, }, - ArgsUsage: "[nip19code]", + ArgsUsage: "[nip05_or_nip19_code]", Action: func(ctx context.Context, c *cli.Command) error { sys := sdk.NewSystem() @@ -36,45 +37,55 @@ var fetch = &cli.Command{ for code := range getStdinLinesOrArguments(c.Args()) { filter := nostr.Filter{} - - prefix, value, err := nip19.Decode(code) - if err != nil { - ctx = lineProcessingError(ctx, "failed to decode: %s", err) - continue - } - - relays := c.StringSlice("relay") - if err := normalizeAndValidateRelayURLs(relays); err != nil { - return err - } var authorHint string + relays := c.StringSlice("relay") - switch prefix { - case "nevent": - v := value.(nostr.EventPointer) - filter.IDs = append(filter.IDs, v.ID) - if v.Author != "" { - authorHint = v.Author + if nip05.IsValidIdentifier(code) { + pp, err := nip05.QueryIdentifier(ctx, code) + if err != nil { + ctx = lineProcessingError(ctx, "failed to fetch nip05: %s", err) + continue + } + authorHint = pp.PublicKey + relays = append(relays, pp.Relays...) + } else { + prefix, value, err := nip19.Decode(code) + if err != nil { + ctx = lineProcessingError(ctx, "failed to decode: %s", err) + continue + } + + if err := normalizeAndValidateRelayURLs(relays); err != nil { + return err + } + + switch prefix { + case "nevent": + v := value.(nostr.EventPointer) + filter.IDs = append(filter.IDs, v.ID) + if v.Author != "" { + authorHint = v.Author + } + relays = append(relays, v.Relays...) + case "naddr": + v := value.(nostr.EntityPointer) + filter.Tags = nostr.TagMap{"d": []string{v.Identifier}} + filter.Kinds = append(filter.Kinds, v.Kind) + filter.Authors = append(filter.Authors, v.PublicKey) + authorHint = v.PublicKey + relays = append(relays, v.Relays...) + case "nprofile": + v := value.(nostr.ProfilePointer) + filter.Authors = append(filter.Authors, v.PublicKey) + filter.Kinds = append(filter.Kinds, 0) + authorHint = v.PublicKey + relays = append(relays, v.Relays...) + case "npub": + v := value.(string) + filter.Authors = append(filter.Authors, v) + filter.Kinds = append(filter.Kinds, 0) + authorHint = v } - relays = append(relays, v.Relays...) - case "naddr": - v := value.(nostr.EntityPointer) - filter.Tags = nostr.TagMap{"d": []string{v.Identifier}} - filter.Kinds = append(filter.Kinds, v.Kind) - filter.Authors = append(filter.Authors, v.PublicKey) - authorHint = v.PublicKey - relays = append(relays, v.Relays...) - case "nprofile": - v := value.(nostr.ProfilePointer) - filter.Authors = append(filter.Authors, v.PublicKey) - filter.Kinds = append(filter.Kinds, 0) - authorHint = v.PublicKey - relays = append(relays, v.Relays...) - case "npub": - v := value.(string) - filter.Authors = append(filter.Authors, v) - filter.Kinds = append(filter.Kinds, 0) - authorHint = v } if authorHint != "" {