Download Nostr Profile picture to show in some wallets (non zaps)

This commit is contained in:
Dr. Tobias Baur
2023-03-10 15:34:31 +01:00
parent 64d605b659
commit 02e54e4dbf
2 changed files with 94 additions and 2 deletions
+50 -2
View File
@@ -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":
+44
View File
@@ -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)