db.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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. X uint64
  35. Y uint64
  36. World uint32
  37. Health uint32
  38. MaxHealth uint32
  39. Magic uint32
  40. MaxMagic uint32
  41. Class Class // K T C W R
  42. Level uint32
  43. Xp uint64
  44. Weapon Weapon
  45. WeaponEnchant WeaponEnchant
  46. Armor Armor
  47. ArmorEnchant ArmorEnchant
  48. RangedWeapon RangedWeapon
  49. RangedWeaponEnchant RangedWeaponEnchant
  50. Shield Shield
  51. Ring Ring
  52. Amulet Amulet
  53. Gold uint64
  54. GoldBanked uint64
  55. GemRed uint32
  56. GemGreen uint32
  57. GemBlue uint32
  58. }
  59. func (u *UserDB) FindUserByName(name string) *User {
  60. var usr *User
  61. result := u.DB.First(&usr, &User{Name: name})
  62. if result.Error != nil {
  63. log.Printf("UserDB.FindUser(name='%s') > %v", name, result.Error)
  64. return nil
  65. }
  66. // Hot load the users faction if they are in one
  67. if usr != nil && usr.FactionId != 0 {
  68. fac := u.FindFactionById(usr.FactionId)
  69. if fac != nil {
  70. usr.Faction = fac
  71. }
  72. }
  73. return usr
  74. }
  75. func (u *UserDB) FindUserById(id uint64) *User {
  76. var usr *User
  77. result := u.DB.First(&usr, id)
  78. if result.Error != nil {
  79. log.Printf("UserDB.FindUser(id=%d) > %v", id, result.Error)
  80. return nil
  81. }
  82. // Hot load the users faction if they are in one
  83. if usr != nil && usr.FactionId != 0 {
  84. fac := u.FindFactionById(usr.FactionId)
  85. if fac != nil {
  86. usr.Faction = fac
  87. }
  88. }
  89. return usr
  90. }
  91. func (u *User) SetPassword(password string) error {
  92. hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
  93. if err != nil {
  94. return err
  95. }
  96. u.Password = string(hash)
  97. return nil
  98. }
  99. func (u *User) VerifyPassword(password string) error {
  100. return bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password))
  101. }
  102. func (u *User) PasswordCost() int {
  103. cost, err := bcrypt.Cost([]byte(u.Password))
  104. if err != nil {
  105. log.Printf("User.PasswordCost() > %v", err)
  106. return -1
  107. }
  108. return cost
  109. }
  110. func (u *UserDB) SaveUser(usr *User) error {
  111. result := u.DB.Save(usr)
  112. return result.Error
  113. }
  114. type Faction struct {
  115. Model
  116. Name string `gorm:"unique,collate:no_case"`
  117. Description string
  118. LeaderId uint64 `gorm:"unique"`
  119. Gold uint64
  120. GemRed uint32
  121. GemGreen uint32
  122. GemBlue uint32
  123. }
  124. func (u *UserDB) FindFactionByName(name string) *Faction {
  125. var fac *Faction
  126. result := u.DB.First(&fac, &Faction{Name: name})
  127. if result.Error != nil {
  128. log.Printf("UserDB.FindFactionByName(name='%s') > %v", name, result.Error)
  129. return nil
  130. }
  131. return fac
  132. }
  133. func (u *UserDB) FindFactionById(id uint64) *Faction {
  134. var fac *Faction
  135. result := u.DB.First(&fac, id)
  136. if result.Error != nil {
  137. log.Printf("UserDB.FindFactionById(id=%d) > %v", id, result.Error)
  138. return nil
  139. }
  140. return fac
  141. }
  142. func (u *UserDB) FindFactionByLeaderId(leader_id uint64) *Faction {
  143. var fac *Faction
  144. result := u.DB.First(&fac, &Faction{LeaderId: leader_id})
  145. if result.Error != nil {
  146. log.Printf("UserDB.FindFactionByLeaderId(leader_id=%d) > %v", leader_id, result.Error)
  147. return nil
  148. }
  149. return fac
  150. }
  151. func (u *UserDB) SaveFaction(fac *Faction) error {
  152. result := u.DB.Save(fac)
  153. return result.Error
  154. }