taskmgr.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. package handler
  2. import (
  3. "bet24.com/log"
  4. "bet24.com/servers/common"
  5. activityservice "bet24.com/servers/micros/activityservice/proto"
  6. badge "bet24.com/servers/micros/badge/proto"
  7. item "bet24.com/servers/micros/item_inventory/proto"
  8. pb "bet24.com/servers/micros/task/proto"
  9. "encoding/json"
  10. "strconv"
  11. "sync"
  12. "time"
  13. )
  14. type taskmgr struct {
  15. sys_lock *sync.RWMutex
  16. user_lock *sync.RWMutex
  17. sys_tasklist map[int]*pb.Task
  18. user_tasklist map[int]*user_task
  19. lastConfig string
  20. }
  21. func newTaskMgr() *taskmgr {
  22. ret := new(taskmgr)
  23. ret.sys_lock = &sync.RWMutex{}
  24. ret.user_lock = &sync.RWMutex{}
  25. ret.sys_tasklist = make(map[int]*pb.Task)
  26. ret.user_tasklist = make(map[int]*user_task)
  27. ret.loadSysTaskList()
  28. ret.checkDayRefresh()
  29. return ret
  30. }
  31. func (tm *taskmgr) checkDayRefresh() {
  32. ticker := time.NewTicker(10 * time.Minute)
  33. go func(t *time.Ticker) {
  34. lastCheck := common.GetTimeStamp()
  35. for { //循环
  36. select {
  37. case <-t.C:
  38. now := common.GetTimeStamp()
  39. if !common.IsSameDay(lastCheck, now) {
  40. tm.refreshUsers()
  41. }
  42. lastCheck = now
  43. }
  44. }
  45. }(ticker)
  46. }
  47. func (tm *taskmgr) refreshUsers() {
  48. var userIds []int
  49. tm.user_lock.RLock()
  50. for k := range tm.user_tasklist {
  51. userIds = append(userIds, k)
  52. }
  53. tm.user_lock.RUnlock()
  54. for _, v := range userIds {
  55. tm.onUserExit(v)
  56. tm.onUserEnter(v)
  57. }
  58. }
  59. func (tm *taskmgr) loadSysTaskList() {
  60. // if tm.loadSysTaskFromJson() {
  61. // return
  62. // }
  63. tasks := getSysTaskList()
  64. tm.sys_lock.Lock()
  65. defer tm.sys_lock.Unlock()
  66. tm.sys_tasklist = tasks
  67. }
  68. func (tm *taskmgr) onUserEnter(userId int) {
  69. tm.user_lock.RLock()
  70. _, ok := tm.user_tasklist[userId]
  71. tm.user_lock.RUnlock()
  72. if ok {
  73. return
  74. }
  75. tm.user_lock.Lock()
  76. tm.user_tasklist[userId] = newUserTask(userId)
  77. tm.user_lock.Unlock()
  78. }
  79. func (tm *taskmgr) onUserExit(userId int) {
  80. tm.user_lock.Lock()
  81. defer tm.user_lock.Unlock()
  82. delete(tm.user_tasklist, userId)
  83. }
  84. func (tm *taskmgr) getSysTask(taskId int) *pb.Task {
  85. tm.sys_lock.RLock()
  86. defer tm.sys_lock.RUnlock()
  87. ret, ok := tm.sys_tasklist[taskId]
  88. if !ok {
  89. log.Debug("taskmgr.getSysTask taskId[%d] not found", taskId)
  90. return nil
  91. }
  92. return ret
  93. }
  94. func (tm *taskmgr) getNextTasks(taskId int) []*pb.Task {
  95. tm.sys_lock.RLock()
  96. defer tm.sys_lock.RUnlock()
  97. var ret []*pb.Task
  98. for _, v := range tm.sys_tasklist {
  99. if v.PreTask == taskId && v.IsOpen() {
  100. ret = append(ret, v)
  101. }
  102. }
  103. return ret
  104. }
  105. func (tm *taskmgr) getSysTaskList() map[int]*pb.Task {
  106. tm.sys_lock.RLock()
  107. defer tm.sys_lock.RUnlock()
  108. return tm.sys_tasklist
  109. }
  110. func (tm *taskmgr) getUserTasks(userId int) []*pb.UserTask {
  111. tm.user_lock.RLock()
  112. defer tm.user_lock.RUnlock()
  113. var ret []*pb.UserTask
  114. ut, ok := tm.user_tasklist[userId]
  115. if !ok {
  116. return ret
  117. }
  118. ret = ut.getTaskList()
  119. return ret
  120. }
  121. func (tm *taskmgr) getUserTask(userId int) *user_task {
  122. tm.user_lock.RLock()
  123. ut, ok := tm.user_tasklist[userId]
  124. if ok {
  125. tm.user_lock.RUnlock()
  126. return ut
  127. }
  128. tm.user_lock.RUnlock()
  129. ut = newUserTask(userId)
  130. tm.user_lock.Lock()
  131. tm.user_tasklist[userId] = ut
  132. tm.user_lock.Unlock()
  133. return ut
  134. }
  135. func (tm *taskmgr) doTaskAction(userId int, action, progress int, param pb.TaskScope) (bool, int) {
  136. go activityservice.DoAction(userId, action, progress, param)
  137. go badge.DoAction(userId, action, progress, badge.Scope{GameName: param.GameName, RankCrdate: param.RankCrdate})
  138. ut := tm.getUserTask(userId)
  139. return ut.doTaskAction(action, progress, param)
  140. }
  141. func (tm *taskmgr) isActionTaskActive(userId int, action int, param pb.TaskScope) bool {
  142. ut := tm.getUserTask(userId)
  143. return ut.isActionTaskActive(action, param)
  144. }
  145. func (tm *taskmgr) removeTaskByAction(userId int, action int, param pb.TaskScope) {
  146. ut := tm.getUserTask(userId)
  147. ut.removeTaskByAction(action, param)
  148. }
  149. // 刷新任务
  150. func (tm *taskmgr) refreshTask(userId int) {
  151. ut := tm.getUserTask(userId)
  152. ut.loadUserTask()
  153. }
  154. func (tm *taskmgr) dumpSys(param string) {
  155. log.Release("-------------------------------")
  156. log.Release("taskmgr.dumpSys %s", param)
  157. defer func() {
  158. log.Release("+++++++++++++++++++++++++++++++")
  159. log.Release("")
  160. }()
  161. tm.sys_lock.RLock()
  162. defer tm.sys_lock.RUnlock()
  163. if param != "" {
  164. d, _ := json.Marshal(tm.sys_tasklist)
  165. log.Release(string(d))
  166. } else {
  167. for _, v := range tm.sys_tasklist {
  168. log.Release("%d:Scn[%d]Title[%s]Act[%d]Trg[%d]", v.Id, v.Scene, v.Title, v.Action, v.Target)
  169. }
  170. }
  171. }
  172. func (tm *taskmgr) dumpUser(param string) {
  173. log.Release("-------------------------------")
  174. log.Release("taskmgr.dumpUser %s", param)
  175. defer func() {
  176. log.Release("+++++++++++++++++++++++++++++++")
  177. log.Release("")
  178. }()
  179. var userId int
  180. var err error
  181. if userId, err = strconv.Atoi(param); err != nil {
  182. log.Release("atoi error %v", err)
  183. return
  184. }
  185. ut := tm.getUserTask(userId)
  186. if ut == nil {
  187. log.Release("user %d not exist", userId)
  188. return
  189. }
  190. ut.dump()
  191. //d, _ := json.Marshal(si)
  192. //log.Release(string(d))
  193. }
  194. func (tm *taskmgr) awardTask(userId int, taskId int) (bool, string) {
  195. ut := tm.getUserTask(userId)
  196. return ut.awardTask(taskId)
  197. }
  198. func (tm *taskmgr) awardTaskWithItems(userId int, taskId int) string {
  199. ut := tm.getUserTask(userId)
  200. return ut.awardTaskWithItems(taskId)
  201. }
  202. func (tm *taskmgr) isTriggerPreAddiction(userId int) bool {
  203. ut := tm.getUserTask(userId)
  204. return ut.isTriggerPreAddiction()
  205. }
  206. func (tm *taskmgr) getTaskTipScene(userId int) int {
  207. ut := tm.getUserTask(userId)
  208. return ut.getTaskTipScene()
  209. }
  210. func (tm *taskmgr) awardAllTask(userId int) []item.ItemPack {
  211. ut := tm.getUserTask(userId)
  212. return ut.awardAllTask()
  213. }
  214. func (tm *taskmgr) getSysTasksByScene(scene int) []*pb.Task {
  215. var ret []*pb.Task
  216. tm.sys_lock.RLock()
  217. for k, v := range tm.sys_tasklist {
  218. if common.DecimalAnd(v.Scene, scene) > 0 {
  219. ret = append(ret, tm.sys_tasklist[k])
  220. }
  221. }
  222. tm.sys_lock.RUnlock()
  223. return ret
  224. }
  225. func (tm *taskmgr) getSysTasksByTaskIds(taskIds []int) []*pb.Task {
  226. var ret []*pb.Task
  227. tm.sys_lock.RLock()
  228. for k, v := range tm.sys_tasklist {
  229. for _, taskId := range taskIds {
  230. if v.Id == taskId {
  231. ret = append(ret, tm.sys_tasklist[k])
  232. break
  233. }
  234. }
  235. }
  236. tm.sys_lock.RUnlock()
  237. return ret
  238. }
  239. func (tm *taskmgr) createRandomTasksByScene(userId int, scene int, maxCount int, isRefresh bool) {
  240. ut := tm.getUserTask(userId)
  241. ut.createRandomTasksByScene(scene, maxCount, isRefresh)
  242. }
  243. func (tm *taskmgr) isAllTaskFinished(userId int, scene int) bool {
  244. ut := tm.getUserTask(userId)
  245. return ut.isAllTaskFinished(scene)
  246. }
  247. func (tm *taskmgr) createUserTasks(userId int, tasks []int) bool {
  248. ut := tm.getUserTask(userId)
  249. return ut.createTasksByIds(tasks)
  250. }
  251. func (tm *taskmgr) isTasksFinished(userId int, tasks []int) bool {
  252. ut := tm.getUserTask(userId)
  253. return ut.isTasksFinished(tasks)
  254. }
  255. func (tm *taskmgr) getTasksRewards(taskIds []int) []item.ItemPack {
  256. var ret []item.ItemPack
  257. tm.sys_lock.RLock()
  258. for _, taskId := range taskIds {
  259. sysTask, ok := tm.sys_tasklist[taskId]
  260. if !ok {
  261. continue
  262. }
  263. ret = append(ret, sysTask.Awards...)
  264. }
  265. tm.sys_lock.RUnlock()
  266. return item.GroupItems(ret)
  267. }
  268. func (tm *taskmgr) claimTaskRewards(userId int, taskIds []int) []item.ItemPack {
  269. ut := tm.getUserTask(userId)
  270. return ut.claimTaskRewards(taskIds)
  271. }