usertask.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832
  1. package handler
  2. import (
  3. "bet24.com/log"
  4. "bet24.com/servers/common"
  5. badge "bet24.com/servers/micros/badge/proto"
  6. dotservice "bet24.com/servers/micros/dotservice/proto"
  7. highly_profitable "bet24.com/servers/micros/highly_profitable/proto"
  8. inventory "bet24.com/servers/micros/item_inventory/proto"
  9. item "bet24.com/servers/micros/item_inventory/proto"
  10. notification "bet24.com/servers/micros/notification/proto"
  11. pb "bet24.com/servers/micros/task/proto"
  12. userlabel "bet24.com/servers/micros/userlabel/proto"
  13. "encoding/json"
  14. "fmt"
  15. "math/rand"
  16. "sort"
  17. "strconv"
  18. "sync"
  19. )
  20. func isExpired(ut *pb.UserTask) bool {
  21. if ut.Start == 0 || ut.Duration == 0 {
  22. return false
  23. }
  24. now := common.GetTimeStamp()
  25. // 当天任务
  26. if ut.Duration == pb.TaskDuration_Daily {
  27. return !common.IsSameDay(now, ut.Start)
  28. }
  29. // 本周任务
  30. if ut.Duration == pb.TaskDuration_Weekly {
  31. return !common.IsSameWeek(now, ut.Start)
  32. }
  33. return (now - ut.Start) > ut.Duration
  34. }
  35. func isStart(ut *pb.UserTask) bool {
  36. return common.GetTimeStamp() >= ut.Start
  37. }
  38. func resetUserTask(ut *pb.UserTask) {
  39. ut.Scheduled = 0
  40. ut.Status = pb.TaskStatus_active
  41. ut.Start = common.GetTimeStamp()
  42. ut.Scheduled = 0
  43. t := mgr.getSysTask(ut.TaskId)
  44. if t == nil {
  45. return
  46. }
  47. ut.Duration = t.Duration
  48. }
  49. type user_task struct {
  50. lock *sync.RWMutex
  51. userId int
  52. task_list map[int]*pb.UserTask
  53. }
  54. func newUserTask(userId int) *user_task {
  55. ret := new(user_task)
  56. ret.lock = &sync.RWMutex{}
  57. ret.task_list = make(map[int]*pb.UserTask)
  58. ret.userId = userId
  59. go ret.loadUserTask()
  60. return ret
  61. }
  62. func (ut *user_task) loadUserTask() {
  63. // log.Debug("user_task.loadUserTask[%d]", ut.userId)
  64. needUpdate := false
  65. // 从数据库加载正在完成的任务
  66. tasks := getUserTaskList(ut.userId)
  67. // 检查是否已失效,并且有周期则重新开始
  68. for k, v := range tasks {
  69. t := mgr.getSysTask(v.TaskId)
  70. if t == nil {
  71. delete(tasks, k)
  72. go removeUserTask(ut.userId, k)
  73. continue
  74. }
  75. if v.Scheduled > t.Target {
  76. v.Scheduled = t.Target
  77. }
  78. if !isExpired(v) {
  79. continue
  80. } else {
  81. // 如果是转盘任务,并且已失效,则删除
  82. if common.DecimalAnd(pb.TaskScene_DailyWheel, t.Scene) > 0 {
  83. if v.Status != pb.TaskStatus_active {
  84. delete(tasks, k)
  85. go removeUserTask(ut.userId, k)
  86. } else {
  87. // 重置时间
  88. v.Start = common.GetTimeStamp()
  89. v.Scheduled = 0
  90. }
  91. needUpdate = true
  92. continue
  93. }
  94. }
  95. if !isStart(v) {
  96. continue
  97. }
  98. if !t.Repeatable {
  99. v.Status = pb.TaskStatus_expired
  100. needUpdate = true
  101. continue
  102. }
  103. if t.PreTask != 0 {
  104. delete(tasks, k)
  105. go removeUserTask(ut.userId, k)
  106. } else {
  107. // log.Debug("user_task.loadUserTask reset task %d,%d", ut.userId, v.TaskId)
  108. resetUserTask(v)
  109. }
  110. needUpdate = true
  111. }
  112. ut.lock.Lock()
  113. ut.task_list = tasks
  114. ut.lock.Unlock()
  115. //log.Debug("user_task.loadUserTask1")
  116. //mgr.dumpUser(fmt.Sprintf("%d", ut.userId))
  117. // 检查是否需要主动创建任务
  118. if ut.createTasks() {
  119. needUpdate = true
  120. }
  121. //log.Debug("user_task.loadUserTask2")
  122. //mgr.dumpUser(fmt.Sprintf("%d", ut.userId))
  123. if needUpdate {
  124. ut.updateToDBAll()
  125. }
  126. }
  127. func (ut *user_task) getTaskList() []*pb.UserTask {
  128. var ret []*pb.UserTask
  129. ut.lock.RLock()
  130. defer ut.lock.RUnlock()
  131. for _, v := range ut.task_list {
  132. if v.Status > pb.TaskStatus_awarded {
  133. continue
  134. }
  135. ret = append(ret, v)
  136. }
  137. return ret
  138. }
  139. func (ut *user_task) awardTaskWithItems(taskId int) string {
  140. ok, _ := ut.awardTask(taskId)
  141. if !ok {
  142. return ""
  143. }
  144. t := mgr.getSysTask(taskId)
  145. if t == nil {
  146. log.Debug("user_task.awardTaskWithItems userId[%d] taskId[%d] systask not found", ut.userId, taskId)
  147. return ""
  148. }
  149. d, _ := json.Marshal(t.Awards)
  150. return string(d)
  151. }
  152. func (ut *user_task) awardTask(taskId int) (bool, string) {
  153. ut.lock.Lock()
  154. task, ok := ut.task_list[taskId]
  155. if !ok {
  156. log.Debug("user_task.awardTask userId[%d] taskId[%d] not found", ut.userId, taskId)
  157. ut.lock.Unlock()
  158. return false, "任务不存在"
  159. }
  160. if task.Status != pb.TaskStatus_complete {
  161. log.Debug("user_task.awardTask userId[%d] taskId[%d] not completed status[%d]", ut.userId, taskId, task.Status)
  162. ut.lock.Unlock()
  163. return false, "任务未完成或已领取"
  164. }
  165. task.Status = pb.TaskStatus_awarded
  166. ut.lock.Unlock()
  167. t := mgr.getSysTask(taskId)
  168. if t == nil {
  169. log.Debug("user_task.awardTask userId[%d] taskId[%d] systask not found", ut.userId, taskId)
  170. } else {
  171. go ut.sendAward(t.Awards, fmt.Sprintf("TaskId[%d] award", taskId))
  172. // 6=任务类(任务模块)(用户标签)
  173. go userlabel.TriggerEvent(ut.userId, userlabel.Type_Task, userlabel.Scope{Num: 1})
  174. // 徽章进度
  175. go badge.DoAction(ut.userId, badge.Action_CompleteTheTask, 1, badge.Scope{TaskId: taskId})
  176. }
  177. go ut.updateToDB(task)
  178. // 重复任务在登录时检测并创建
  179. // 打点统计
  180. go dotservice.AddDot(ut.userId, dotservice.DotScope{
  181. Scene: dotservice.Scene_Task,
  182. Action: dotservice.Action_Awarded,
  183. Extra: strconv.Itoa(taskId),
  184. })
  185. // 检测是否生成后续任务
  186. ut.checkNextTask(taskId)
  187. return true, ""
  188. }
  189. func (ut *user_task) checkNextTask(taskId int) {
  190. nextTasks := mgr.getNextTasks(taskId)
  191. if len(nextTasks) == 0 {
  192. return
  193. }
  194. for _, v := range nextTasks {
  195. ut.generateUserTask(v)
  196. }
  197. }
  198. func (ut *user_task) generateUserTask(task *pb.Task) {
  199. ut.lock.RLock()
  200. _, ok := ut.task_list[task.Id]
  201. ut.lock.RUnlock()
  202. if ok {
  203. //log.Debug("user_task.generateUserTask taskId[%d] already exist", task.Id)
  204. return
  205. }
  206. userTask := &pb.UserTask{
  207. TaskId: task.Id,
  208. Scheduled: 0,
  209. Status: pb.TaskStatus_active,
  210. }
  211. if task.Duration != 0 {
  212. userTask.Start = common.GetTimeStamp()
  213. userTask.Duration = task.Duration
  214. }
  215. ut.lock.Lock()
  216. ut.task_list[task.Id] = userTask
  217. ut.lock.Unlock()
  218. //log.Debug("user_task.generateUserTask %d,%d", ut.userId, task.Id)
  219. go ut.updateToDB(userTask)
  220. }
  221. func (ut *user_task) updateToDBAll() {
  222. ut.lock.RLock()
  223. defer ut.lock.RUnlock()
  224. for _, v := range ut.task_list {
  225. go ut.updateToDB(v)
  226. }
  227. }
  228. func (ut *user_task) updateToDB(userTask *pb.UserTask) {
  229. updateUserTask(ut.userId, userTask)
  230. }
  231. func (ut *user_task) sendAward(items []item.ItemPack, desc string) {
  232. for _, v := range items {
  233. tool := item.GetItem(v.ItemId)
  234. if tool == nil {
  235. log.Release("user_task.sendAward itemId[%d] not exist", v.ItemId)
  236. continue
  237. }
  238. //判断是否是活跃度,不是的话,继续下一个
  239. if tool.Type != item.Item_Vitality {
  240. continue
  241. }
  242. //触发日活跃度任务
  243. go ut.doTaskAction(pb.TaskAction_day_vitality, v.Count, pb.TaskScope{})
  244. //触发周活跃度任务
  245. go ut.doTaskAction(pb.TaskAction_week_vitality, v.Count, pb.TaskScope{})
  246. }
  247. //加道具
  248. inventory.AddItems(ut.userId, items, desc, common.LOGTYPE_TASK_AWARD)
  249. }
  250. func (ut *user_task) createTasks() bool {
  251. ret := false
  252. tasklist := mgr.getSysTaskList()
  253. for _, v := range tasklist {
  254. ut.lock.RLock()
  255. _, ok := ut.task_list[v.Id]
  256. ut.lock.RUnlock()
  257. if ok {
  258. continue
  259. }
  260. if v.PreTask != 0 {
  261. continue
  262. }
  263. if !ut.isAutoGenerate(v.Scene) {
  264. continue
  265. }
  266. ut.generateUserTask(v)
  267. ret = true
  268. }
  269. return ret
  270. }
  271. func (ut *user_task) isAutoGenerate(scene int) bool {
  272. if scene == 0 {
  273. return true
  274. }
  275. if common.DecimalAnd(scene, pb.TaskScene_Hall) > 0 {
  276. return true
  277. }
  278. if common.DecimalAnd(scene, pb.TaskScene_Game) > 0 {
  279. return true
  280. }
  281. if common.DecimalAnd(scene, pb.TaskScene_AudioRoom) > 0 {
  282. return true
  283. }
  284. return false
  285. }
  286. func (ut *user_task) createTasksByIds(taskIds []int) bool {
  287. ret := false
  288. tasklist := mgr.getSysTasksByTaskIds(taskIds)
  289. if len(tasklist) == 0 {
  290. return false
  291. }
  292. // 特定的任务,需要删除老任务
  293. if tasklist[0].Scene >= pb.TaskScene_HighlyProfitable {
  294. ut.removeTaskByScene(tasklist[0].Scene)
  295. }
  296. for _, v := range tasklist {
  297. ut.lock.RLock()
  298. _, ok := ut.task_list[v.Id]
  299. ut.lock.RUnlock()
  300. if ok {
  301. continue
  302. }
  303. if v.PreTask != 0 {
  304. continue
  305. }
  306. // 代理会员任务,绑码时触发
  307. if v.Scene == pb.TaskScene_Agent {
  308. continue
  309. }
  310. // 每日转盘任务随机生成
  311. if common.DecimalAnd(v.Scene, pb.TaskScene_DailyWheel) > 0 {
  312. continue
  313. }
  314. ut.generateUserTask(v)
  315. ret = true
  316. }
  317. return ret
  318. }
  319. func (ut *user_task) createRandomTasksByScene(scene int, maxCount int, isRefresh bool) {
  320. // 先获取我的任务
  321. existTasks := ut.getTasksByScene(scene)
  322. // 不刷新
  323. if !isRefresh && len(existTasks) >= maxCount {
  324. return
  325. }
  326. var toChangeTaskIds []int
  327. var finishedTasks []int
  328. for _, v := range existTasks {
  329. if v.Status == pb.TaskStatus_active {
  330. toChangeTaskIds = append(toChangeTaskIds, v.TaskId)
  331. } else {
  332. finishedTasks = append(finishedTasks, v.TaskId)
  333. }
  334. }
  335. if isRefresh {
  336. maxCount -= len(finishedTasks)
  337. } else {
  338. maxCount -= len(toChangeTaskIds)
  339. }
  340. // 如果是刷新,则删除未完成任务
  341. if len(toChangeTaskIds) > 0 && isRefresh {
  342. // 删除这些任务
  343. ut.lock.Lock()
  344. for _, v := range toChangeTaskIds {
  345. delete(ut.task_list, v)
  346. go removeUserTask(ut.userId, v)
  347. }
  348. ut.lock.Unlock()
  349. }
  350. // 如果不是刷新,则删除已完成任务
  351. if len(finishedTasks) > 0 && !isRefresh {
  352. // 删除这些任务
  353. ut.lock.Lock()
  354. for _, v := range finishedTasks {
  355. delete(ut.task_list, v)
  356. go removeUserTask(ut.userId, v)
  357. }
  358. ut.lock.Unlock()
  359. }
  360. if maxCount <= 0 {
  361. return
  362. }
  363. // 创建任务
  364. targetTasks := mgr.getSysTasksByScene(scene)
  365. // 把已完成的清理出去
  366. targetTasks = ut.removeSysTaskByTaskIds(targetTasks, finishedTasks)
  367. // 把要换掉的任务去掉
  368. targetTasks = ut.removeSysTaskByTaskIds(targetTasks, toChangeTaskIds)
  369. // 取部分
  370. targetTasks = ut.getRandomTasks(targetTasks, maxCount)
  371. // 创建
  372. for _, v := range targetTasks {
  373. //log.Debug("createRandomTasksByScene UserId[%d] Scene[%d] TaskId[%d]", ut.userId, scene, v.Id)
  374. ut.generateUserTask(v)
  375. }
  376. }
  377. func (ut *user_task) isAllTaskFinished(scene int) bool {
  378. // 先获取我的任务
  379. existTasks := ut.getTasksByScene(scene)
  380. if len(existTasks) == 0 {
  381. return false
  382. }
  383. for _, v := range existTasks {
  384. if v.Status == pb.TaskStatus_active {
  385. return false
  386. }
  387. }
  388. return true
  389. }
  390. func (ut *user_task) isTasksFinished(taskIds []int) bool {
  391. // 先获取我的任务
  392. ut.lock.RLock()
  393. defer ut.lock.RUnlock()
  394. for _, taskId := range taskIds {
  395. v, ok := ut.task_list[taskId]
  396. if !ok {
  397. return false
  398. }
  399. if v.Status == pb.TaskStatus_active {
  400. return false
  401. }
  402. }
  403. return true
  404. }
  405. func (ut *user_task) getRandomElements(array []int, count int) []int {
  406. if len(array) <= count {
  407. return array
  408. }
  409. rand.Shuffle(len(array), func(i, j int) { array[i], array[j] = array[j], array[i] })
  410. return array[:count]
  411. }
  412. func (ut *user_task) getRandomTasks(array []*pb.Task, count int) []*pb.Task {
  413. if len(array) <= count {
  414. return array
  415. }
  416. rand.Shuffle(len(array), func(i, j int) { array[i], array[j] = array[j], array[i] })
  417. return array[:count]
  418. }
  419. func (ut *user_task) removeSysTaskByTaskIds(sysTasks []*pb.Task, taskIds []int) []*pb.Task {
  420. for i := 0; i < len(sysTasks); {
  421. toRemove := false
  422. for _, v := range taskIds {
  423. if v == sysTasks[i].Id {
  424. toRemove = true
  425. break
  426. }
  427. }
  428. if toRemove {
  429. sysTasks = append(sysTasks[:i], sysTasks[i+1:]...)
  430. } else {
  431. i++
  432. }
  433. }
  434. return sysTasks
  435. }
  436. func (ut *user_task) getTasksByScene(scene int) []*pb.UserTask {
  437. var ret []*pb.UserTask
  438. ut.lock.RLock()
  439. for k, v := range ut.task_list {
  440. t := mgr.getSysTask(v.TaskId)
  441. if t == nil {
  442. log.Release("user_task.getTasksByScene scene[%d] taskId[%d] not found systask", scene, v.TaskId)
  443. continue
  444. }
  445. if common.DecimalAnd(t.Scene, scene) == 0 {
  446. continue
  447. }
  448. ret = append(ret, ut.task_list[k])
  449. }
  450. ut.lock.RUnlock()
  451. return ret
  452. }
  453. // 放弃任务
  454. func (ut *user_task) isActionTaskActive(action int, param pb.TaskScope) bool {
  455. ut.lock.Lock()
  456. defer ut.lock.Unlock()
  457. for _, v := range ut.task_list {
  458. if v.Status != pb.TaskStatus_active {
  459. continue
  460. }
  461. if isExpired(v) {
  462. continue
  463. }
  464. if !isStart(v) {
  465. continue
  466. }
  467. t := mgr.getSysTask(v.TaskId)
  468. if t == nil {
  469. log.Debug("user_task.doTaskAction taskId %d not found", v.TaskId)
  470. continue
  471. }
  472. if t.Action != action {
  473. continue
  474. }
  475. if !t.IsAplicable(param) {
  476. continue
  477. }
  478. return true
  479. }
  480. return false
  481. }
  482. // 放弃任务
  483. func (ut *user_task) removeTaskByAction(action int, param pb.TaskScope) {
  484. ut.lock.Lock()
  485. defer ut.lock.Unlock()
  486. for _, v := range ut.task_list {
  487. if v.Status != pb.TaskStatus_active {
  488. continue
  489. }
  490. if isExpired(v) {
  491. continue
  492. }
  493. if !isStart(v) {
  494. continue
  495. }
  496. t := mgr.getSysTask(v.TaskId)
  497. if t == nil {
  498. log.Debug("user_task.removeTaskByAction taskId %d not found", v.TaskId)
  499. continue
  500. }
  501. if t.Action != action {
  502. continue
  503. }
  504. if !t.IsAplicable(param) {
  505. continue
  506. }
  507. v.Status = pb.TaskStatus_expired
  508. go ut.updateToDB(v)
  509. }
  510. }
  511. // 放弃任务
  512. func (ut *user_task) removeTaskByScene(scene int) {
  513. var toRemove []int
  514. ut.lock.RLock()
  515. for k, v := range ut.task_list {
  516. t := mgr.getSysTask(v.TaskId)
  517. if t == nil {
  518. log.Debug("user_task.removeTaskByScene taskId %d not found", v.TaskId)
  519. continue
  520. }
  521. if t.Scene != scene {
  522. continue
  523. }
  524. toRemove = append(toRemove, k)
  525. }
  526. ut.lock.RUnlock()
  527. if len(toRemove) == 0 {
  528. return
  529. }
  530. log.Debug("removeTaskByScene %d,%d removing %v", ut.userId, scene, toRemove)
  531. ut.lock.Lock()
  532. for _, v := range toRemove {
  533. delete(ut.task_list, v)
  534. go removeUserTask(ut.userId, v)
  535. }
  536. ut.lock.Unlock()
  537. }
  538. // 用户的动作,看是否触发任务完成,返回是否需要刷新任务,任务进度变化或者状态变化都需要刷新
  539. func (ut *user_task) doTaskAction(action int, progress int, param pb.TaskScope) (bool, int) {
  540. if action == pb.TaskAction_earn {
  541. //log.Debug("user_task.doTaskAction UserId[%d],action[%d],progress[%d]", ut.userId, action, progress)
  542. }
  543. ut.lock.Lock()
  544. defer ut.lock.Unlock()
  545. ret := false
  546. taskId := 0
  547. for _, v := range ut.task_list {
  548. if v.Status != pb.TaskStatus_active {
  549. continue
  550. }
  551. if isExpired(v) {
  552. continue
  553. }
  554. if !isStart(v) {
  555. continue
  556. }
  557. t := mgr.getSysTask(v.TaskId)
  558. if t == nil {
  559. log.Debug("user_task.doTaskAction taskId %d not found", v.TaskId)
  560. continue
  561. }
  562. if t.Action != action {
  563. continue
  564. }
  565. if !t.IsAplicable(param) {
  566. continue
  567. }
  568. v.Scheduled += progress
  569. needNotification := false
  570. if v.Scheduled >= t.Target {
  571. if common.DecimalOr(pb.TaskScene_HighlyProfitable, t.Scene) > 0 {
  572. highly_profitable.OnUserFinishedRelativeTask(ut.userId)
  573. }
  574. if len(t.Awards) == 0 {
  575. v.Status = pb.TaskStatus_awarded
  576. } else {
  577. v.Status = pb.TaskStatus_complete
  578. // 打点统计
  579. go dotservice.AddDot(ut.userId, dotservice.DotScope{
  580. Scene: dotservice.Scene_Task,
  581. Action: dotservice.Action_Complete,
  582. Extra: strconv.Itoa(v.TaskId),
  583. })
  584. }
  585. v.Scheduled = t.Target
  586. needNotification = true
  587. taskId = v.TaskId
  588. } else {
  589. if pb.TaskAction_play_time != action {
  590. needNotification = true
  591. }
  592. }
  593. if needNotification {
  594. d, _ := json.Marshal(v)
  595. go notification.AddNotification(ut.userId, notification.Notification_Task, string(d))
  596. }
  597. ret = true
  598. go ut.updateToDB(v)
  599. }
  600. return ret, taskId
  601. }
  602. func (ut *user_task) isTriggerPreAddiction() bool {
  603. ut.lock.RLock()
  604. defer ut.lock.RUnlock()
  605. t, ok := ut.task_list[pb.PreAddictionTaskId]
  606. if !ok {
  607. return false
  608. }
  609. return t.Status >= pb.TaskStatus_complete
  610. }
  611. // 返回各场景对应的标识是否有任务完成
  612. func (ut *user_task) getTaskTipScene() int {
  613. var scene int
  614. ut.lock.RLock()
  615. defer ut.lock.RUnlock()
  616. for _, v := range ut.task_list {
  617. if v.Status != pb.TaskStatus_complete {
  618. continue
  619. }
  620. sysTask := mgr.getSysTask(v.TaskId)
  621. if sysTask == nil {
  622. continue
  623. }
  624. // 场景任务提醒
  625. scene = common.DecimalOr(scene, sysTask.Scene)
  626. }
  627. return scene
  628. }
  629. func (ut *user_task) awardAllTask() []item.ItemPack {
  630. var ret []item.ItemPack
  631. ut.lock.Lock()
  632. for _, v := range ut.task_list {
  633. if v.Status != pb.TaskStatus_complete {
  634. continue
  635. }
  636. sysTask := mgr.getSysTask(v.TaskId)
  637. if sysTask == nil {
  638. continue
  639. }
  640. // 一键领取所有任务屏蔽非大厅和游戏任务
  641. if common.DecimalAnd(pb.TaskScene_Hall+pb.TaskScene_Game, sysTask.Scene) == 0 {
  642. continue
  643. }
  644. ret = append(ret, sysTask.Awards...)
  645. v.Status = pb.TaskStatus_awarded
  646. go ut.updateToDB(v)
  647. // 检测是否生成后续任务
  648. go ut.checkNextTask(v.TaskId)
  649. // 徽章进度
  650. go badge.DoAction(ut.userId, badge.Action_CompleteTheTask, 1, badge.Scope{TaskId: v.TaskId})
  651. // 打点统计
  652. go dotservice.AddDot(ut.userId, dotservice.DotScope{
  653. Scene: dotservice.Scene_Task,
  654. Action: dotservice.Action_Awarded,
  655. Extra: strconv.Itoa(v.TaskId),
  656. })
  657. }
  658. ut.lock.Unlock()
  659. ret = item.GroupItems(ret)
  660. if len(ret) > 0 {
  661. ut.sendAward(ret, "awardAllTask")
  662. }
  663. return ret
  664. }
  665. func (ut *user_task) claimTaskRewards(taskIds []int) []item.ItemPack {
  666. //log.Debug("user_task.claimTaskRewards userId[%d] taskIds%v", ut.userId, taskIds)
  667. var ret []item.ItemPack
  668. ut.lock.Lock()
  669. for _, taskId := range taskIds {
  670. v, ok := ut.task_list[taskId]
  671. if !ok {
  672. continue
  673. }
  674. if v.Status != pb.TaskStatus_complete {
  675. continue
  676. }
  677. sysTask := mgr.getSysTask(v.TaskId)
  678. if sysTask == nil {
  679. continue
  680. }
  681. ret = append(ret, sysTask.Awards...)
  682. v.Status = pb.TaskStatus_awarded
  683. go ut.updateToDB(v)
  684. // 检测是否生成后续任务
  685. go ut.checkNextTask(v.TaskId)
  686. // 徽章进度
  687. go badge.DoAction(ut.userId, badge.Action_CompleteTheTask, 1, badge.Scope{TaskId: v.TaskId})
  688. // 打点统计
  689. go dotservice.AddDot(ut.userId, dotservice.DotScope{
  690. Scene: dotservice.Scene_Task,
  691. Action: dotservice.Action_Awarded,
  692. Extra: strconv.Itoa(v.TaskId),
  693. })
  694. }
  695. ut.lock.Unlock()
  696. ret = item.GroupItems(ret)
  697. if len(ret) > 0 {
  698. ut.sendAward(ret, "claimTaskRewards")
  699. }
  700. return ret
  701. }
  702. func (ut *user_task) dump() {
  703. ut.lock.RLock()
  704. var list []*pb.UserTask
  705. for k := range ut.task_list {
  706. list = append(list, ut.task_list[k])
  707. }
  708. ut.lock.RUnlock()
  709. sort.Slice(list, func(i, j int) bool {
  710. return list[i].TaskId < list[j].TaskId
  711. })
  712. for _, v := range list {
  713. ut.dumpUserTask(v)
  714. }
  715. }
  716. func (ut *user_task) dumpUserTask(v *pb.UserTask) {
  717. if v.Start > 0 {
  718. log.Release(" [%d]:Sched[%d]Sta[%s]St[%s]Dur[%s]",
  719. v.TaskId, v.Scheduled, pb.GetTaskStatusDesc(v.Status),
  720. common.TimeStampToShortString(int64(v.Start)), pb.GetTaskDurationDesc(v.Duration))
  721. } else {
  722. log.Release(" [%d]:Sched[%d]Sta[%s]", v.TaskId, v.Scheduled, pb.GetTaskStatusDesc(v.Status))
  723. }
  724. }