123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- package main
- import (
- "log"
- "time"
- "golang.org/x/crypto/bcrypt"
- "gorm.io/driver/sqlite"
- "gorm.io/gorm"
- )
- type UserDB struct {
- DB *gorm.DB
- }
- type Model struct {
- Id uint64 `gorm:"primaryKey"`
- CreatedAt time.Time
- UpdatedAt time.Time
- }
- func (u *UserDB) Open(filename string) error {
- var err error
- u.DB, err = gorm.Open(sqlite.Open(filename), &gorm.Config{})
- if err != nil {
- return err
- }
- err = u.DB.AutoMigrate(&User{}, &Faction{})
- return err
- }
- type User struct {
- Model
- Name string `gorm:"uniqueIndex,collate:no_case"`
- Password string // bcrypt
- Faction *Faction `gorm:"-"` // Hot loaded in memory
- FactionId uint64
- FactionSO bool // Faction.Senior_Officer
- FactionO bool // Faction.Officer
- X uint64
- Y uint64
- World uint32
- Health uint32
- MaxHealth uint32
- Magic uint32
- MaxMagic uint32
- Class uint8 // 1=Knight (Cyan), 2=Thief (Brown), 3=Cleric (Green), 4=Wizard (Magenta), 5=Ranger (Red)
- Level uint32
- Xp uint64
- Weapon uint8
- WeaponEnchant uint8
- Armor uint8
- ArmorEnchant uint8
- RangedWeapon uint8
- RangedWeaponEnchant uint8
- Shield uint8
- Ring uint8
- Amulet uint8
- Gold uint64
- GoldBanked uint64
- GemRed uint32
- GemGreen uint32
- GemBlue uint32
- }
- func (u *UserDB) FindUserByName(name string) *User {
- var usr *User
- result := u.DB.First(&usr, &User{Name: name})
- if result.Error != nil {
- log.Printf("UserDB.FindUser(name='%s') > %v", name, result.Error)
- return nil
- }
- // Hot load the users faction if they are in one
- if usr != nil && usr.FactionId != 0 {
- fac := u.FindFactionById(usr.FactionId)
- if fac != nil {
- usr.Faction = fac
- }
- }
- return usr
- }
- func (u *User) SetPassword(password string) error {
- hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
- if err != nil {
- return err
- }
- u.Password = string(hash)
- return nil
- }
- func (u *User) VerifyPassword(password string) error {
- return bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password))
- }
- func (u *User) PasswordCost() int {
- cost, err := bcrypt.Cost([]byte(u.Password))
- if err != nil {
- log.Printf("User.PasswordCost() > %v", err)
- return -1
- }
- return cost
- }
- func (u *UserDB) SaveUser(usr *User) error {
- result := u.DB.Save(usr)
- return result.Error
- }
- type Faction struct {
- Model
- Name string `gorm:"unique,collate:nocase"`
- Description string
- LeaderId uint64 `gorm:"unique"`
- Gold uint64
- GemRed uint32
- GemGreen uint32
- GemBlue uint32
- }
- func (u *UserDB) FindFactionByName(name string) *Faction {
- var fac *Faction
- result := u.DB.First(&fac, &Faction{Name: name})
- if result.Error != nil {
- log.Printf("UserDB.FindFactionByName(name='%s') > %v", name, result.Error)
- return nil
- }
- return fac
- }
- func (u *UserDB) FindFactionById(id uint64) *Faction {
- var fac *Faction
- result := u.DB.First(&fac, id)
- if result.Error != nil {
- log.Printf("UserDB.FindFactionById(id=%d) > %v", id, result.Error)
- return nil
- }
- return fac
- }
- func (u *UserDB) SaveFaction(fac *Faction) error {
- result := u.DB.Save(fac)
- return result.Error
- }
|