usermanager.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package battlepass
  2. import (
  3. "bet24.com/log"
  4. "bet24.com/redis"
  5. "encoding/json"
  6. "sync"
  7. )
  8. type usermanager struct {
  9. Users map[int]*user
  10. SeasonId int
  11. lock *sync.RWMutex
  12. }
  13. func newUserManager() *usermanager {
  14. ret := new(usermanager)
  15. ret.ctor()
  16. return ret
  17. }
  18. func (um *usermanager) ctor() {
  19. log.Debug("battlepass.usermanager.ctor")
  20. um.Users = make(map[int]*user)
  21. um.lock = &sync.RWMutex{}
  22. // 从redis中读取
  23. data, ok := redis.String_Get(um.getRedisKey())
  24. if data != "" && ok {
  25. err := json.Unmarshal([]byte(data), &um)
  26. if err != nil {
  27. log.Release("battlepass.usermanager.initData Unmarshal failed %v[%s]", err, data)
  28. }
  29. }
  30. // 是否已失效
  31. s := mgr.sm.getValidSeason()
  32. if s == nil || s.SeasonId != um.SeasonId {
  33. um.clear()
  34. }
  35. if s != nil {
  36. um.SeasonId = s.SeasonId
  37. }
  38. }
  39. func (um *usermanager) onUserEnter(userId int) {
  40. um.lock.RLock()
  41. u, ok := um.Users[userId]
  42. um.lock.RUnlock()
  43. if ok {
  44. u.isOnline = true
  45. return
  46. }
  47. um.lock.Lock()
  48. um.Users[userId] = newUser(userId)
  49. um.lock.Unlock()
  50. }
  51. func (um *usermanager) onUserExit(userId int) {
  52. u := um.getUser(userId)
  53. if u == nil {
  54. return
  55. }
  56. u.isOnline = false
  57. }
  58. func (um *usermanager) getUser(userId int) *user {
  59. um.lock.RLock()
  60. u, ok := um.Users[userId]
  61. um.lock.RUnlock()
  62. if !ok {
  63. return nil
  64. }
  65. return u
  66. }
  67. func (um *usermanager) getUserGrowthTerms(userId int) []*UserGrowthTerm {
  68. u := um.getUser(userId)
  69. if u == nil {
  70. log.Debug("usermanager.getUserGrowthTerms userId[%d] not exist", userId)
  71. return []*UserGrowthTerm{}
  72. }
  73. return u.Terms
  74. }
  75. func (um *usermanager) buyGrowthPack(userId int, productId string) (int, string) {
  76. pack := mgr.getGrowthPackByProduct(productId)
  77. if pack == nil {
  78. log.Debug("battlepass_usermanager.buyGrowthPack userId[%d] productId[%s] invalid", userId, productId)
  79. return 0, "invalid package ID"
  80. }
  81. u := um.getUser(userId)
  82. if u == nil {
  83. um.onUserEnter(userId)
  84. u = um.getUser(userId)
  85. }
  86. userTerms := u.Terms
  87. for _, v := range userTerms {
  88. if v.GrowthPackId == pack.Id {
  89. log.Debug("battlepass_usermanager.buyGrowthPack userId[%d] packId[%d] perchased", userId, pack.Id)
  90. return 0, "already bought"
  91. }
  92. }
  93. for _, v := range pack.Terms {
  94. u.addTerm(&UserGrowthTerm{
  95. UserId: userId,
  96. GrowthPackId: pack.Id,
  97. TermIndex: v.TermIndex,
  98. Status: GrowthTermStatus_none,
  99. NeedExp: v.NeedExp,
  100. })
  101. }
  102. return 1, "success"
  103. }
  104. func (um *usermanager) userAwardTerm(userId int, growthPackId, index int) (bool, string) {
  105. u := um.getUser(userId)
  106. if u == nil {
  107. return false, "user not exist"
  108. }
  109. return u.rewardTerm(growthPackId, index)
  110. }
  111. func (um *usermanager) clear() {
  112. um.SeasonId = 0
  113. var toRemove []int
  114. um.lock.RLock()
  115. for k, v := range um.Users {
  116. if !v.isOnline {
  117. toRemove = append(toRemove, k)
  118. continue
  119. }
  120. v.initData()
  121. }
  122. um.lock.RUnlock()
  123. um.lock.Lock()
  124. for _, v := range toRemove {
  125. delete(um.Users, v)
  126. }
  127. um.lock.Unlock()
  128. um.flush()
  129. }
  130. func (um *usermanager) flush() {
  131. um.lock.RLock()
  132. d, _ := json.Marshal(um)
  133. um.lock.RUnlock()
  134. redis.String_Set(um.getRedisKey(), string(d))
  135. }
  136. func (um *usermanager) getRedisKey() string {
  137. return "battlepass:usermanager"
  138. }
  139. func (um *usermanager) addExp(userId int, exp int) {
  140. if um.SeasonId == 0 {
  141. return
  142. }
  143. u := um.getUser(userId)
  144. if u == nil {
  145. um.onUserEnter(userId)
  146. u = um.getUser(userId)
  147. }
  148. u.addExp(exp)
  149. }