manager.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. package handler
  2. import (
  3. "encoding/json"
  4. "os"
  5. "strconv"
  6. "sync"
  7. "time"
  8. "bet24.com/log"
  9. "bet24.com/servers/common"
  10. pb "bet24.com/servers/micros/badge/proto"
  11. platformconfig "bet24.com/servers/micros/platformconfig/proto"
  12. )
  13. const config_key = "badge_config"
  14. var mgr *badgeMgr
  15. type badgeMgr struct {
  16. lock *sync.RWMutex // 锁
  17. sysList []*pb.Badge // 系统徽章列表
  18. userList map[int]*userInfo // 用户徽章列表
  19. lastConfigString string
  20. }
  21. func newBadgeMgr() {
  22. mgr = new(badgeMgr)
  23. mgr.lock = &sync.RWMutex{}
  24. mgr.userList = make(map[int]*userInfo)
  25. mgr.loadSysBadgeList()
  26. mgr.doCheck()
  27. return
  28. }
  29. // 加载系统徽章
  30. func (b *badgeMgr) loadSysBadgeList() {
  31. go time.AfterFunc(10*time.Minute, mgr.loadSysBadgeList)
  32. configString := platformconfig.GetConfig(config_key)
  33. if configString == "" {
  34. data, err := os.ReadFile("serviceconf/badge_config.json")
  35. if err != nil {
  36. log.Release("read config failed serviceconf/badge_config.json %v", err)
  37. return
  38. }
  39. configString = string(data)
  40. platformconfig.SetConfig(config_key, configString)
  41. }
  42. if configString == b.lastConfigString {
  43. return
  44. }
  45. b.lastConfigString = configString
  46. err := json.Unmarshal([]byte(configString), &b.sysList)
  47. if err != nil {
  48. log.Release("badgeMgr.loadSysBadgeList Unmarshal config [%s] err:%v", configString, err)
  49. return
  50. }
  51. // 刷新榜单数据
  52. transRefreshRankData()
  53. return
  54. }
  55. // 轮询
  56. func (b *badgeMgr) doCheck() {
  57. ticker := time.NewTicker(1 * time.Minute)
  58. go func(t *time.Ticker) {
  59. for {
  60. select {
  61. case <-t.C:
  62. b.checkUserExpire()
  63. }
  64. }
  65. }(ticker)
  66. }
  67. // 检查用户过期
  68. func (b *badgeMgr) checkUserExpire() {
  69. var toRemove []int
  70. b.lock.RLock()
  71. // 遍历所有用户
  72. for _, v := range b.userList {
  73. // 判断是否过期
  74. if !v.isExpire() {
  75. continue
  76. }
  77. toRemove = append(toRemove, v.userId)
  78. v.destructor()
  79. }
  80. b.lock.RUnlock()
  81. if len(toRemove) == 0 {
  82. return
  83. }
  84. b.lock.Lock()
  85. defer b.lock.Unlock()
  86. for _, u := range toRemove {
  87. // 删除
  88. delete(b.userList, u)
  89. log.Debug("badgeMgr.checkUserExpire userId=%d 已完成清理", u)
  90. }
  91. return
  92. }
  93. // 获取系统成就的徽章列表
  94. func (b *badgeMgr) getSysBadgeList() string {
  95. d, _ := json.Marshal(b.sysList)
  96. return string(d)
  97. }
  98. // 获取用户
  99. func (b *badgeMgr) getUser(userId int) *userInfo {
  100. b.lock.RLock()
  101. u, ok := b.userList[userId]
  102. b.lock.RUnlock()
  103. if ok {
  104. u.updateTimeStamp()
  105. return u
  106. }
  107. u = newUserInfo(userId)
  108. b.lock.Lock()
  109. b.userList[userId] = u
  110. b.lock.Unlock()
  111. return u
  112. }
  113. // 获取系统成就的徽章信息
  114. func (b *badgeMgr) getSysBadgeInfo(badgeId int) *pb.Badge {
  115. for k, v := range b.sysList {
  116. if v.BadgeId == badgeId {
  117. return b.sysList[k]
  118. }
  119. }
  120. return nil
  121. }
  122. // 获取用户徽章列表
  123. func (b *badgeMgr) getUserBadgeList(userId int) string {
  124. u := b.getUser(userId)
  125. if u == nil {
  126. log.Debug("badgeMgr.getUserBadgeInfo userId=%d not exist", userId)
  127. return ""
  128. }
  129. list := u.getUserBadgeList()
  130. d, _ := json.Marshal(list)
  131. return string(d)
  132. }
  133. // 获取用户佩戴与展示的徽章
  134. func (b *badgeMgr) getBadgeWearAndShow(userId int) []pb.BadgePosition {
  135. u := b.getUser(userId)
  136. if u == nil {
  137. log.Debug("badgeMgr.getBadgeWearAndShow userId=%d not exist", userId)
  138. return []pb.BadgePosition{}
  139. }
  140. return u.getBadgeWearAndShow()
  141. }
  142. // 佩戴成就徽章
  143. func (b *badgeMgr) wearBadge(userId, badgeId, position int) string {
  144. u := b.getUser(userId)
  145. if u == nil {
  146. log.Debug("badgeMgr.wearBadge userId=%d not exist", userId)
  147. return ""
  148. }
  149. list := u.wearBadge(badgeId, position)
  150. d, _ := json.Marshal(list)
  151. return string(d)
  152. }
  153. // 触发动作(徽章进度)
  154. func (b *badgeMgr) doAction(userId, action, progress int, param pb.Scope) {
  155. u := b.getUser(userId)
  156. if u == nil {
  157. log.Debug("badgeMgr.doAction userId=%d not exist", userId)
  158. return
  159. }
  160. u.doAction(action, progress, param)
  161. return
  162. }
  163. // 打印用户
  164. func (b *badgeMgr) dumpUser(param1 string) {
  165. log.Release("-------------------------------")
  166. log.Release("badgeMgr.dumpSys success")
  167. defer func() {
  168. log.Release("+++++++++++++++++++++++++++++++")
  169. log.Release("")
  170. }()
  171. if param1 == "" {
  172. b.lock.RLock()
  173. log.Release(" Total User Count:%d", len(b.userList))
  174. b.lock.RUnlock()
  175. return
  176. }
  177. var userId int
  178. var err error
  179. if param1 != "" {
  180. userId, err = strconv.Atoi(param1)
  181. if err != nil {
  182. log.Release("badgeMgr.dumpUser Parameter invalid. param1[%s]", param1)
  183. return
  184. }
  185. }
  186. v := b.getUser(userId)
  187. if v == nil {
  188. log.Release("badgeMgr.dumpUser user[%d] not exist", userId)
  189. return
  190. }
  191. log.Release("当前用户ID:%d", v.userId)
  192. for _, info := range v.badgeList {
  193. log.Release("徽章id:%d", info.BadgeId)
  194. log.Release("徽章等级:%d", info.Level)
  195. log.Release("经验值:%d", info.Exps)
  196. log.Release("成就点数:%d", info.Points)
  197. log.Release("领取次数:%d", info.Times)
  198. log.Release("当前位置:%d", info.Position)
  199. log.Release("是否能佩戴:%v", info.Wearable)
  200. if info.ExpiresTime > 0 {
  201. log.Release("过期时间:%s", common.TimeStampToString(int64(info.ExpiresTime)))
  202. }
  203. for k, t := range info.UnlockTime {
  204. log.Release(" 等级[%d],解锁时间:%s", k+1, common.TimeStampToString(int64(t)))
  205. }
  206. log.Release("")
  207. }
  208. }
  209. // 打印系统徽章
  210. func (b *badgeMgr) dumpSys() {
  211. log.Release("-------------------------------")
  212. log.Release("badgeMgr.dumpSys success")
  213. defer func() {
  214. log.Release("+++++++++++++++++++++++++++++++")
  215. log.Release("")
  216. }()
  217. sysList := b.getSysBadgeList()
  218. log.Release(sysList)
  219. }