102 lines
2.2 KiB
Go
102 lines
2.2 KiB
Go
package psql
|
|
|
|
import (
|
|
"database/sql"
|
|
"errors"
|
|
"kurumibot/database"
|
|
"log"
|
|
"math"
|
|
"time"
|
|
|
|
"github.com/shopspring/decimal"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type User struct {
|
|
ID int
|
|
Balance decimal.Decimal
|
|
Name string
|
|
GroupID int `gorm:"default:1"`
|
|
Group *Group
|
|
Level int `gorm:"default:1"`
|
|
Exp int `gorm:"default:0"`
|
|
WorkID int `gorm:"default:1"`
|
|
Work *Work
|
|
WorkTime time.Time
|
|
|
|
AutoID sql.NullInt64
|
|
Auto *ShopAuto
|
|
BusinessID sql.NullInt64
|
|
Business *ShopBusiness
|
|
MaidID sql.NullInt64
|
|
Maid *ShopMaid
|
|
MinerID sql.NullInt64
|
|
Miner *ShopMiner
|
|
|
|
IncomeTime time.Time
|
|
BTC decimal.Decimal
|
|
Invested decimal.Decimal
|
|
PairID sql.NullInt64
|
|
Pair *User
|
|
Greeting string `gorm:"size:255,default:Привет"`
|
|
Donat int `gorm:"default:0"`
|
|
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)
|
|
log.Println(errors.Is(err, gorm.ErrRecordNotFound))
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
_, err = CreateUser(tgId, name)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return GetUser(tgId)
|
|
}
|
|
return user, err
|
|
}
|
|
|
|
func CreateUser(id int, name string) (*User, error) {
|
|
user := &User{
|
|
ID: id,
|
|
Name: name,
|
|
}
|
|
tx := database.PostgresDatabase.Create(user)
|
|
return user, tx.Error
|
|
}
|
|
|
|
func GetUser(telegramId int) (*User, error) {
|
|
user := new(User)
|
|
tx := database.PostgresDatabase.Joins("Group").Joins("Work").Joins("Auto").Joins("Business").Joins("Maid").Joins("Miner").Joins("Fraction").Preload("Pair").Take(user, "users.id=?", telegramId)
|
|
return user, tx.Error
|
|
}
|
|
|
|
func GetAllUsers() ([]*User, error) {
|
|
users := make([]*User, 0)
|
|
tx := database.PostgresDatabase.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
|
|
}
|