From 7348039a6f26aba470813d67217a38d52ec1c5da Mon Sep 17 00:00:00 2001 From: yanas Date: Sun, 9 Oct 2022 19:04:53 +0200 Subject: [PATCH] Add configuration property for thumbnail directory used in LNURL-pay metadata --- README.md | 1 + lnme.go | 12 +++++++++++- lnurl/types.go | 32 +++++++++++++++++++++++++++++++- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5df7d35..c7316e3 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ Instead of the path to the macaroon and cert files you can also provide the hex - `static-path`: Path to a folder that you want to serve with LnMe (e.g. /home/bitcoin/lnme/website). Use this if you want to customize your ⚡website. default: disabled - `lnurlp-min-sendable`: Min sendable amount in sats via LNURL-pay. (default: 1) - `lnurlp-max-sendable`: Max sendable amount in sats via LNURL-pay. (default: 1000000) +- `lnurlp-thumbnail-dir`: Path to a PNG thumbnail directory for LNURL-pay metadata. - `lnurlp-comment-allowed`: Allowed length of LNURL-pay comments, maximum around [~2000 characters](https://stackoverflow.com/a/417184). (default: 210) - `disable-website`: Disable the default LnMe website. Disable the website if you only want to embed the LnMe widget on your existing website. - `disable-cors`: Disable CORS headers. (default: false) diff --git a/lnme.go b/lnme.go index 73ac691..b9628cd 100644 --- a/lnme.go +++ b/lnme.go @@ -164,7 +164,16 @@ func main() { lightningAddress := name + "@" + host lnurlpMinSendable := msats(cfg.Int64("lnurlp-min-sendable")) lnurlpMaxSendable := msats(cfg.Int64("lnurlp-max-sendable")) - lnurlMetadata := "[[\"text/identifier\", \"" + lightningAddress + "\"], [\"text/plain\", \"Sats for " + lightningAddress + "\"]]" + lnurlpThumbnailPath := cfg.String("lnurlp-thumbnail-dir") + "/" + name + ".png" + lnurlpThumbnailData, err := os.ReadFile(lnurlpThumbnailPath) + if lnurlpThumbnailPath != "" && err != nil { + stdOutLogger.Println("Error reading thumbnail:", err) + } + lnurlMetadata := lnurl.Metadata{}. + Identifier(lightningAddress). + Description("Sats for " + lightningAddress). + Thumbnail(lnurlpThumbnailData). + String() lnurlpCommentAllowed := cfg.Int64("lnurlp-comment-allowed") if amount := c.QueryParam("amount"); amount == "" { @@ -251,6 +260,7 @@ func LoadConfig() *koanf.Koanf { f.String("lnd-cert", "", "HEX string of LND tls cert file.") f.Int64("lnurlp-min-sendable", 1, "Min sendable amount in sats via LNURL-pay.") f.Int64("lnurlp-max-sendable", 1000000, "Max sendable amount in sats via LNURL-pay.") + f.String("lnurlp-thumbnail-dir", "", "Path to a PNG thumbnail directory for LNURL-pay metadata.") f.Int64("lnurlp-comment-allowed", 210, "Allowed length of LNURL-pay comments.") f.Bool("disable-website", false, "Disable default embedded website.") f.Bool("disable-ln-address", false, "Disable Lightning Address handling") diff --git a/lnurl/types.go b/lnurl/types.go index ba60c09..db4f39e 100644 --- a/lnurl/types.go +++ b/lnurl/types.go @@ -2,7 +2,12 @@ // only using the LNURL types here package lnurl -import "net/url" +import ( + "encoding/base64" + "encoding/json" + "net/http" + "net/url" +) type LNURLResponse struct { Status string `json:"status,omitempty"` @@ -50,3 +55,28 @@ type LNURLErrorResponse struct { } type Metadata [][]string + +func (metadata Metadata) Identifier(identifier string) Metadata { + return append(metadata, []string{"text/identifier", identifier}) +} + +func (metadata Metadata) Description(description string) Metadata { + return append(metadata, []string{"text/plain", description}) +} + +func (metadata Metadata) Thumbnail(imageData []byte) Metadata { + if len(imageData) == 0 { + return metadata + } + + mimeType := http.DetectContentType(imageData) + imageDataBase64 := base64.StdEncoding.EncodeToString(imageData) + + return append(metadata, []string{mimeType + ";base64", imageDataBase64}) +} + +func (metadata Metadata) String() string { + bytes, _ := json.Marshal(metadata) + + return string(bytes) +}