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 }