forked from nbd-wtf/satdress
-
Notifications
You must be signed in to change notification settings - Fork 0
/
lnurl.go
77 lines (66 loc) · 1.88 KB
/
lnurl.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package main
import (
"encoding/json"
"fmt"
"net/http"
"strconv"
"github.com/cockroachdb/pebble"
"github.com/fiatjaf/go-lnurl"
"github.com/gorilla/mux"
)
func handleLNURL(w http.ResponseWriter, r *http.Request) {
username := mux.Vars(r)["username"]
log.Info().Str("username", username).Msg("got lnurl request")
var params Params
val, closer, err := db.Get([]byte(username))
if err != nil {
if err != pebble.ErrNotFound {
log.Error().Err(err).Str("name", username).
Msg("error getting data")
}
return
}
defer closer.Close()
if err := json.Unmarshal(val, ¶ms); err != nil {
log.Error().Err(err).Str("name", username).Str("data", string(val)).
Msg("got broken json from db")
return
}
if amount := r.URL.Query().Get("amount"); amount == "" {
// check if the receiver accepts comments
var commentLength int64 = 0
// TODO: support webhook comments
json.NewEncoder(w).Encode(lnurl.LNURLPayResponse1{
LNURLResponse: lnurl.LNURLResponse{Status: "OK"},
Callback: fmt.Sprintf("https://%s/.well-known/lnurlp/%s", s.Domain, username),
MinSendable: 1000,
MaxSendable: 100000000,
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)
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
}()
}
}