db.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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 uint8 // 1=Knight (Cyan), 2=Thief (Brown), 3=Cleric (Green), 4=Wizard (Magenta), 5=Ranger (Red)
  42. Level uint32
  43. Xp uint64
  44. Weapon uint8
  45. WeaponEnchant uint8
  46. Armor uint8
  47. ArmorEnchant uint8
  48. RangedWeapon uint8
  49. RangedWeaponEnchant uint8
  50. Shield uint8
  51. Ring uint8
  52. Amulet uint8
  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 *User) SetPassword(password string) error {
  76. hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
  77. if err != nil {
  78. return err
  79. }
  80. u.Password = string(hash)
  81. return nil
  82. }
  83. func (u *User) VerifyPassword(password string) error {
  84. return bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password))
  85. }
  86. func (u *User) PasswordCost() int {
  87. cost, err := bcrypt.Cost([]byte(u.Password))
  88. if err != nil {
  89. log.Printf("User.PasswordCost() > %v", err)
  90. return -1
  91. }
  92. return cost
  93. }
  94. func (u *UserDB) SaveUser(usr *User) error {
  95. result := u.DB.Save(usr)
  96. return result.Error
  97. }
  98. type Faction struct {
  99. Model
  100. Name string `gorm:"unique,collate:nocase"`
  101. Description string
  102. LeaderId uint64 `gorm:"unique"`
  103. Gold uint64
  104. GemRed uint32
  105. GemGreen uint32
  106. GemBlue uint32
  107. }
  108. func (u *UserDB) FindFactionByName(name string) *Faction {
  109. var fac *Faction
  110. result := u.DB.First(&fac, &Faction{Name: name})
  111. if result.Error != nil {
  112. log.Printf("UserDB.FindFactionByName(name='%s') > %v", name, result.Error)
  113. return nil
  114. }
  115. return fac
  116. }
  117. func (u *UserDB) FindFactionById(id uint64) *Faction {
  118. var fac *Faction
  119. result := u.DB.First(&fac, id)
  120. if result.Error != nil {
  121. log.Printf("UserDB.FindFactionById(id=%d) > %v", id, result.Error)
  122. return nil
  123. }
  124. return fac
  125. }
  126. func (u *UserDB) SaveFaction(fac *Faction) error {
  127. result := u.DB.Save(fac)
  128. return result.Error
  129. }