user.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. package levelrewards
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "sort"
  6. "bet24.com/log"
  7. "bet24.com/servers/common"
  8. pb "bet24.com/servers/micros/activityservice/proto"
  9. item "bet24.com/servers/micros/item_inventory/proto"
  10. notification "bet24.com/servers/micros/notification/proto"
  11. userservices "bet24.com/servers/micros/userservices/proto"
  12. )
  13. const idle_seconds = 600 // 过期时长(秒)
  14. type userTask struct {
  15. userId int // 用户id
  16. timeStamp int // 当前时间戳
  17. pb.UserLevelRewards // 任务列表
  18. }
  19. func newUserTask(userId int) *userTask {
  20. ret := new(userTask)
  21. ret.userId = userId
  22. ret.loadData()
  23. ret.checkTaskStatus()
  24. ret.updateTimeStamp()
  25. return ret
  26. }
  27. func (ut *userTask) loadData() {
  28. ut.loadSysConfig()
  29. ut.Level = userservices.GetUserLevel(ut.userId).Level
  30. if ut.isEndRestriction() {
  31. return
  32. }
  33. ut.Schedule = transGetUserTaskList(ut.userId)
  34. ut.IsPaid = transIsPurchaseGrowthPack(ut.userId)
  35. ut.generateLevelTasks()
  36. ut.daysRemainingChange()
  37. if ut.IsPaid {
  38. ut.DaysRemaining = 0
  39. }
  40. return
  41. }
  42. // 加载系统配置
  43. func (ut *userTask) loadSysConfig() {
  44. sys := mgr.getSysLevelRewards()
  45. ut.DurationDay = sys.DurationDay
  46. ut.LvRestriction = sys.LvRestriction
  47. ut.Tasks = sys.Tasks
  48. ut.ProductPrice.ProductId = sys.ProductPrice.ProductId
  49. ut.ProductPrice.Name = sys.ProductPrice.Name
  50. ut.ProductPrice.Desc = sys.ProductPrice.Desc
  51. ut.ProductPrice.Price = sys.ProductPrice.Price
  52. ut.ProductPrice.Items = sys.ProductPrice.Items
  53. }
  54. // 是否结束限制
  55. func (ut *userTask) isEndRestriction() bool {
  56. return ut.Level < mgr.LvRestriction
  57. }
  58. // 生成等级任务
  59. func (ut *userTask) generateLevelTasks() {
  60. for k, v := range mgr.getSysLevelRewards().Tasks {
  61. freeTask := ut.getUserLevelTask(v.Level, pb.Free_Pack)
  62. if freeTask.Level == 0 {
  63. // 免费
  64. freeTask.Level = v.Level
  65. freeTask.PaidPack = pb.Free_Pack
  66. freeTask.ClaimStatus = pb.ClaimStatus_Invalid
  67. if freeTask.CreateDayIndex == 0 && k == 0 {
  68. freeTask.CreateDayIndex = common.GetDayIndex(common.GetTimeStamp())
  69. }
  70. ut.Schedule = append(ut.Schedule, freeTask)
  71. ut.updateTaskInfo(freeTask)
  72. }
  73. paidTask := ut.getUserLevelTask(v.Level, pb.Paid_Pack)
  74. if paidTask.Level == 0 {
  75. // 付费
  76. paidTask.Level = v.Level
  77. paidTask.PaidPack = pb.Paid_Pack
  78. paidTask.ClaimStatus = pb.ClaimStatus_Invalid
  79. paidTask.CreateDayIndex = 0
  80. ut.Schedule = append(ut.Schedule, paidTask)
  81. ut.updateTaskInfo(paidTask)
  82. }
  83. }
  84. sort.SliceStable(ut.Schedule, func(i, j int) bool {
  85. if ut.Schedule[i].Level == ut.Schedule[j].Level {
  86. return ut.Schedule[i].PaidPack < ut.Schedule[j].PaidPack
  87. }
  88. return ut.Schedule[i].Level < ut.Schedule[j].Level
  89. })
  90. return
  91. }
  92. // 获取用户等级的任务
  93. func (ut *userTask) getUserLevelTask(level, paidPack int) pb.UserLevelTaskSchedule {
  94. for k, v := range ut.Schedule {
  95. if v.Level == level && v.PaidPack == paidPack {
  96. return ut.Schedule[k]
  97. }
  98. }
  99. return pb.UserLevelTaskSchedule{}
  100. }
  101. // 剩余天数索引变更
  102. func (ut *userTask) daysRemainingChange() {
  103. toDayIndex := common.GetDayIndex(common.GetTimeStamp())
  104. fmt.Printf("data====", ut.Schedule[0], mgr.getSysLevelRewards())
  105. endDayIndex := ut.Schedule[0].CreateDayIndex + mgr.getSysLevelRewards().DurationDay
  106. daysRemaining := endDayIndex - toDayIndex
  107. if daysRemaining < 0 && !ut.IsPaid {
  108. ut.clearActivity()
  109. return
  110. }
  111. ut.DaysRemaining = daysRemaining
  112. return
  113. }
  114. // 是否结束
  115. func (ut *userTask) isEnd() bool {
  116. return len(ut.Schedule) == 0
  117. }
  118. // 检查任务状态
  119. func (ut *userTask) checkTaskStatus() {
  120. var dataLen int
  121. for k, v := range ut.Schedule {
  122. if ut.Level < v.Level {
  123. continue
  124. }
  125. if v.ClaimStatus > pb.ClaimStatus_Invalid {
  126. if ut.IsPaid && v.ClaimStatus == pb.ClaimStatus_Claimed {
  127. dataLen++
  128. }
  129. continue
  130. }
  131. if v.IsPaidPack() && !ut.IsPaid {
  132. continue
  133. }
  134. ut.Schedule[k].ClaimStatus = pb.ClaimStatus_Valid
  135. if ut.Schedule[k].CreateDayIndex == 0 {
  136. ut.Schedule[k].CreateDayIndex = common.GetDayIndex(common.GetTimeStamp())
  137. }
  138. ut.updateTaskInfo(ut.Schedule[k])
  139. }
  140. if dataLen == len(ut.Schedule) {
  141. ut.clearActivity()
  142. }
  143. }
  144. // 清除活动
  145. func (ut *userTask) clearActivity() {
  146. ut.Schedule = nil
  147. ut.DaysRemaining = 0
  148. }
  149. // 更新时间戳
  150. func (ut *userTask) updateTimeStamp() {
  151. ut.timeStamp = common.GetTimeStamp() + idle_seconds
  152. return
  153. }
  154. // 是否过期
  155. func (ut *userTask) isExpire() bool {
  156. return ut.timeStamp < common.GetTimeStamp()
  157. }
  158. // 获取任务奖励
  159. func (ut *userTask) getLevelRewards() pb.UserLevelRewards {
  160. return ut.UserLevelRewards
  161. }
  162. // 领取等级奖励
  163. func (ut *userTask) claimLevelRewards(level int, isAll bool) (bool, []item.ItemPack) {
  164. if ut.isEnd() {
  165. return false, []item.ItemPack{}
  166. }
  167. if isAll {
  168. return ut.claimAllRewards()
  169. }
  170. var items []item.ItemPack
  171. sysTask := mgr.getSysTask(level)
  172. if sysTask.Level == 0 {
  173. log.Debug("userTask.claimLevelRewards system Level mismatch! UserID=%d, Level=%d", ut.userId, level)
  174. return false, items
  175. }
  176. for k, v := range ut.Schedule {
  177. if level != v.Level {
  178. continue
  179. }
  180. if v.ClaimStatus <= pb.ClaimStatus_Invalid || v.ClaimStatus >= pb.ClaimStatus_Claimed {
  181. continue
  182. }
  183. if v.IsPaidPack() {
  184. if !ut.IsPaid {
  185. continue
  186. }
  187. items = append(items, sysTask.Paid...)
  188. } else {
  189. items = append(items, sysTask.Free...)
  190. }
  191. ut.Schedule[k].ClaimStatus = pb.ClaimStatus_Claimed
  192. ut.updateTaskInfo(ut.Schedule[k])
  193. }
  194. return ut.addItems(items)
  195. }
  196. // 领取所有奖励
  197. func (ut *userTask) claimAllRewards() (bool, []item.ItemPack) {
  198. var items []item.ItemPack
  199. for k, v := range ut.Schedule {
  200. if ut.Level < v.Level {
  201. continue
  202. }
  203. if v.ClaimStatus <= pb.ClaimStatus_Invalid || v.ClaimStatus >= pb.ClaimStatus_Claimed {
  204. continue
  205. }
  206. sysTask := mgr.getSysTask(v.Level)
  207. if sysTask.Level == 0 {
  208. log.Debug("userTask.claimAllRewards system Level mismatch! UserID=%d, Level=%d", ut.userId, v.Level)
  209. continue
  210. }
  211. if v.IsPaidPack() {
  212. if !ut.IsPaid {
  213. continue
  214. }
  215. items = append(items, sysTask.Paid...)
  216. } else {
  217. items = append(items, sysTask.Free...)
  218. }
  219. ut.Schedule[k].ClaimStatus = pb.ClaimStatus_Claimed
  220. ut.updateTaskInfo(ut.Schedule[k])
  221. }
  222. return ut.addItems(items)
  223. }
  224. // 更新任务信息
  225. func (ut *userTask) updateTaskInfo(taskInfo pb.UserLevelTaskSchedule) {
  226. go transUpdateUserTask(ut.userId, taskInfo)
  227. }
  228. // 添加道具
  229. func (ut *userTask) addItems(items []item.ItemPack) (bool, []item.ItemPack) {
  230. if len(items) == 0 {
  231. return false, items
  232. }
  233. items = item.GroupItems(items)
  234. go item.AddItems(ut.userId, items, "levelrewards_levelpack", common.LOGTYPE_LEVEL_PACK)
  235. return true, items
  236. }
  237. // 是否等级礼包提醒
  238. func (ut *userTask) isLevelRewardsTip() bool {
  239. for _, v := range ut.Schedule {
  240. if v.ClaimStatus == pb.ClaimStatus_Valid {
  241. return true
  242. }
  243. }
  244. return false
  245. }
  246. func (ut *userTask) onUserLevelChange(oldLevel, newLevel int) {
  247. if ut.isEnd() {
  248. return
  249. }
  250. ut.Level = newLevel
  251. if mgr.getSysTaskLevel(oldLevel) == mgr.getSysTaskLevel(newLevel) {
  252. return
  253. }
  254. ut.checkTaskStatus()
  255. d, _ := json.Marshal(ut.getLevelRewards())
  256. go notification.AddNotification(ut.userId, notification.Notification_LevelRewards, string(d))
  257. return
  258. }
  259. func (ut *userTask) dump() {
  260. log.Release("timeout timeStamp: [%s], "+
  261. "Activity duration: [%d], "+
  262. "Remaining days of activity: [%d], "+
  263. "Whether you purchased a growth package: [%t], "+
  264. "User current level: [%d]",
  265. common.TimeStampToString(int64(ut.timeStamp)), ut.DurationDay, ut.DaysRemaining, ut.IsPaid, ut.Level)
  266. for _, v := range ut.Schedule {
  267. log.Release("Level:[%d], ClaimStatus[%d], CreateDayIndex[%d]",
  268. v.Level, v.ClaimStatus, v.CreateDayIndex)
  269. }
  270. }