|
@@ -0,0 +1,124 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "log"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+
|
|
|
+ "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
|
|
|
+ BBSName string
|
|
|
+ BBSNick string
|
|
|
+ Name string `gorm:"unique,collate:nocase"`
|
|
|
+ Faction *Faction `gorm:"-"`
|
|
|
+ FactionId uint64
|
|
|
+ FactionSO bool
|
|
|
+ FactionO bool
|
|
|
+ X uint64
|
|
|
+ Y uint64
|
|
|
+ World uint32
|
|
|
+ Health uint32
|
|
|
+ MaxHealth uint32
|
|
|
+ Magic uint32
|
|
|
+ MaxMagic uint32
|
|
|
+ Class uint8
|
|
|
+ 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) FindUser(name string) *User {
|
|
|
+ parts := strings.Split(name, "@")
|
|
|
+ var usr *User
|
|
|
+ result := u.DB.First(&usr, &User{BBSName: parts[1], BBSNick: parts[0]})
|
|
|
+ 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 *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
|
|
|
+}
|