From 02e54e4dbfd10ff7e760c13912ef655ee911cad9 Mon Sep 17 00:00:00 2001 From: "Dr. Tobias Baur" Date: Fri, 10 Mar 2023 15:34:31 +0100 Subject: [PATCH] Download Nostr Profile picture to show in some wallets (non zaps) --- invoice.go | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- nostr.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+), 2 deletions(-) diff --git a/invoice.go b/invoice.go index d3d5853..2378184 100644 --- a/invoice.go +++ b/invoice.go @@ -1,12 +1,18 @@ package main import ( + "bytes" "encoding/json" "fmt" + "image" + "image/jpeg" + "io/ioutil" + "net/http" "strconv" "time" "github.com/nbd-wtf/go-nostr" + "github.com/nfnt/resize" "github.com/fiatjaf/go-lnurl" // "github.com/fiatjaf/makeinvoice" @@ -14,11 +20,52 @@ import ( func metaData(params *Params) lnurl.Metadata { - //addImageToMetaData(w.telegram, &metadata, username, user.Telegram) - return lnurl.Metadata{ + metadata := lnurl.Metadata{ Description: fmt.Sprintf("Pay to %s@%s", params.Name, params.Domain), LightningAddress: fmt.Sprintf("%s@%s", params.Name, params.Domain), } + + NostrProfile, _ := GetNostrProfileMetaData(params.Npub) + + addImageToMetaData(&metadata, NostrProfile.Picture) + return metadata + +} + +// addImageMetaData add images an image to the LNURL metadata +func addImageToMetaData(metadata *lnurl.Metadata, imageurl string) { + + picture, _ := DownloadProfilePicture(imageurl) + // if err != nil { + // log.Debug().Str("Downloading profile picture", err.Error()).Msg("Error") + // return + // } + metadata.Image.Ext = "jpeg" + metadata.Image.DataURI = imageurl + metadata.Image.Bytes = picture +} + +func DownloadProfilePicture(url string) ([]byte, error) { + res, err := http.Get(url) + + if err != nil { + //log.Fatalf("http.Get -> %v", err) + } + data, err := ioutil.ReadAll(res.Body) + if err != nil { + // log.Fatalf("ioutil.ReadAll -> %v", err) + } + res.Body.Close() + img, _, err := image.Decode(bytes.NewReader(data)) + if err != nil { + return nil, err + } + // resize image + img = resize.Thumbnail(160, 160, img, resize.Lanczos3) + buf := new(bytes.Buffer) + _ = jpeg.Encode(buf, img, nil) + ioutil.WriteFile("test.jpg", buf.Bytes(), 0666) + return buf.Bytes(), nil } func makeInvoice( @@ -29,6 +76,7 @@ func makeInvoice( comment string, ) (bolt11 string, err error) { // prepare params + var backend BackendParams switch params.Kind { case "sparko": diff --git a/nostr.go b/nostr.go index e6b41ce..4cf5589 100644 --- a/nostr.go +++ b/nostr.go @@ -82,6 +82,50 @@ func handleNip05(w http.ResponseWriter, r *http.Request) { } } +func GetNostrProfileMetaData(npub string) (nostr.ProfileMetadata, error) { + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + + var metadata *nostr.ProfileMetadata + // connect to any relay + url := "wss://relay.damus.io" + relay, err := nostr.RelayConnect(ctx, url) + if err != nil { + panic(err) + } + + // create filters + var filters nostr.Filters + if _, v, err := nip19.Decode(npub); err == nil { + t := make(map[string][]string) + t["p"] = []string{v.(string)} + filters = []nostr.Filter{{ + Authors: []string{v.(string)}, + Kinds: []int{0}, + // limit = 3, get the three most recent notes + Limit: 1, + }} + } else { + return *metadata, err + + } + sub := relay.Subscribe(ctx, filters) + evs := make([]nostr.Event, 0) + + go func() { + <-sub.EndOfStoredEvents + cancel() + }() + + for ev := range sub.Events { + + evs = append(evs, *ev) + } + metadata, err = nostr.ParseMetadata(evs[0]) + + return *metadata, err + +} + func publishNostrEvent(ev nostr.Event, relays []string) { pk := s.NostrPrivateKey ev.Sign(pk)