db.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package main
  2. import (
  3. "log"
  4. "strings"
  5. "time"
  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. BBSName string
  29. BBSNick string
  30. Name string `gorm:"unique,collate:nocase"`
  31. Faction *Faction `gorm:"-"`
  32. FactionId uint64
  33. FactionSO bool
  34. FactionO bool
  35. X uint64
  36. Y uint64
  37. World uint32
  38. Health uint32
  39. MaxHealth uint32
  40. Magic uint32
  41. MaxMagic uint32
  42. Class uint8
  43. Level uint32
  44. Xp uint64
  45. Weapon uint8
  46. WeaponEnchant uint8
  47. Armor uint8
  48. ArmorEnchant uint8
  49. RangedWeapon uint8
  50. RangedWeaponEnchant uint8
  51. Shield uint8
  52. Ring uint8
  53. Amulet uint8
  54. Gold uint64
  55. GoldBanked uint64
  56. GemRed uint32
  57. GemGreen uint32
  58. GemBlue uint32
  59. }
  60. func (u *UserDB) FindUser(name string) *User {
  61. parts := strings.Split(name, "@")
  62. var usr *User
  63. result := u.DB.First(&usr, &User{BBSName: parts[1], BBSNick: parts[0]})
  64. if result.Error != nil {
  65. log.Printf("UserDB.FindUser(name='%s') > %v", name, result.Error)
  66. return nil
  67. }
  68. // Hot load the users faction if they are in one
  69. if usr != nil && usr.FactionId != 0 {
  70. fac := u.FindFactionById(usr.FactionId)
  71. if fac != nil {
  72. usr.Faction = fac
  73. }
  74. }
  75. return usr
  76. }
  77. func (u *UserDB) SaveUser(usr *User) error {
  78. result := u.DB.Save(usr)
  79. return result.Error
  80. }
  81. type Faction struct {
  82. Model
  83. Name string `gorm:"unique,collate:nocase"`
  84. Description string
  85. LeaderId uint64 `gorm:"unique"`
  86. Gold uint64
  87. GemRed uint32
  88. GemGreen uint32
  89. GemBlue uint32
  90. }
  91. func (u *UserDB) FindFactionByName(name string) *Faction {
  92. var fac *Faction
  93. result := u.DB.First(&fac, &Faction{Name: name})
  94. if result.Error != nil {
  95. log.Printf("UserDB.FindFactionByName(name='%s') > %v", name, result.Error)
  96. return nil
  97. }
  98. return fac
  99. }
  100. func (u *UserDB) FindFactionById(id uint64) *Faction {
  101. var fac *Faction
  102. result := u.DB.First(&fac, id)
  103. if result.Error != nil {
  104. log.Printf("UserDB.FindFactionById(id=%d) > %v", id, result.Error)
  105. return nil
  106. }
  107. return fac
  108. }
  109. func (u *UserDB) SaveFaction(fac *Faction) error {
  110. result := u.DB.Save(fac)
  111. return result.Error
  112. }