manager.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. package novicewelfare
  2. import (
  3. "bet24.com/log"
  4. pb "bet24.com/servers/micros/activityservice/proto"
  5. item "bet24.com/servers/micros/item_inventory/proto"
  6. task "bet24.com/servers/micros/task/proto"
  7. "encoding/json"
  8. "strconv"
  9. "sync"
  10. "time"
  11. )
  12. var mgr *novicewelfareMgr
  13. func getManager() *novicewelfareMgr {
  14. if mgr == nil {
  15. mgr = newNoviceWelfareMgr()
  16. }
  17. return mgr
  18. }
  19. type novicewelfareMgr struct {
  20. lock *sync.RWMutex
  21. sysData pb.NoviceWelfare // 系统新手福利
  22. userList map[int]*userTask // 用户的任务列表
  23. }
  24. func newNoviceWelfareMgr() *novicewelfareMgr {
  25. mgr = new(novicewelfareMgr)
  26. mgr.lock = &sync.RWMutex{}
  27. mgr.userList = make(map[int]*userTask)
  28. mgr.loadConfig()
  29. mgr.doCheck()
  30. return mgr
  31. }
  32. // 轮询
  33. func (nw *novicewelfareMgr) doCheck() {
  34. ticker := time.NewTicker(1 * time.Minute)
  35. go func(t *time.Ticker) {
  36. for {
  37. select {
  38. case <-t.C:
  39. nw.checkUserExpire()
  40. }
  41. }
  42. }(ticker)
  43. }
  44. // 检查用户过期
  45. func (nw *novicewelfareMgr) checkUserExpire() {
  46. var toRemove []int
  47. nw.lock.RLock()
  48. // 遍历所有用户
  49. for _, u := range nw.userList {
  50. // 判断是否过期
  51. if !u.isExpire() {
  52. continue
  53. }
  54. toRemove = append(toRemove, u.userId)
  55. u.destructor()
  56. }
  57. nw.lock.RUnlock()
  58. if len(toRemove) == 0 {
  59. return
  60. }
  61. // 删除
  62. log.Debug("novicewelfareMgr.checkUserExpire 清理用户%v", toRemove)
  63. nw.lock.Lock()
  64. for _, v := range toRemove {
  65. delete(nw.userList, v)
  66. }
  67. nw.lock.Unlock()
  68. }
  69. // 获取系统新手福利
  70. func (nw *novicewelfareMgr) getSysNoviceWelfare() pb.NoviceWelfare {
  71. return nw.sysData
  72. }
  73. // 获取活动时长
  74. func (nw *novicewelfareMgr) getActivityDuration() int {
  75. return nw.sysData.DurationDay
  76. }
  77. // 获取大礼包
  78. func (nw *novicewelfareMgr) getGiftPacks() []item.ItemPack {
  79. return nw.sysData.Prizes
  80. }
  81. // 获取系统新手任务
  82. func (nw *novicewelfareMgr) getSysNoviceTasks() []*pb.NoviceTask {
  83. return nw.sysData.Tasks
  84. }
  85. // 获取新手任务的配置
  86. func (nw *novicewelfareMgr) getNoviceTaskConfig(dayIndex int) *pb.NoviceTask {
  87. for k, v := range nw.sysData.Tasks {
  88. if dayIndex == v.DayIndex {
  89. return nw.sysData.Tasks[k]
  90. }
  91. }
  92. return nil
  93. }
  94. // 用户进入
  95. func (nw *novicewelfareMgr) onUserEnter(userId int) {
  96. nw.lock.RLock()
  97. u, ok := nw.userList[userId]
  98. nw.lock.RUnlock()
  99. if ok {
  100. return
  101. }
  102. u = newUserTask(userId)
  103. nw.lock.Lock()
  104. nw.userList[userId] = u
  105. nw.lock.Unlock()
  106. }
  107. // 用户退出
  108. func (nw *novicewelfareMgr) onUserExit(userId int) {
  109. }
  110. // 获取用户任务
  111. func (nw *novicewelfareMgr) getUserTask(userId int) *userTask {
  112. nw.lock.RLock()
  113. u, ok := nw.userList[userId]
  114. nw.lock.RUnlock()
  115. if ok {
  116. u.updateTimeStamp()
  117. return u
  118. }
  119. u = newUserTask(userId)
  120. nw.lock.Lock()
  121. nw.userList[userId] = u
  122. nw.lock.Unlock()
  123. return u
  124. }
  125. // 获取用户新手福利
  126. func (nw *novicewelfareMgr) getUserNoviceWelfare(userId int) pb.UserNoviceWelfare {
  127. u := nw.getUserTask(userId)
  128. return u.getUserNoviceWelfare()
  129. }
  130. // 领取新手福利奖励
  131. func (nw *novicewelfareMgr) claimNoviceWelfareAward(userId, dayIndex int, isFinalPackage bool) bool {
  132. u := nw.getUserTask(userId)
  133. return u.claimNoviceWelfareAward(dayIndex, isFinalPackage)
  134. }
  135. // 是否新手福利提醒
  136. func (nw *novicewelfareMgr) isNoviceWelfareTip(userId int) bool {
  137. u := nw.getUserTask(userId)
  138. return u.isNoviceWelfareTip()
  139. }
  140. // 用户动作
  141. func (nw *novicewelfareMgr) doAction(userId, action int, progress int, param task.TaskScope) {
  142. u := nw.getUserTask(userId)
  143. u.doAction(action, progress, param)
  144. return
  145. }
  146. // 打印 系统列表
  147. func (nw *novicewelfareMgr) dumpSys() {
  148. log.Release("-------------------------------")
  149. log.Release("novicewelfareMgr.dumpSys")
  150. defer func() {
  151. log.Release("+++++++++++++++++++++++++++++++")
  152. log.Release("")
  153. }()
  154. d, _ := json.Marshal(nw.sysData)
  155. log.Release(string(d))
  156. }
  157. // 打印用户
  158. func (nw *novicewelfareMgr) dumpUser(param string) {
  159. log.Release("-------------------------------")
  160. log.Release("novicewelfareMgr.dumpUser %s", param)
  161. defer func() {
  162. log.Release("+++++++++++++++++++++++++++++++")
  163. log.Release("")
  164. }()
  165. if param == "" {
  166. nw.lock.RLock()
  167. log.Release(" Total User Count:%d", len(nw.userList))
  168. nw.lock.RUnlock()
  169. return
  170. }
  171. var userId int
  172. var err error
  173. if userId, err = strconv.Atoi(param); err != nil {
  174. log.Release("atoi error %v", err)
  175. return
  176. }
  177. nw.lock.RLock()
  178. u, ok := nw.userList[userId]
  179. nw.lock.RUnlock()
  180. if !ok {
  181. log.Release("User does not exist!")
  182. return
  183. }
  184. u.dump()
  185. }