forked from heierbtc/satdress-mirror
104 lines
2.5 KiB
Go
104 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/fiatjaf/go-lnurl"
|
|
"github.com/gorilla/mux"
|
|
)
|
|
|
|
func handleLNURL(w http.ResponseWriter, r *http.Request) {
|
|
username := mux.Vars(r)["user"]
|
|
|
|
domains := getDomains(s.Domain)
|
|
domain := ""
|
|
|
|
if len(domains) == 1 {
|
|
domain = domains[0]
|
|
} else {
|
|
hostname := r.URL.Host
|
|
if hostname == "" {
|
|
hostname = r.Host
|
|
}
|
|
|
|
for _, one := range getDomains(s.Domain) {
|
|
if strings.Contains(hostname, one) {
|
|
domain = one
|
|
break
|
|
}
|
|
}
|
|
if domain == "" {
|
|
json.NewEncoder(w).Encode(lnurl.ErrorResponse("incorrect domain"))
|
|
return
|
|
}
|
|
}
|
|
|
|
params, err := GetName(username, domain)
|
|
if err != nil {
|
|
log.Error().Err(err).Str("name", username).Str("domain", domain).Msg("failed to get name")
|
|
json.NewEncoder(w).Encode(lnurl.ErrorResponse(fmt.Sprintf(
|
|
"failed to get name %s@%s", username, domain)))
|
|
return
|
|
}
|
|
|
|
log.Info().Str("username", username).Str("domain", domain).Msg("got lnurl request")
|
|
|
|
if amount := r.URL.Query().Get("amount"); amount == "" {
|
|
// check if the receiver accepts comments
|
|
var commentLength int64 = 0
|
|
// TODO: support webhook comments
|
|
|
|
// convert configured sendable amounts to integer
|
|
minSendable, err := strconv.ParseInt(params.MinSendable, 10, 64)
|
|
// set defaults
|
|
if err != nil {
|
|
minSendable = 1000
|
|
}
|
|
maxSendable, err := strconv.ParseInt(params.MaxSendable, 10, 64)
|
|
if err != nil {
|
|
maxSendable = 100000000
|
|
}
|
|
|
|
json.NewEncoder(w).Encode(lnurl.LNURLPayResponse1{
|
|
LNURLResponse: lnurl.LNURLResponse{Status: "OK"},
|
|
Callback: fmt.Sprintf("https://%s/.well-known/lnurlp/%s", domain, username),
|
|
MinSendable: minSendable,
|
|
MaxSendable: maxSendable,
|
|
EncodedMetadata: makeMetadata(params),
|
|
CommentAllowed: commentLength,
|
|
Tag: "payRequest",
|
|
})
|
|
|
|
} else {
|
|
msat, err := strconv.Atoi(amount)
|
|
if err != nil {
|
|
json.NewEncoder(w).Encode(lnurl.ErrorResponse("amount is not integer"))
|
|
return
|
|
}
|
|
|
|
bolt11, err := makeInvoice(params, msat, nil)
|
|
if err != nil {
|
|
json.NewEncoder(w).Encode(
|
|
lnurl.ErrorResponse("failed to create invoice: " + err.Error()))
|
|
return
|
|
}
|
|
|
|
json.NewEncoder(w).Encode(lnurl.LNURLPayResponse2{
|
|
LNURLResponse: lnurl.LNURLResponse{Status: "OK"},
|
|
PR: bolt11,
|
|
Routes: make([][]lnurl.RouteInfo, 0),
|
|
Disposable: lnurl.FALSE,
|
|
SuccessAction: lnurl.Action("Payment received!", ""),
|
|
})
|
|
|
|
// send webhook
|
|
go func() {
|
|
// TODO
|
|
}()
|
|
}
|
|
}
|