mirror of
https://github.com/ChuckNorrison/LightningTipBot.git
synced 2026-08-16 13:00:52 +02:00
134 lines
3.5 KiB
Go
134 lines
3.5 KiB
Go
package telegram
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/LightningTipBot/LightningTipBot/internal/lnbits"
|
|
"github.com/eko/gocache/store"
|
|
log "github.com/sirupsen/logrus"
|
|
tb "gopkg.in/lightningtipbot/telebot.v3"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func SetUserState(user *lnbits.User, bot *TipBot, stateKey lnbits.UserStateKey, stateData string) {
|
|
user.StateKey = stateKey
|
|
user.StateData = stateData
|
|
UpdateUserRecord(user, *bot)
|
|
|
|
}
|
|
|
|
func ResetUserState(user *lnbits.User, bot *TipBot) {
|
|
user.ResetState()
|
|
UpdateUserRecord(user, *bot)
|
|
}
|
|
func GetUserStr(user *tb.User) string {
|
|
return lnbits.User{Telegram: user}.GetUserStr()
|
|
}
|
|
|
|
func GetUserStrMd(user *tb.User) string {
|
|
return lnbits.User{Telegram: user}.GetUserStrMd()
|
|
}
|
|
func appendUinqueUsersToSlice(slice []*tb.User, i *tb.User) []*tb.User {
|
|
for _, ele := range slice {
|
|
if ele.ID == i.ID {
|
|
return slice
|
|
}
|
|
}
|
|
return append(slice, i)
|
|
}
|
|
|
|
func (bot *TipBot) GetUserBalanceCached(user *lnbits.User) (amount int64, err error) {
|
|
u, err := bot.Cache.Get(fmt.Sprintf("%s_balance", user.Name))
|
|
if err != nil {
|
|
return bot.GetUserBalance(user)
|
|
}
|
|
cachedBalance := u.(int64)
|
|
return cachedBalance, nil
|
|
}
|
|
|
|
func (bot *TipBot) GetUserBalance(user *lnbits.User) (amount int64, err error) {
|
|
if user.Wallet == nil {
|
|
return 0, errors.New("User has no wallet")
|
|
}
|
|
|
|
wallet, err := bot.Client.Info(*user.Wallet)
|
|
if err != nil {
|
|
return
|
|
}
|
|
user.Wallet.Balance = wallet.Balance
|
|
err = UpdateUserRecord(user, *bot)
|
|
if err != nil {
|
|
return
|
|
}
|
|
// msat to sat
|
|
amount = int64(wallet.Balance) / 1000
|
|
log.WithFields(log.Fields{
|
|
"module": "telegram",
|
|
"func": "GetUserBalance",
|
|
"user": GetUserStr(user.Telegram),
|
|
"user_id": user.ID,
|
|
"wallet_id": user.Wallet.ID,
|
|
"telegram_id": user.Telegram.ID,
|
|
"amount": amount},
|
|
).Debugf("updated user balance")
|
|
|
|
// update user balance in cache
|
|
bot.Cache.Set(
|
|
fmt.Sprintf("%s_balance", user.Name),
|
|
amount,
|
|
&store.Options{Expiration: 1 * time.Hour},
|
|
)
|
|
return amount, nil
|
|
}
|
|
|
|
func (bot *TipBot) CreateWalletForTelegramUser(tbUser *tb.User) (*lnbits.User, error) {
|
|
// failsafe: do not create wallet for existing user
|
|
if _, exists := bot.UserExists(tbUser); exists {
|
|
return nil, fmt.Errorf("user already exists")
|
|
}
|
|
user := &lnbits.User{Telegram: tbUser}
|
|
userStr := GetUserStr(tbUser)
|
|
log.Printf("[CreateWalletForTelegramUser] Creating wallet for user %s ... ", userStr)
|
|
err := bot.createWallet(user)
|
|
if err != nil {
|
|
return user, err
|
|
}
|
|
// todo: remove this. we're doing this already in bot.createWallet().
|
|
err = UpdateUserRecord(user, *bot)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
log.WithFields(log.Fields{
|
|
"module": "telegram",
|
|
"func": "CreateWalletForTelegramUser",
|
|
"user": GetUserStr(user.Telegram),
|
|
"user_id": user.ID,
|
|
"wallet_id": user.Wallet.ID,
|
|
"error": err.Error()},
|
|
).Printf("Wallet created")
|
|
return user, nil
|
|
}
|
|
|
|
func (bot *TipBot) UserExists(user *tb.User) (*lnbits.User, bool) {
|
|
lnbitUser, err := GetUser(user, *bot)
|
|
if err != nil || errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, false
|
|
}
|
|
return lnbitUser, true
|
|
}
|
|
|
|
func (bot *TipBot) UserIsBanned(user *lnbits.User) bool {
|
|
// do not respond to banned users
|
|
if user.Wallet == nil {
|
|
log.Tracef("[UserIsBanned] User %s has no wallet.\n", GetUserStr(user.Telegram))
|
|
return false
|
|
}
|
|
if strings.HasPrefix(user.Wallet.Adminkey, "banned") || strings.Contains(user.Wallet.Adminkey, "_") {
|
|
log.Debugf("[UserIsBanned] User %s is banned. Not responding.", GetUserStr(user.Telegram))
|
|
return true
|
|
}
|
|
return false
|
|
}
|