db.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package main
  2. import (
  3. "log"
  4. "time"
  5. "golang.org/x/crypto/bcrypt"
  6. "gorm.io/driver/sqlite"
  7. "gorm.io/gorm"
  8. )
  9. type UserDB struct {
  10. DB *gorm.DB
  11. }
  12. type Model struct {
  13. Id uint64 `gorm:"primaryKey"`
  14. CreatedAt time.Time
  15. UpdatedAt time.Time
  16. }
  17. func (u *UserDB) Open(filename string) error {
  18. var err error
  19. u.DB, err = gorm.Open(sqlite.Open(filename), &gorm.Config{})
  20. if err != nil {
  21. return err
  22. }
  23. err = u.DB.AutoMigrate(&User{}, &Faction{})
  24. return err
  25. }
  26. type User struct {
  27. Model
  28. Name string `gorm:"uniqueIndex,collate:no_case"`
  29. Password string // bcrypt
  30. Faction *Faction `gorm:"-"` // Hot loaded in memory
  31. FactionId uint64
  32. FactionSO bool // Faction.Senior_Officer
  33. FactionO bool // Faction.Officer
  34. Pos *Vec2 `gorm:"embedded"`
  35. World uint32
  36. Health uint32
  37. MaxHealth uint32
  38. Magic uint32
  39. MaxMagic uint32
  40. Class Class // K T C W R
  41. Level uint32
  42. Xp uint64
  43. Weapon Weapon
  44. WeaponEnchant WeaponEnchant
  45. Armor Armor
  46. ArmorEnchant ArmorEnchant
  47. RangedWeapon RangedWeapon
  48. RangedWeaponEnchant RangedWeaponEnchant
  49. Shield Shield
  50. Ring Ring
  51. Amulet Amulet
  52. Gold uint64
  53. GoldBanked uint64
  54. GemRed uint32
  55. GemGreen uint32
  56. GemBlue uint32
  57. }
  58. func (u *UserDB) FindUserByName(name string) *User {
  59. var usr *User
  60. result := u.DB.First(&usr, &User{Name: name})
  61. if result.Error != nil {
  62. log.Printf("UserDB.FindUser(name='%s') > %v", name, result.Error)
  63. return nil
  64. }
  65. // Hot load the users faction if they are in one
  66. if usr != nil && usr.FactionId != 0 {
  67. fac := u.FindFactionById(usr.FactionId)
  68. if fac != nil {
  69. usr.Faction = fac
  70. }
  71. }
  72. return usr
  73. }
  74. func (u *UserDB) FindUserById(id uint64) *User {
  75. var usr *User
  76. result := u.DB.First(&usr, id)
  77. if result.Error != nil {
  78. log.Printf("UserDB.FindUser(id=%d) > %v", id, result.Error)
  79. return nil
  80. }
  81. // Hot load the users faction if they are in one
  82. if usr != nil && usr.FactionId != 0 {
  83. fac := u.FindFactionById(usr.FactionId)
  84. if fac != nil {
  85. usr.Faction = fac
  86. }
  87. }
  88. return usr
  89. }
  90. func (u *User) SetPassword(password string) error {
  91. hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
  92. if err != nil {
  93. return err
  94. }
  95. u.Password = string(hash)
  96. return nil
  97. }
  98. func (u *User) VerifyPassword(password string) error {
  99. return bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password))
  100. }
  101. func (u *User) PasswordCost() int {
  102. cost, err := bcrypt.Cost([]byte(u.Password))
  103. if err != nil {
  104. log.Printf("User.PasswordCost() > %v", err)
  105. return -1
  106. }
  107. return cost
  108. }
  109. func (u *UserDB) SaveUser(usr *User) error {
  110. result := u.DB.Save(usr)
  111. return result.Error
  112. }
  113. type Faction struct {
  114. Model
  115. Name string `gorm:"unique,collate:no_case"`
  116. Description string
  117. LeaderId uint64 `gorm:"unique"`
  118. Gold uint64
  119. GemRed uint32
  120. GemGreen uint32
  121. GemBlue uint32
  122. }
  123. func (u *UserDB) FindFactionByName(name string) *Faction {
  124. var fac *Faction
  125. result := u.DB.First(&fac, &Faction{Name: name})
  126. if result.Error != nil {
  127. log.Printf("UserDB.FindFactionByName(name='%s') > %v", name, result.Error)
  128. return nil
  129. }
  130. return fac
  131. }
  132. func (u *UserDB) FindFactionById(id uint64) *Faction {
  133. var fac *Faction
  134. result := u.DB.First(&fac, id)
  135. if result.Error != nil {
  136. log.Printf("UserDB.FindFactionById(id=%d) > %v", id, result.Error)
  137. return nil
  138. }
  139. return fac
  140. }
  141. func (u *UserDB) FindFactionByLeaderId(leader_id uint64) *Faction {
  142. var fac *Faction
  143. result := u.DB.First(&fac, &Faction{LeaderId: leader_id})
  144. if result.Error != nil {
  145. log.Printf("UserDB.FindFactionByLeaderId(leader_id=%d) > %v", leader_id, result.Error)
  146. return nil
  147. }
  148. return fac
  149. }
  150. func (u *UserDB) SaveFaction(fac *Faction) error {
  151. result := u.DB.Save(fac)
  152. return result.Error
  153. }