diff --git a/.env.example b/.env.example index d676179..2e7958a 100644 --- a/.env.example +++ b/.env.example @@ -20,6 +20,8 @@ LNBITS_INVOICE_KEY=your-lnbits-invoice-read-key PRICE_YEARLY_SATS=1000 PRICE_LIFETIME_SATS=10000 INVOICE_EXPIRY_MINUTES=30 +INVOICE_MEMO_YEARLY=Noderunners Relay yearly Access +INVOICE_MEMO_LIFETIME=Noderunners Relay lifetime Access # --- Nostr --- RELAYS=wss://relay.azzamo.net,wss://nostr.azzamo.net,wss://wot.azzamo.net diff --git a/cmd/nip05api/main.go b/cmd/nip05api/main.go index 281bcb6..33f2934 100644 --- a/cmd/nip05api/main.go +++ b/cmd/nip05api/main.go @@ -102,6 +102,8 @@ func run() error { YearlySats: cfg.Lightning.PriceYearlySats, LifetimeSats: cfg.Lightning.PriceLifetimeSats, ExpiryMins: cfg.Lightning.InvoiceExpiryMins, + MemoYearly: cfg.Lightning.InvoiceMemoYearly, + MemoLifetime: cfg.Lightning.InvoiceMemoLifetime, }, cfg.Domain) } diff --git a/internal/config/config.go b/internal/config/config.go index d5c48ce..898bbce 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -10,12 +10,14 @@ import ( ) type LightningConfig struct { - Enabled bool - LNbitsURL string - LNbitsInvoiceKey string - PriceYearlySats int64 - PriceLifetimeSats int64 - InvoiceExpiryMins int + Enabled bool + LNbitsURL string + LNbitsInvoiceKey string + PriceYearlySats int64 + PriceLifetimeSats int64 + InvoiceExpiryMins int + InvoiceMemoYearly string + InvoiceMemoLifetime string } type NostrConfig struct { @@ -77,12 +79,14 @@ func Load() (*Config, error) { FrontendURL: env("FRONTEND_URL", ""), DatabasePath: env("DATABASE_PATH", ".data/nip05.db"), Lightning: LightningConfig{ - Enabled: envBool("LIGHTNING_ENABLED", true), - LNbitsURL: env("LNBITS_URL", ""), - LNbitsInvoiceKey: env("LNBITS_INVOICE_KEY", ""), - PriceYearlySats: int64(envInt("PRICE_YEARLY_SATS", 1000)), - PriceLifetimeSats: int64(envInt("PRICE_LIFETIME_SATS", 10000)), - InvoiceExpiryMins: envInt("INVOICE_EXPIRY_MINUTES", 30), + Enabled: envBool("LIGHTNING_ENABLED", true), + LNbitsURL: env("LNBITS_URL", ""), + LNbitsInvoiceKey: env("LNBITS_INVOICE_KEY", ""), + PriceYearlySats: int64(envInt("PRICE_YEARLY_SATS", 1000)), + PriceLifetimeSats: int64(envInt("PRICE_LIFETIME_SATS", 10000)), + InvoiceExpiryMins: envInt("INVOICE_EXPIRY_MINUTES", 30), + InvoiceMemoYearly: env("INVOICE_MEMO_YEARLY", "Noderunners Relay yearly Access"), + InvoiceMemoLifetime: env("INVOICE_MEMO_LIFETIME", "Noderunners Relay lifetime Access"), }, Nostr: NostrConfig{ Relays: csv(env("RELAYS", "")), diff --git a/internal/invoice/lnbits.go b/internal/invoice/lnbits.go index 6a95ed3..c0befe3 100644 --- a/internal/invoice/lnbits.go +++ b/internal/invoice/lnbits.go @@ -26,10 +26,11 @@ func NewLNbits(baseURL, invoiceKey string) *LNbitsClient { } type createReq struct { - Out bool `json:"out"` - Amount int64 `json:"amount"` - Memo string `json:"memo"` - Expiry int `json:"expiry,omitempty"` + Out bool `json:"out"` + Amount int64 `json:"amount"` + Memo string `json:"memo"` + Expiry int `json:"expiry,omitempty"` + Extra map[string]string `json:"extra,omitempty"` } type createResp struct { @@ -47,8 +48,8 @@ type statusResp struct { } `json:"details"` } -func (c *LNbitsClient) Create(ctx context.Context, amountSats int64, memo string, expirySecs int) (string, string, error) { - body, err := json.Marshal(createReq{Out: false, Amount: amountSats, Memo: memo, Expiry: expirySecs}) +func (c *LNbitsClient) Create(ctx context.Context, amountSats int64, memo string, expirySecs int, extra map[string]string) (string, string, error) { + body, err := json.Marshal(createReq{Out: false, Amount: amountSats, Memo: memo, Expiry: expirySecs, Extra: extra}) if err != nil { return "", "", err } diff --git a/internal/invoice/service.go b/internal/invoice/service.go index 66fdfed..e3075b2 100644 --- a/internal/invoice/service.go +++ b/internal/invoice/service.go @@ -20,6 +20,8 @@ type Pricing struct { YearlySats int64 LifetimeSats int64 ExpiryMins int + MemoYearly string + MemoLifetime string } type Service struct { @@ -131,17 +133,15 @@ func (s *Service) Create(ctx context.Context, req CreateRequest) (*PendingInvoic } amount := s.pricing.YearlySats * int64(req.Years) + memo := s.pricing.MemoYearly if req.SubscriptionType == user.SubLifetime { amount = s.pricing.LifetimeSats - } - - memo := fmt.Sprintf("%s@%s", username, s.domain) - if isRenewal { - memo = "renewal: " + memo + memo = s.pricing.MemoLifetime } expirySecs := s.pricing.ExpiryMins * 60 - hash, request, err := s.lnbits.Create(ctx, amount, memo, expirySecs) + extra := map[string]string{"pubkey": req.Pubkey} + hash, request, err := s.lnbits.Create(ctx, amount, memo, expirySecs, extra) if err != nil { return nil, err }