Better longging 1337 (#206)

* speed up tx lock

* better logging and lnurl lightning: prefix

Co-authored-by: callebtc <93376500+callebtc@users.noreply.github.com>
This commit is contained in:
LightningTipBot 2021-12-24 15:34:17 +01:00 committed by GitHub
parent 5414c82339
commit 09d3af411e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
20 changed files with 71 additions and 70 deletions

View file

@ -87,13 +87,13 @@ func (w *Server) receive(writer http.ResponseWriter, request *http.Request) {
request.Header.Del("content-length") request.Header.Del("content-length")
err := json.NewDecoder(request.Body).Decode(&webhookEvent) err := json.NewDecoder(request.Body).Decode(&webhookEvent)
if err != nil { if err != nil {
log.Errorf("[Webhook] Error decoding request: %s", err) log.Errorf("[Webhook] Error decoding request: %s", err.Error())
writer.WriteHeader(400) writer.WriteHeader(400)
return return
} }
user, err := w.GetUserByWalletId(webhookEvent.WalletID) user, err := w.GetUserByWalletId(webhookEvent.WalletID)
if err != nil { if err != nil {
log.Errorf("[Webhook] Error getting user: %s", err) log.Errorf("[Webhook] Error getting user: %s", err.Error())
writer.WriteHeader(400) writer.WriteHeader(400)
return return
} }

View file

@ -57,7 +57,7 @@ func (w Server) handleLnUrl(writer http.ResponseWriter, request *http.Request) {
// check if error was returned from first or second handlers // check if error was returned from first or second handlers
if err != nil { if err != nil {
// log the error // log the error
log.Errorf("[LNURL] %v", err) log.Errorf("[LNURL] %v", err.Error())
if response != nil { if response != nil {
// there is a valid error response // there is a valid error response
err = writeResponse(writer, response) err = writeResponse(writer, response)
@ -161,7 +161,7 @@ func (w Server) serveLNURLpSecond(username string, amount_msat int64, comment st
Webhook: w.WebhookServer}, Webhook: w.WebhookServer},
w.c) w.c)
if err != nil { if err != nil {
err = fmt.Errorf("[serveLNURLpSecond] Couldn't create invoice: %v", err) err = fmt.Errorf("[serveLNURLpSecond] Couldn't create invoice: %v", err.Error())
resp = &lnurl.LNURLPayValues{ resp = &lnurl.LNURLPayValues{
LNURLResponse: lnurl.LNURLResponse{ LNURLResponse: lnurl.LNURLResponse{
Status: statusError, Status: statusError,

View file

@ -1,9 +1,10 @@
package storage package storage
import ( import (
"time"
"github.com/eko/gocache/store" "github.com/eko/gocache/store"
gocache "github.com/patrickmn/go-cache" gocache "github.com/patrickmn/go-cache"
"time"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
@ -55,7 +56,6 @@ func (tx *Base) Inactivate(s Storable, db *DB) error {
func (tx *Base) Get(s Storable, db *DB) (Storable, error) { func (tx *Base) Get(s Storable, db *DB) (Storable, error) {
cacheTx, err := transactionCache.Get(s.Key()) cacheTx, err := transactionCache.Get(s.Key())
if err != nil { if err != nil {
log.Errorf("[Bunt Cache] could not get bunt object: %v", err)
err := db.Get(s) err := db.Get(s)
if err != nil { if err != nil {
return s, err return s, err
@ -72,13 +72,13 @@ func (tx *Base) Set(s Storable, db *DB) error {
tx.UpdatedAt = time.Now() tx.UpdatedAt = time.Now()
err := db.Set(s) err := db.Set(s)
if err != nil { if err != nil {
log.Errorf("[Bunt] could not set object: %v", err) log.Errorf("[Bunt] could not set object: %v", err.Error())
return err return err
} }
log.Tracef("[Bunt] set object %s", s.Key()) log.Tracef("[Bunt] set object %s", s.Key())
err = transactionCache.Set(s.Key(), s, &store.Options{Expiration: 5 * time.Minute}) err = transactionCache.Set(s.Key(), s, &store.Options{Expiration: 5 * time.Minute})
if err != nil { if err != nil {
log.Errorf("[Bunt Cache] could not set object: %v", err) log.Errorf("[Bunt Cache] could not set object: %v", err.Error())
} }
log.Tracef("[Bunt Cache] set object: %s", s.Key()) log.Tracef("[Bunt Cache] set object: %s", s.Key())
return err return err

View file

@ -75,7 +75,7 @@ func (bot TipBot) createFaucet(ctx context.Context, text string, sender *tb.User
} }
// check if fromUser has balance // check if fromUser has balance
if balance < amount { if balance < amount {
return nil, errors.New(errors.BalanceToLowError, fmt.Errorf("[faucet] Balance of user %s too low: %v", fromUserStr, err)) return nil, errors.New(errors.BalanceToLowError, fmt.Errorf("[faucet] Balance of user %s too low: %v", fromUserStr, err.Error()))
} }
// // check for memo in command // // check for memo in command
memo := GetMemoFromCommand(text, 3) memo := GetMemoFromCommand(text, 3)
@ -228,7 +228,7 @@ func (bot TipBot) handleInlineFaucetQuery(ctx context.Context, q *tb.Query) {
CacheTime: 1, CacheTime: 1,
}) })
if err != nil { if err != nil {
log.Errorln(err) log.Errorln(err.Error())
} }
} }
@ -239,7 +239,7 @@ func (bot *TipBot) acceptInlineFaucetHandler(ctx context.Context, c *tb.Callback
defer mutex.UnlockWithContext(ctx, tx.ID) defer mutex.UnlockWithContext(ctx, tx.ID)
fn, err := tx.Get(tx, bot.Bunt) fn, err := tx.Get(tx, bot.Bunt)
if err != nil { if err != nil {
log.Debugf("[acceptInlineFaucetHandler] %s", err) log.Debugf("[acceptInlineFaucetHandler] %s", err.Error())
return return
} }
inlineFaucet := fn.(*InlineFaucet) inlineFaucet := fn.(*InlineFaucet)
@ -295,7 +295,7 @@ func (bot *TipBot) acceptInlineFaucetHandler(ctx context.Context, c *tb.Callback
success, err := t.Send() success, err := t.Send()
if !success { if !success {
bot.trySendMessage(from.Telegram, Translate(ctx, "sendErrorMessage")) bot.trySendMessage(from.Telegram, Translate(ctx, "sendErrorMessage"))
errMsg := fmt.Sprintf("[faucet] Transaction failed: %s", err) errMsg := fmt.Sprintf("[faucet] Transaction failed: %s", err.Error())
log.Warnln(errMsg) log.Warnln(errMsg)
// if faucet fails, cancel it: // if faucet fails, cancel it:
// c.Sender.ID = inlineFaucet.From.Telegram.ID // overwrite the sender of the callback to be the faucet owner // c.Sender.ID = inlineFaucet.From.Telegram.ID // overwrite the sender of the callback to be the faucet owner
@ -312,7 +312,7 @@ func (bot *TipBot) acceptInlineFaucetHandler(ctx context.Context, c *tb.Callback
_, err = bot.Telegram.Send(to.Telegram, fmt.Sprintf(i18n.Translate(to.Telegram.LanguageCode, "inlineFaucetReceivedMessage"), fromUserStrMd, inlineFaucet.PerUserAmount)) _, err = bot.Telegram.Send(to.Telegram, fmt.Sprintf(i18n.Translate(to.Telegram.LanguageCode, "inlineFaucetReceivedMessage"), fromUserStrMd, inlineFaucet.PerUserAmount))
_, err = bot.Telegram.Send(from.Telegram, fmt.Sprintf(i18n.Translate(from.Telegram.LanguageCode, "inlineFaucetSentMessage"), inlineFaucet.PerUserAmount, toUserStrMd)) _, err = bot.Telegram.Send(from.Telegram, fmt.Sprintf(i18n.Translate(from.Telegram.LanguageCode, "inlineFaucetSentMessage"), inlineFaucet.PerUserAmount, toUserStrMd))
if err != nil { if err != nil {
errmsg := fmt.Errorf("[faucet] Error: Send message to %s: %s", toUserStr, err) errmsg := fmt.Errorf("[faucet] Error: Send message to %s: %s", toUserStr, err.Error())
log.Warnln(errmsg) log.Warnln(errmsg)
} }
@ -347,7 +347,7 @@ func (bot *TipBot) cancelInlineFaucet(ctx context.Context, c *tb.Callback, ignor
defer mutex.UnlockWithContext(ctx, tx.ID) defer mutex.UnlockWithContext(ctx, tx.ID)
fn, err := tx.Get(tx, bot.Bunt) fn, err := tx.Get(tx, bot.Bunt)
if err != nil { if err != nil {
log.Debugf("[cancelInlineFaucetHandler] %s", err) log.Debugf("[cancelInlineFaucetHandler] %s", err.Error())
return return
} }

View file

@ -102,7 +102,7 @@ func (bot TipBot) anyChosenInlineHandler(q *tb.ChosenInlineResult) {
inlineObject, err := bot.Cache.Get(q.ResultID) inlineObject, err := bot.Cache.Get(q.ResultID)
// check error // check error
if err != nil { if err != nil {
log.Errorf("[anyChosenInlineHandler] could not find inline object in cache. %v", err) log.Errorf("[anyChosenInlineHandler] could not find inline object in cache. %v", err.Error())
return return
} }
switch inlineObject.(type) { switch inlineObject.(type) {

View file

@ -150,7 +150,7 @@ func (bot *TipBot) acceptInlineReceiveHandler(ctx context.Context, c *tb.Callbac
defer mutex.UnlockWithContext(ctx, tx.ID) defer mutex.UnlockWithContext(ctx, tx.ID)
rn, err := tx.Get(tx, bot.Bunt) rn, err := tx.Get(tx, bot.Bunt)
if err != nil { if err != nil {
log.Errorf("[getInlineReceive] %s", err) log.Errorf("[getInlineReceive] %s", err.Error())
return return
} }
inlineReceive := rn.(*InlineReceive) inlineReceive := rn.(*InlineReceive)
@ -184,7 +184,7 @@ func (bot *TipBot) acceptInlineReceiveHandler(ctx context.Context, c *tb.Callbac
balance, err := bot.GetUserBalance(from) balance, err := bot.GetUserBalance(from)
if err != nil { if err != nil {
errmsg := fmt.Sprintf("[inlineReceive] Error: Could not get user balance: %s", err) errmsg := fmt.Sprintf("[inlineReceive] Error: Could not get user balance: %s", err.Error())
log.Warnln(errmsg) log.Warnln(errmsg)
} }
@ -208,7 +208,7 @@ func (bot *TipBot) sendInlineReceiveHandler(ctx context.Context, c *tb.Callback)
rn, err := tx.Get(tx, bot.Bunt) rn, err := tx.Get(tx, bot.Bunt)
// immediatelly set intransaction to block duplicate calls // immediatelly set intransaction to block duplicate calls
if err != nil { if err != nil {
// log.Errorf("[getInlineReceive] %s", err) // log.Errorf("[getInlineReceive] %s", err.Error())
return return
} }
inlineReceive := rn.(*InlineReceive) inlineReceive := rn.(*InlineReceive)
@ -248,7 +248,7 @@ func (bot *TipBot) sendInlineReceiveHandler(ctx context.Context, c *tb.Callback)
t.Memo = transactionMemo t.Memo = transactionMemo
success, err := t.Send() success, err := t.Send()
if !success { if !success {
errMsg := fmt.Sprintf("[acceptInlineReceiveHandler] Transaction failed: %s", err) errMsg := fmt.Sprintf("[acceptInlineReceiveHandler] Transaction failed: %s", err.Error())
log.Errorln(errMsg) log.Errorln(errMsg)
bot.tryEditMessage(c.Message, i18n.Translate(inlineReceive.LanguageCode, "inlineReceiveFailedMessage"), &tb.ReplyMarkup{}) bot.tryEditMessage(c.Message, i18n.Translate(inlineReceive.LanguageCode, "inlineReceiveFailedMessage"), &tb.ReplyMarkup{})
return return
@ -266,7 +266,7 @@ func (bot *TipBot) inlineReceiveInvoice(ctx context.Context, c *tb.Callback, inl
} }
invoice, err := bot.createInvoiceWithEvent(ctx, inlineReceive.To, inlineReceive.Amount, fmt.Sprintf("Pay to %s", GetUserStr(inlineReceive.To.Telegram)), InvoiceCallbackInlineReceive, inlineReceive.ID) invoice, err := bot.createInvoiceWithEvent(ctx, inlineReceive.To, inlineReceive.Amount, fmt.Sprintf("Pay to %s", GetUserStr(inlineReceive.To.Telegram)), InvoiceCallbackInlineReceive, inlineReceive.ID)
if err != nil { if err != nil {
errmsg := fmt.Sprintf("[/invoice] Could not create an invoice: %s", err) errmsg := fmt.Sprintf("[/invoice] Could not create an invoice: %s", err.Error())
bot.tryEditMessage(inlineReceive.Message, Translate(ctx, "errorTryLaterMessage")) bot.tryEditMessage(inlineReceive.Message, Translate(ctx, "errorTryLaterMessage"))
log.Errorln(errmsg) log.Errorln(errmsg)
return return
@ -275,7 +275,7 @@ func (bot *TipBot) inlineReceiveInvoice(ctx context.Context, c *tb.Callback, inl
// create qr code // create qr code
qr, err := qrcode.Encode(invoice.PaymentRequest, qrcode.Medium, 256) qr, err := qrcode.Encode(invoice.PaymentRequest, qrcode.Medium, 256)
if err != nil { if err != nil {
errmsg := fmt.Sprintf("[/invoice] Failed to create QR code for invoice: %s", err) errmsg := fmt.Sprintf("[/invoice] Failed to create QR code for invoice: %s", err.Error())
bot.tryEditMessage(inlineReceive.Message, Translate(ctx, "errorTryLaterMessage")) bot.tryEditMessage(inlineReceive.Message, Translate(ctx, "errorTryLaterMessage"))
log.Errorln(errmsg) log.Errorln(errmsg)
return return
@ -307,7 +307,7 @@ func (bot *TipBot) finishInlineReceiveHandler(ctx context.Context, c *tb.Callbac
defer mutex.UnlockWithContext(ctx, tx.ID) defer mutex.UnlockWithContext(ctx, tx.ID)
rn, err := tx.Get(tx, bot.Bunt) rn, err := tx.Get(tx, bot.Bunt)
if err != nil { if err != nil {
log.Errorf("[getInlineReceive] %s", err) log.Errorf("[getInlineReceive] %s", err.Error())
return return
} }
inlineReceive := rn.(*InlineReceive) inlineReceive := rn.(*InlineReceive)
@ -345,7 +345,7 @@ func (bot *TipBot) cancelInlineReceiveHandler(ctx context.Context, c *tb.Callbac
// immediatelly set intransaction to block duplicate calls // immediatelly set intransaction to block duplicate calls
rn, err := tx.Get(tx, bot.Bunt) rn, err := tx.Get(tx, bot.Bunt)
if err != nil { if err != nil {
log.Errorf("[cancelInlineReceiveHandler] %s", err) log.Errorf("[cancelInlineReceiveHandler] %s", err.Error())
return return
} }
inlineReceive := rn.(*InlineReceive) inlineReceive := rn.(*InlineReceive)

View file

@ -166,7 +166,7 @@ func (bot *TipBot) acceptInlineSendHandler(ctx context.Context, c *tb.Callback)
sn, err := tx.Get(tx, bot.Bunt) sn, err := tx.Get(tx, bot.Bunt)
// immediatelly set intransaction to block duplicate calls // immediatelly set intransaction to block duplicate calls
if err != nil { if err != nil {
// log.Errorf("[acceptInlineSendHandler] %s", err) // log.Errorf("[acceptInlineSendHandler] %s", err.Error())
return return
} }
inlineSend := sn.(*InlineSend) inlineSend := sn.(*InlineSend)
@ -222,7 +222,7 @@ func (bot *TipBot) acceptInlineSendHandler(ctx context.Context, c *tb.Callback)
t.Memo = transactionMemo t.Memo = transactionMemo
success, err := t.Send() success, err := t.Send()
if !success { if !success {
errMsg := fmt.Sprintf("[sendInline] Transaction failed: %s", err) errMsg := fmt.Sprintf("[sendInline] Transaction failed: %s", err.Error())
log.Errorln(errMsg) log.Errorln(errMsg)
bot.tryEditMessage(c.Message, i18n.Translate(inlineSend.LanguageCode, "inlineSendFailedMessage"), &tb.ReplyMarkup{}) bot.tryEditMessage(c.Message, i18n.Translate(inlineSend.LanguageCode, "inlineSendFailedMessage"), &tb.ReplyMarkup{})
return return
@ -255,7 +255,7 @@ func (bot *TipBot) cancelInlineSendHandler(ctx context.Context, c *tb.Callback)
// immediatelly set intransaction to block duplicate calls // immediatelly set intransaction to block duplicate calls
sn, err := tx.Get(tx, bot.Bunt) sn, err := tx.Get(tx, bot.Bunt)
if err != nil { if err != nil {
log.Errorf("[cancelInlineSendHandler] %s", err) log.Errorf("[cancelInlineSendHandler] %s", err.Error())
return return
} }
inlineSend := sn.(*InlineSend) inlineSend := sn.(*InlineSend)

View file

@ -183,7 +183,7 @@ func (bot TipBot) tipjarHandler(ctx context.Context, m *tb.Message) {
ctx = bot.mapTipjarLanguage(ctx, m.Text) ctx = bot.mapTipjarLanguage(ctx, m.Text)
inlineTipjar, err := bot.makeTipjar(ctx, m, false) inlineTipjar, err := bot.makeTipjar(ctx, m, false)
if err != nil { if err != nil {
log.Errorf("[tipjar] %s", err) log.Errorf("[tipjar] %s", err.Error())
return return
} }
toUserStr := GetUserStr(m.Sender) toUserStr := GetUserStr(m.Sender)
@ -195,7 +195,7 @@ func (bot TipBot) tipjarHandler(ctx context.Context, m *tb.Message) {
func (bot TipBot) handleInlineTipjarQuery(ctx context.Context, q *tb.Query) { func (bot TipBot) handleInlineTipjarQuery(ctx context.Context, q *tb.Query) {
inlineTipjar, err := bot.makeQueryTipjar(ctx, q, false) inlineTipjar, err := bot.makeQueryTipjar(ctx, q, false)
if err != nil { if err != nil {
// log.Errorf("[tipjar] %s", err) // log.Errorf("[tipjar] %s", err.Error())
return return
} }
urls := []string{ urls := []string{
@ -240,7 +240,7 @@ func (bot *TipBot) acceptInlineTipjarHandler(ctx context.Context, c *tb.Callback
defer mutex.UnlockWithContext(ctx, tx.ID) defer mutex.UnlockWithContext(ctx, tx.ID)
fn, err := tx.Get(tx, bot.Bunt) fn, err := tx.Get(tx, bot.Bunt)
if err != nil { if err != nil {
// log.Errorf("[tipjar] %s", err) // log.Errorf("[tipjar] %s", err.Error())
return return
} }
inlineTipjar := fn.(*InlineTipjar) inlineTipjar := fn.(*InlineTipjar)
@ -276,7 +276,7 @@ func (bot *TipBot) acceptInlineTipjarHandler(ctx context.Context, c *tb.Callback
success, err := t.Send() success, err := t.Send()
if !success { if !success {
bot.trySendMessage(from.Telegram, Translate(ctx, "sendErrorMessage")) bot.trySendMessage(from.Telegram, Translate(ctx, "sendErrorMessage"))
errMsg := fmt.Sprintf("[tipjar] Transaction failed: %s", err) errMsg := fmt.Sprintf("[tipjar] Transaction failed: %s", err.Error())
log.Errorln(errMsg) log.Errorln(errMsg)
return return
} }
@ -337,7 +337,7 @@ func (bot *TipBot) cancelInlineTipjarHandler(ctx context.Context, c *tb.Callback
defer mutex.UnlockWithContext(ctx, tx.ID) defer mutex.UnlockWithContext(ctx, tx.ID)
fn, err := tx.Get(tx, bot.Bunt) fn, err := tx.Get(tx, bot.Bunt)
if err != nil { if err != nil {
log.Errorf("[cancelInlineTipjarHandler] %s", err) log.Errorf("[cancelInlineTipjarHandler] %s", err.Error())
return return
} }
inlineTipjar := fn.(*InlineTipjar) inlineTipjar := fn.(*InlineTipjar)

View file

@ -104,7 +104,7 @@ func (bot *TipBot) invoiceHandler(ctx context.Context, m *tb.Message) {
log.Infof("[/invoice] Creating invoice for %s of %d sat.", userStr, amount) log.Infof("[/invoice] Creating invoice for %s of %d sat.", userStr, amount)
invoice, err := bot.createInvoiceWithEvent(ctx, user, amount, memo, InvoiceCallbackGeneric, "") invoice, err := bot.createInvoiceWithEvent(ctx, user, amount, memo, InvoiceCallbackGeneric, "")
if err != nil { if err != nil {
errmsg := fmt.Sprintf("[/invoice] Could not create an invoice: %s", err) errmsg := fmt.Sprintf("[/invoice] Could not create an invoice: %s", err.Error())
bot.tryEditMessage(creatingMsg, Translate(ctx, "errorTryLaterMessage")) bot.tryEditMessage(creatingMsg, Translate(ctx, "errorTryLaterMessage"))
log.Errorln(errmsg) log.Errorln(errmsg)
return return
@ -113,7 +113,7 @@ func (bot *TipBot) invoiceHandler(ctx context.Context, m *tb.Message) {
// create qr code // create qr code
qr, err := qrcode.Encode(invoice.PaymentRequest, qrcode.Medium, 256) qr, err := qrcode.Encode(invoice.PaymentRequest, qrcode.Medium, 256)
if err != nil { if err != nil {
errmsg := fmt.Sprintf("[/invoice] Failed to create QR code for invoice: %s", err) errmsg := fmt.Sprintf("[/invoice] Failed to create QR code for invoice: %s", err.Error())
bot.tryEditMessage(creatingMsg, Translate(ctx, "errorTryLaterMessage")) bot.tryEditMessage(creatingMsg, Translate(ctx, "errorTryLaterMessage"))
log.Errorln(errmsg) log.Errorln(errmsg)
return return
@ -135,7 +135,7 @@ func (bot *TipBot) createInvoiceWithEvent(ctx context.Context, user *lnbits.User
Webhook: internal.Configuration.Lnbits.WebhookServer}, Webhook: internal.Configuration.Lnbits.WebhookServer},
bot.Client) bot.Client)
if err != nil { if err != nil {
errmsg := fmt.Sprintf("[/invoice] Could not create an invoice: %s", err) errmsg := fmt.Sprintf("[/invoice] Could not create an invoice: %s", err.Error())
log.Errorln(errmsg) log.Errorln(errmsg)
return InvoiceEvent{}, err return InvoiceEvent{}, err
} }

View file

@ -40,7 +40,7 @@ func (bot *TipBot) lndhubHandler(ctx context.Context, m *tb.Message) {
// create qr code // create qr code
qr, err := qrcode.Encode(lndhubUrl, qrcode.Medium, 256) qr, err := qrcode.Encode(lndhubUrl, qrcode.Medium, 256)
if err != nil { if err != nil {
errmsg := fmt.Sprintf("[/invoice] Failed to create QR code for invoice: %s", err) errmsg := fmt.Sprintf("[/invoice] Failed to create QR code for invoice: %s", err.Error())
log.Errorln(errmsg) log.Errorln(errmsg)
return return
} }

View file

@ -246,7 +246,7 @@ func (bot *TipBot) confirmWithdrawHandler(ctx context.Context, c *tb.Callback) {
Webhook: internal.Configuration.Lnbits.WebhookServer}, Webhook: internal.Configuration.Lnbits.WebhookServer},
bot.Client) bot.Client)
if err != nil { if err != nil {
errmsg := fmt.Sprintf("[lnurlWithdrawHandlerWithdraw] Could not create an invoice: %s", err) errmsg := fmt.Sprintf("[lnurlWithdrawHandlerWithdraw] Could not create an invoice: %s", err.Error())
log.Errorln(errmsg) log.Errorln(errmsg)
bot.editSingleButton(ctx, c.Message, lnurlWithdrawState.Message, i18n.Translate(lnurlWithdrawState.LanguageCode, "errorTryLaterMessage")) bot.editSingleButton(ctx, c.Message, lnurlWithdrawState.Message, i18n.Translate(lnurlWithdrawState.LanguageCode, "errorTryLaterMessage"))
return return

View file

@ -72,7 +72,8 @@ func (bot *TipBot) lnurlHandler(ctx context.Context, m *tb.Message) {
return return
} }
// assume payment // get rid of the URI prefix
lnurlSplit = strings.TrimPrefix(lnurlSplit, "lightning:")
// HandleLNURL by fiatjaf/go-lnurl // HandleLNURL by fiatjaf/go-lnurl
_, params, err := bot.HandleLNURL(lnurlSplit) _, params, err := bot.HandleLNURL(lnurlSplit)
if err != nil { if err != nil {
@ -140,14 +141,14 @@ func (bot TipBot) lnurlReceiveHandler(ctx context.Context, m *tb.Message) {
fromUser := LoadUser(ctx) fromUser := LoadUser(ctx)
lnurlEncode, err := UserGetLNURL(fromUser) lnurlEncode, err := UserGetLNURL(fromUser)
if err != nil { if err != nil {
errmsg := fmt.Sprintf("[userLnurlHandler] Failed to get LNURL: %s", err) errmsg := fmt.Sprintf("[userLnurlHandler] Failed to get LNURL: %s", err.Error())
log.Errorln(errmsg) log.Errorln(errmsg)
bot.Telegram.Send(m.Sender, Translate(ctx, "lnurlNoUsernameMessage")) bot.Telegram.Send(m.Sender, Translate(ctx, "lnurlNoUsernameMessage"))
} }
// create qr code // create qr code
qr, err := qrcode.Encode(lnurlEncode, qrcode.Medium, 256) qr, err := qrcode.Encode(lnurlEncode, qrcode.Medium, 256)
if err != nil { if err != nil {
errmsg := fmt.Sprintf("[userLnurlHandler] Failed to create QR code for LNURL: %s", err) errmsg := fmt.Sprintf("[userLnurlHandler] Failed to create QR code for LNURL: %s", err.Error())
log.Errorln(errmsg) log.Errorln(errmsg)
return return
} }

View file

@ -63,7 +63,7 @@ func (bot *TipBot) payHandler(ctx context.Context, m *tb.Message) {
if err != nil { if err != nil {
NewMessage(m, WithDuration(0, bot)) NewMessage(m, WithDuration(0, bot))
bot.trySendMessage(m.Sender, helpPayInvoiceUsage(ctx, Translate(ctx, "invalidInvoiceHelpMessage"))) bot.trySendMessage(m.Sender, helpPayInvoiceUsage(ctx, Translate(ctx, "invalidInvoiceHelpMessage")))
errmsg := fmt.Sprintf("[/pay] Error: Could not getArgumentFromCommand: %s", err) errmsg := fmt.Sprintf("[/pay] Error: Could not getArgumentFromCommand: %s", err.Error())
log.Errorln(errmsg) log.Errorln(errmsg)
return return
} }
@ -75,7 +75,7 @@ func (bot *TipBot) payHandler(ctx context.Context, m *tb.Message) {
bolt11, err := decodepay.Decodepay(paymentRequest) bolt11, err := decodepay.Decodepay(paymentRequest)
if err != nil { if err != nil {
bot.trySendMessage(m.Sender, helpPayInvoiceUsage(ctx, Translate(ctx, "invalidInvoiceHelpMessage"))) bot.trySendMessage(m.Sender, helpPayInvoiceUsage(ctx, Translate(ctx, "invalidInvoiceHelpMessage")))
errmsg := fmt.Sprintf("[/pay] Error: Could not decode invoice: %s", err) errmsg := fmt.Sprintf("[/pay] Error: Could not decode invoice: %s", err.Error())
log.Errorln(errmsg) log.Errorln(errmsg)
return return
} }
@ -92,7 +92,7 @@ func (bot *TipBot) payHandler(ctx context.Context, m *tb.Message) {
balance, err := bot.GetUserBalance(user) balance, err := bot.GetUserBalance(user)
if err != nil { if err != nil {
NewMessage(m, WithDuration(0, bot)) NewMessage(m, WithDuration(0, bot))
errmsg := fmt.Sprintf("[/pay] Error: Could not get user balance: %s", err) errmsg := fmt.Sprintf("[/pay] Error: Could not get user balance: %s", err.Error())
log.Errorln(errmsg) log.Errorln(errmsg)
bot.trySendMessage(m.Sender, Translate(ctx, "errorTryLaterMessage")) bot.trySendMessage(m.Sender, Translate(ctx, "errorTryLaterMessage"))
return return
@ -154,7 +154,7 @@ func (bot *TipBot) confirmPayHandler(ctx context.Context, c *tb.Callback) {
sn, err := tx.Get(tx, bot.Bunt) sn, err := tx.Get(tx, bot.Bunt)
// immediatelly set intransaction to block duplicate calls // immediatelly set intransaction to block duplicate calls
if err != nil { if err != nil {
log.Errorf("[confirmPayHandler] %s", err) log.Errorf("[confirmPayHandler] %s", err.Error())
return return
} }
payData := sn.(*PayData) payData := sn.(*PayData)

View file

@ -51,18 +51,18 @@ func (bot *TipBot) photoHandler(ctx context.Context, m *tb.Message) {
// get file reader closer from Telegram api // get file reader closer from Telegram api
reader, err := bot.Telegram.GetFile(m.Photo.MediaFile()) reader, err := bot.Telegram.GetFile(m.Photo.MediaFile())
if err != nil { if err != nil {
log.Errorf("[photoHandler] getfile error: %v\n", err) log.Errorf("[photoHandler] getfile error: %v\n", err.Error())
return return
} }
// decode to jpeg image // decode to jpeg image
img, err := jpeg.Decode(reader) img, err := jpeg.Decode(reader)
if err != nil { if err != nil {
log.Errorf("[photoHandler] image.Decode error: %v\n", err) log.Errorf("[photoHandler] image.Decode error: %v\n", err.Error())
return return
} }
data, err := TryRecognizeQrCode(img) data, err := TryRecognizeQrCode(img)
if err != nil { if err != nil {
log.Errorf("[photoHandler] tryRecognizeQrCodes error: %v\n", err) log.Errorf("[photoHandler] tryRecognizeQrCodes error: %v\n", err.Error())
bot.trySendMessage(m.Sender, Translate(ctx, "photoQrNotRecognizedMessage")) bot.trySendMessage(m.Sender, Translate(ctx, "photoQrNotRecognizedMessage"))
return return
} }

View file

@ -221,7 +221,7 @@ func (bot *TipBot) confirmSendHandler(ctx context.Context, c *tb.Callback) {
defer mutex.UnlockWithContext(ctx, tx.ID) defer mutex.UnlockWithContext(ctx, tx.ID)
sn, err := tx.Get(tx, bot.Bunt) sn, err := tx.Get(tx, bot.Bunt)
if err != nil { if err != nil {
log.Errorf("[acceptSendHandler] %s", err) log.Errorf("[acceptSendHandler] %s", err.Error())
return return
} }
sendData := sn.(*SendData) sendData := sn.(*SendData)
@ -269,7 +269,7 @@ func (bot *TipBot) confirmSendHandler(ctx context.Context, c *tb.Callback) {
success, err := t.Send() success, err := t.Send()
if !success || err != nil { if !success || err != nil {
// bot.trySendMessage(c.Sender, sendErrorMessage) // bot.trySendMessage(c.Sender, sendErrorMessage)
errmsg := fmt.Sprintf("[/send] Error: Transaction failed. %s", err) errmsg := fmt.Sprintf("[/send] Error: Transaction failed. %s", err.Error())
log.Errorln(errmsg) log.Errorln(errmsg)
bot.tryEditMessage(c.Message, i18n.Translate(sendData.LanguageCode, "sendErrorMessage"), &tb.ReplyMarkup{}) bot.tryEditMessage(c.Message, i18n.Translate(sendData.LanguageCode, "sendErrorMessage"), &tb.ReplyMarkup{})
return return
@ -307,7 +307,7 @@ func (bot *TipBot) cancelSendHandler(ctx context.Context, c *tb.Callback) {
defer mutex.UnlockWithContext(ctx, tx.ID) defer mutex.UnlockWithContext(ctx, tx.ID)
sn, err := tx.Get(tx, bot.Bunt) sn, err := tx.Get(tx, bot.Bunt)
if err != nil { if err != nil {
log.Errorf("[acceptSendHandler] %s", err) log.Errorf("[acceptSendHandler] %s", err.Error())
return return
} }

View file

@ -480,7 +480,7 @@ func (bot *TipBot) shopHandler(ctx context.Context, m *tb.Message) {
var err error var err error
shop, err = bot.getShop(ctx, shopID) shop, err = bot.getShop(ctx, shopID)
if err != nil { if err != nil {
log.Errorf("[shopHandler] %s", err) log.Errorf("[shopHandler] %s", err.Error())
return return
} }
} }
@ -511,7 +511,7 @@ func (bot *TipBot) shopNewItemHandler(ctx context.Context, c *tb.Callback) {
user := LoadUser(ctx) user := LoadUser(ctx)
shop, err := bot.getShop(ctx, c.Data) shop, err := bot.getShop(ctx, c.Data)
if err != nil { if err != nil {
log.Errorf("[shopNewItemHandler] %s", err) log.Errorf("[shopNewItemHandler] %s", err.Error())
return return
} }
if shop.Owner.Telegram.ID != c.Sender.ID { if shop.Owner.Telegram.ID != c.Sender.ID {
@ -537,7 +537,7 @@ func (bot *TipBot) shopNewItemHandler(ctx context.Context, c *tb.Callback) {
func (bot *TipBot) addShopItem(ctx context.Context, shopId string) (*Shop, ShopItem, error) { func (bot *TipBot) addShopItem(ctx context.Context, shopId string) (*Shop, ShopItem, error) {
shop, err := bot.getShop(ctx, shopId) shop, err := bot.getShop(ctx, shopId)
if err != nil { if err != nil {
log.Errorf("[addShopItem] %s", err) log.Errorf("[addShopItem] %s", err.Error())
return shop, ShopItem{}, err return shop, ShopItem{}, err
} }
user := LoadUser(ctx) user := LoadUser(ctx)
@ -626,7 +626,7 @@ func (bot *TipBot) shopItemAddItemHandler(ctx context.Context, c *tb.Callback) {
shop, err := bot.getShop(ctx, shopView.ShopID) shop, err := bot.getShop(ctx, shopView.ShopID)
if err != nil { if err != nil {
log.Errorf("[shopNewItemHandler] %s", err) log.Errorf("[shopNewItemHandler] %s", err.Error())
return return
} }
@ -656,7 +656,7 @@ func (bot *TipBot) addItemFileHandler(ctx context.Context, m *tb.Message) {
shop, err := bot.getShop(ctx, shopView.ShopID) shop, err := bot.getShop(ctx, shopView.ShopID)
if err != nil { if err != nil {
log.Errorf("[shopNewItemHandler] %s", err) log.Errorf("[shopNewItemHandler] %s", err.Error())
return return
} }
@ -746,7 +746,7 @@ func (bot *TipBot) shopGetItemFilesHandler(ctx context.Context, c *tb.Callback)
} }
shop, err := bot.getShop(ctx, shopView.ShopID) shop, err := bot.getShop(ctx, shopView.ShopID)
if err != nil { if err != nil {
log.Errorf("[shopNewItemHandler] %s", err) log.Errorf("[shopNewItemHandler] %s", err.Error())
return return
} }
itemID := c.Data itemID := c.Data
@ -784,7 +784,7 @@ func (bot *TipBot) shopConfirmBuyHandler(ctx context.Context, c *tb.Callback) {
} }
shop, err := bot.getShop(ctx, shopView.ShopID) shop, err := bot.getShop(ctx, shopView.ShopID)
if err != nil { if err != nil {
log.Errorf("[shopConfirmBuyHandler] %s", err) log.Errorf("[shopConfirmBuyHandler] %s", err.Error())
return return
} }
itemID := c.Data itemID := c.Data
@ -812,7 +812,7 @@ func (bot *TipBot) shopConfirmBuyHandler(ctx context.Context, c *tb.Callback) {
success, err := t.Send() success, err := t.Send()
if !success || err != nil { if !success || err != nil {
// bot.trySendMessage(c.Sender, sendErrorMessage) // bot.trySendMessage(c.Sender, sendErrorMessage)
errmsg := fmt.Sprintf("[shop] Error: Transaction failed. %s", err) errmsg := fmt.Sprintf("[shop] Error: Transaction failed. %s", err.Error())
log.Errorln(errmsg) log.Errorln(errmsg)
bot.trySendMessage(user.Telegram, i18n.Translate(user.Telegram.LanguageCode, "sendErrorMessage"), &tb.ReplyMarkup{}) bot.trySendMessage(user.Telegram, i18n.Translate(user.Telegram.LanguageCode, "sendErrorMessage"), &tb.ReplyMarkup{})
return return
@ -841,7 +841,7 @@ func (bot *TipBot) shopSendItemFilesToUser(ctx context.Context, toUser *lnbits.U
} }
shop, err := bot.getShop(ctx, shopView.ShopID) shop, err := bot.getShop(ctx, shopView.ShopID)
if err != nil { if err != nil {
log.Errorf("[shopNewItemHandler] %s", err) log.Errorf("[shopNewItemHandler] %s", err.Error())
return return
} }
item := shop.Items[itemID] item := shop.Items[itemID]
@ -958,7 +958,7 @@ func (bot *TipBot) shopsHandler(ctx context.Context, m *tb.Message) {
if err != nil && user.Telegram.ID == shopOwner.Telegram.ID { if err != nil && user.Telegram.ID == shopOwner.Telegram.ID {
shops, err = bot.initUserShops(ctx, user) shops, err = bot.initUserShops(ctx, user)
if err != nil { if err != nil {
log.Errorf("[shopsHandler] %s", err) log.Errorf("[shopsHandler] %s", err.Error())
return return
} }
} }
@ -973,7 +973,7 @@ func (bot *TipBot) shopsHandler(ctx context.Context, m *tb.Message) {
for _, shopId := range shops.Shops { for _, shopId := range shops.Shops {
shop, err := bot.getShop(ctx, shopId) shop, err := bot.getShop(ctx, shopId)
if err != nil { if err != nil {
log.Errorf("[shopsHandler] %s", err) log.Errorf("[shopsHandler] %s", err.Error())
return return
} }
shopTitles += fmt.Sprintf("\n· %s (%d items)", str.MarkdownEscape(shop.Title), len(shop.Items)) shopTitles += fmt.Sprintf("\n· %s (%d items)", str.MarkdownEscape(shop.Title), len(shop.Items))
@ -1140,7 +1140,7 @@ func (bot *TipBot) shopsDescriptionHandler(ctx context.Context, c *tb.Callback)
user := LoadUser(ctx) user := LoadUser(ctx)
shops, err := bot.getUserShops(ctx, user) shops, err := bot.getUserShops(ctx, user)
if err != nil { if err != nil {
log.Errorf("[shopsDescriptionHandler] %s", err) log.Errorf("[shopsDescriptionHandler] %s", err.Error())
return return
} }
SetUserState(user, bot, lnbits.UserEnterShopsDescription, shops.ID) SetUserState(user, bot, lnbits.UserEnterShopsDescription, shops.ID)
@ -1152,7 +1152,7 @@ func (bot *TipBot) enterShopsDescriptionHandler(ctx context.Context, m *tb.Messa
user := LoadUser(ctx) user := LoadUser(ctx)
shops, err := bot.getUserShops(ctx, user) shops, err := bot.getUserShops(ctx, user)
if err != nil { if err != nil {
log.Errorf("[enterShopsDescriptionHandler] %s", err) log.Errorf("[enterShopsDescriptionHandler] %s", err.Error())
return return
} }
if shops.Owner.Telegram.ID != m.Sender.ID { if shops.Owner.Telegram.ID != m.Sender.ID {
@ -1189,7 +1189,7 @@ func (bot *TipBot) shopsResetHandler(ctx context.Context, c *tb.Callback) {
user := LoadUser(ctx) user := LoadUser(ctx)
shops, err := bot.getUserShops(ctx, user) shops, err := bot.getUserShops(ctx, user)
if err != nil { if err != nil {
log.Errorf("[shopsResetHandler] %s", err) log.Errorf("[shopsResetHandler] %s", err.Error())
return return
} }
if shops.Owner.Telegram.ID != c.Sender.ID { if shops.Owner.Telegram.ID != c.Sender.ID {
@ -1312,7 +1312,7 @@ func (bot *TipBot) shopNewShopHandler(ctx context.Context, c *tb.Callback) {
user := LoadUser(ctx) user := LoadUser(ctx)
shops, err := bot.getUserShops(ctx, user) shops, err := bot.getUserShops(ctx, user)
if err != nil { if err != nil {
log.Errorf("[shopNewShopHandler] %s", err) log.Errorf("[shopNewShopHandler] %s", err.Error())
return return
} }
if len(shops.Shops) >= shops.MaxShops { if len(shops.Shops) >= shops.MaxShops {

View file

@ -285,7 +285,7 @@ func (bot *TipBot) getShop(ctx context.Context, shopId string) (*Shop, error) {
// immediatelly set intransaction to block duplicate calls // immediatelly set intransaction to block duplicate calls
sn, err := tx.Get(tx, bot.ShopBunt) sn, err := tx.Get(tx, bot.ShopBunt)
if err != nil { if err != nil {
log.Errorf("[getShop] %s", err) log.Errorf("[getShop] %s", err.Error())
return &Shop{}, err return &Shop{}, err
} }
shop := sn.(*Shop) shop := sn.(*Shop)

View file

@ -85,7 +85,7 @@ func (bot TipBot) createWallet(user *lnbits.User) error {
internal.Configuration.Lnbits.AdminId, internal.Configuration.Lnbits.AdminId,
UserStr) UserStr)
if err != nil { if err != nil {
errormsg := fmt.Sprintf("[createWallet] Create wallet error: %s", err) errormsg := fmt.Sprintf("[createWallet] Create wallet error: %s", err.Error())
log.Errorln(errormsg) log.Errorln(errormsg)
return err return err
} }
@ -94,7 +94,7 @@ func (bot TipBot) createWallet(user *lnbits.User) error {
user.Name = u.Name user.Name = u.Name
wallet, err := bot.Client.Wallets(*user) wallet, err := bot.Client.Wallets(*user)
if err != nil { if err != nil {
errormsg := fmt.Sprintf("[createWallet] Get wallet error: %s", err) errormsg := fmt.Sprintf("[createWallet] Get wallet error: %s", err.Error())
log.Errorln(errormsg) log.Errorln(errormsg)
return err return err
} }
@ -104,7 +104,7 @@ func (bot TipBot) createWallet(user *lnbits.User) error {
user.CreatedAt = time.Now() user.CreatedAt = time.Now()
err = UpdateUserRecord(user, bot) err = UpdateUserRecord(user, bot)
if err != nil { if err != nil {
errormsg := fmt.Sprintf("[createWallet] Update user record error: %s", err) errormsg := fmt.Sprintf("[createWallet] Update user record error: %s", err.Error())
log.Errorln(errormsg) log.Errorln(errormsg)
return err return err
} }

View file

@ -110,7 +110,7 @@ func (bot *TipBot) tipHandler(ctx context.Context, m *tb.Message) {
if !success { if !success {
NewMessage(m, WithDuration(0, bot)) NewMessage(m, WithDuration(0, bot))
bot.trySendMessage(m.Sender, fmt.Sprintf("%s %s", Translate(ctx, "tipErrorMessage"), err)) bot.trySendMessage(m.Sender, fmt.Sprintf("%s %s", Translate(ctx, "tipErrorMessage"), err))
errMsg := fmt.Sprintf("[/tip] Transaction failed: %s", err) errMsg := fmt.Sprintf("[/tip] Transaction failed: %s", err.Error())
log.Warnln(errMsg) log.Warnln(errMsg)
return return
} }

View file

@ -21,7 +21,7 @@ func IsInvoice(message string) bool {
func IsLnurl(message string) bool { func IsLnurl(message string) bool {
message = strings.ToLower(message) message = strings.ToLower(message)
if strings.HasPrefix(message, "lnurl") { if strings.HasPrefix(message, "lnurl") || strings.HasPrefix(message, "lightning:lnurl") {
// string must be a single word // string must be a single word
if !strings.Contains(message, " ") { if !strings.Contains(message, " ") {
return true return true