Files
YaeMikoBot/database/users.go
2025-08-27 23:26:36 +03:00

94 lines
1.9 KiB
Go

package database
import (
"database/sql"
"errors"
"math"
"time"
"github.com/shopspring/decimal"
"gorm.io/gorm"
)
type User struct {
ID int
TelegramID int `gorm:"column:tg_id"`
Balance decimal.Decimal
Name string
GroupID int
Group *Group
Level int
WorkID int
Work *Work
WorkTime time.Time
Exp int
AutoID int
Auto *ShopAuto
BusinessID int
Business *ShopBusiness
MaidID int
Maid *ShopMaid
MinerID int
Miner *ShopMiner
IncomeTime time.Time
BTC decimal.Decimal
Invested decimal.Decimal
PairID int
Pair *User
Greeting string
Donat int
FractionID sql.NullInt64
Fraction *Fraction
MoneyIncome decimal.Decimal
ExpIncome int
BtcIncome decimal.Decimal
WaifuSearchTime time.Time
}
func GetOrCreateUser(tgId int, name string) (*User, error) {
user, err := GetUser(tgId)
if errors.Is(err, gorm.ErrRecordNotFound) {
user, err = CreateUser(tgId, name)
}
return user, err
}
func CreateUser(tgId int, name string) (*User, error) {
user := &User{
TelegramID: tgId,
Name: name,
}
tx := Database.Create(user)
return user, tx.Error
}
func GetUser(telegramId int) (*User, error) {
user := new(User)
tx := Database.Joins("Group").Joins("Work").Joins("Auto").Joins("Business").Joins("Maid").Joins("Miner").Joins("Fraction").Preload("Pair").Take(user, "tg_id=?", telegramId)
return user, tx.Error
}
func GetAllUsers() ([]*User, error) {
users := make([]*User, 0)
tx := Database.Joins("Group").Joins("Work").Joins("Auto").Joins("Business").Joins("Maid").Joins("Miner").Joins("Fraction").Preload("Pair").Find(&users)
return users, tx.Error
}
func CountLevel(userXp int) (int, int) {
xp := 0
nextLevel := 2
for {
xp = int(math.Pow(float64(nextLevel), 3)) * (nextLevel * 3)
if xp > userXp {
break
}
if nextLevel == 200 {
break
}
nextLevel++
}
return nextLevel - 1, xp
}