manager.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. package levelrewards
  2. import (
  3. "encoding/json"
  4. "os"
  5. "strconv"
  6. "sync"
  7. "time"
  8. "bet24.com/log"
  9. coreClient "bet24.com/servers/coreservice/client"
  10. "bet24.com/servers/coreservice/shop"
  11. pb "bet24.com/servers/micros/activityservice/proto"
  12. item "bet24.com/servers/micros/item_inventory/proto"
  13. platformconfig "bet24.com/servers/micros/platformconfig/proto"
  14. )
  15. var mgr *levelrewardsMgr
  16. const config_key = "activity_levelrewards"
  17. func getManager() *levelrewardsMgr {
  18. if mgr == nil {
  19. mgr = new(levelrewardsMgr)
  20. mgr.ctor()
  21. }
  22. return mgr
  23. }
  24. type levelrewardsMgr struct {
  25. configString string
  26. lock *sync.RWMutex
  27. userList map[int]*userTask
  28. pb.LevelRewards
  29. }
  30. func (lvr *levelrewardsMgr) ctor() {
  31. lvr.lock = &sync.RWMutex{}
  32. lvr.userList = make(map[int]*userTask)
  33. lvr.readConf()
  34. lvr.checkExpiredUsers()
  35. }
  36. func (lvr *levelrewardsMgr) readConf() {
  37. time.AfterFunc(time.Second*600, lvr.readConf)
  38. configString := platformconfig.GetConfig(config_key)
  39. //if configString == "" {
  40. data, err := os.ReadFile("serviceconf/activity_levelrewards.json")
  41. if err != nil {
  42. log.Release("levelrewards.readConf read config failed")
  43. return
  44. }
  45. configString = string(data)
  46. if configString != "" {
  47. platformconfig.SetConfig(config_key, configString)
  48. }
  49. //}
  50. if configString == lvr.configString {
  51. return
  52. }
  53. lvr.configString = configString
  54. // 读取配置
  55. err = json.Unmarshal([]byte(configString), &lvr.LevelRewards)
  56. if err != nil {
  57. log.Release("levelrewards.readConf Unmarshal failed %s", configString)
  58. }
  59. lvr.loadProductItem()
  60. }
  61. func (lvr *levelrewardsMgr) checkExpiredUsers() {
  62. time.AfterFunc(time.Second*600, lvr.checkExpiredUsers)
  63. var toRemove []int
  64. lvr.lock.RLock()
  65. for k, v := range lvr.userList {
  66. if v.isExpire() {
  67. toRemove = append(toRemove, k)
  68. }
  69. }
  70. lvr.lock.RUnlock()
  71. if len(toRemove) == 0 {
  72. return
  73. }
  74. log.Debug("levelrewards.checkExpiredUsers removing %v", toRemove)
  75. lvr.lock.Lock()
  76. for _, v := range toRemove {
  77. delete(lvr.userList, v)
  78. }
  79. lvr.lock.Unlock()
  80. }
  81. // 加载产品道具
  82. func (lvr *levelrewardsMgr) loadProductItem() {
  83. respProduct := coreClient.GetProduct(0, 0, lvr.LevelRewards.ProductPrice.ProductId)
  84. if respProduct.RetCode != 1 {
  85. return
  86. }
  87. var itemInfo shop.Shop_Item
  88. if err := json.Unmarshal([]byte(respProduct.Data), &itemInfo); err != nil {
  89. log.Error("%s GetProduct json unmarshal err %v", "userTask.loadProductItem", err)
  90. return
  91. }
  92. lvr.LevelRewards.ProductPrice.Price = itemInfo.Price
  93. lvr.LevelRewards.ProductPrice.Items = itemInfo.Extra
  94. }
  95. func (lvr *levelrewardsMgr) dumpSys() {
  96. log.Release("-------------------------------")
  97. log.Release("levelrewards.dumpSys")
  98. defer func() {
  99. log.Release("+++++++++++++++++++++++++++++++")
  100. log.Release("")
  101. }()
  102. d, _ := json.Marshal(lvr.LevelRewards)
  103. log.Release(string(d))
  104. return
  105. }
  106. func (lvr *levelrewardsMgr) dumpUser(param string) {
  107. log.Release("-------------------------------")
  108. log.Release("levelrewards.dumpUser %s", param)
  109. defer func() {
  110. log.Release("+++++++++++++++++++++++++++++++")
  111. log.Release("")
  112. }()
  113. if param == "" {
  114. lvr.lock.RLock()
  115. log.Release(" Total User Count:%d", len(lvr.userList))
  116. lvr.lock.RUnlock()
  117. return
  118. }
  119. var userId int
  120. var err error
  121. if userId, err = strconv.Atoi(param); err != nil {
  122. log.Release("atoi error %v", err)
  123. return
  124. }
  125. lvr.lock.RLock()
  126. u, ok := lvr.userList[userId]
  127. lvr.lock.RUnlock()
  128. if !ok {
  129. log.Release("User does not exist!")
  130. return
  131. }
  132. u.dump()
  133. }
  134. func (lvr *levelrewardsMgr) clear(userId int) {
  135. lvr.lock.Lock()
  136. defer lvr.lock.Unlock()
  137. delete(lvr.userList, userId)
  138. }
  139. func (lvr *levelrewardsMgr) getSysLevelRewards() pb.LevelRewards {
  140. return lvr.LevelRewards
  141. }
  142. func (lvr *levelrewardsMgr) getSysTask(level int) pb.LevelTask {
  143. for k, v := range lvr.LevelRewards.Tasks {
  144. if v.Level == level {
  145. return lvr.LevelRewards.Tasks[k]
  146. }
  147. }
  148. return pb.LevelTask{}
  149. }
  150. func (lvr *levelrewardsMgr) getSysTaskLevel(level int) int {
  151. var sysLevel int
  152. for _, v := range lvr.LevelRewards.Tasks {
  153. if level < v.Level {
  154. continue
  155. }
  156. sysLevel = v.Level
  157. }
  158. return sysLevel
  159. }
  160. func (lvr *levelrewardsMgr) getUserTask(userId int) *userTask {
  161. lvr.lock.RLock()
  162. u, ok := lvr.userList[userId]
  163. lvr.lock.RUnlock()
  164. if ok {
  165. u.updateTimeStamp()
  166. return u
  167. }
  168. u = newUserTask(userId)
  169. lvr.lock.Lock()
  170. lvr.userList[userId] = u
  171. lvr.lock.Unlock()
  172. return u
  173. }
  174. func (lvr *levelrewardsMgr) getLevelRewards(userId int) string {
  175. u := lvr.getUserTask(userId)
  176. ret := u.getLevelRewards()
  177. jsonRet, _ := json.Marshal(ret)
  178. return string(jsonRet)
  179. }
  180. func (lvr *levelrewardsMgr) claimLevelRewards(userId, level int, isAll bool) (bool, []item.ItemPack) {
  181. u := lvr.getUserTask(userId)
  182. return u.claimLevelRewards(level, isAll)
  183. }
  184. func (lvr *levelrewardsMgr) isLevelRewardsTip(userId int) bool {
  185. u := lvr.getUserTask(userId)
  186. return u.isLevelRewardsTip()
  187. }
  188. func (lvr *levelrewardsMgr) onUserLevelChange(userId, oldLevel, newLevel int) {
  189. u := lvr.getUserTask(userId)
  190. u.onUserLevelChange(oldLevel, newLevel)
  191. return
  192. }