user_giftpack.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. package giftpack
  2. import (
  3. "bet24.com/log"
  4. "bet24.com/servers/common"
  5. pb "bet24.com/servers/micros/activityservice/proto"
  6. item "bet24.com/servers/micros/item_inventory/proto"
  7. "encoding/json"
  8. "time"
  9. )
  10. const idle_seconds = 600
  11. type user_giftpack struct {
  12. userId int
  13. packs []*pb.UserGiftPack
  14. lastPing int64
  15. }
  16. func newUser(userId int) *user_giftpack {
  17. ret := new(user_giftpack)
  18. ret.userId = userId
  19. ret.lastPing = time.Now().Unix()
  20. ret.ctor()
  21. return ret
  22. }
  23. func (u *user_giftpack) ctor() {
  24. userPacks := transGetUserGiftPacks(u.userId)
  25. for k := range userPacks {
  26. u.packs = append(u.packs, &userPacks[k])
  27. }
  28. // 如果有新增礼包,则创建
  29. for _, v := range getManager().packs {
  30. pack := u.getPack(v.Id)
  31. if pack == nil {
  32. go u.createPackage(v.Id)
  33. }
  34. }
  35. // 读取所有terms
  36. terms := transGetUserTerms(u.userId)
  37. for _, v := range terms {
  38. p := u.getPack(v.PackageId)
  39. if p == nil {
  40. log.Release("user_giftpack.ctor[%d] packageId[%d] not found", u.userId, v.PackageId)
  41. continue
  42. }
  43. p.Terms = append(p.Terms, v.UserGrowthTerm)
  44. }
  45. }
  46. func (u *user_giftpack) isExpired() bool {
  47. return time.Now().Unix()-u.lastPing > idle_seconds
  48. }
  49. func (u *user_giftpack) createPackage(packageId int) {
  50. pack := &pb.UserGiftPack{
  51. PackageId: packageId,
  52. StartDay: int(time.Now().Unix()),
  53. Status: pb.PackageStatus_TOBUY,
  54. }
  55. u.packs = append(u.packs, pack)
  56. go transSetUserGiftPack(u.userId, packageId, pack.StartDay, pack.Status)
  57. }
  58. func (u *user_giftpack) getGiftPackStatus(packageId int) int {
  59. u.lastPing = time.Now().Unix()
  60. for _, v := range u.packs {
  61. if v.PackageId == packageId {
  62. return v.Status
  63. }
  64. }
  65. log.Release("user_giftpack.getGiftPackStatus[%d] packageId[%d] not found", u.userId, packageId)
  66. return pb.PackageStatus_TOBUY
  67. }
  68. func (u *user_giftpack) getGiftPackStartTime(packageId int) int {
  69. for _, v := range u.packs {
  70. if v.PackageId == packageId {
  71. return v.StartDay
  72. }
  73. }
  74. log.Release("user_giftpack.getGiftPackStartDay[%d] packageId[%d] not found", u.userId, packageId)
  75. return 0
  76. }
  77. func (u *user_giftpack) getAllTerms() string {
  78. u.lastPing = time.Now().Unix()
  79. for _, v := range u.packs {
  80. if v.Status == pb.PackageStatus_FINISHED {
  81. for i := 0; i < len(v.Terms); i++ {
  82. v.Terms[i].ClaimStatus = pb.ClaimStatus_Claimed
  83. }
  84. continue
  85. }
  86. if v.Status != pb.PackageStatus_BOUGHT {
  87. continue
  88. }
  89. // 设置下是否可领取
  90. for i := 0; i < len(v.Terms); i++ {
  91. isClaimable := u.isTermClaimable(v.PackageId, v.Terms[i].TermIndex)
  92. if isClaimable {
  93. v.Terms[i].ClaimStatus = pb.ClaimStatus_Valid
  94. } else {
  95. if v.Terms[i].ClaimDay == 0 {
  96. v.Terms[i].ClaimStatus = pb.ClaimStatus_Invalid
  97. } else {
  98. v.Terms[i].ClaimStatus = pb.ClaimStatus_Claimed
  99. }
  100. }
  101. }
  102. }
  103. d, _ := json.Marshal(u.packs)
  104. return string(d)
  105. }
  106. func (u *user_giftpack) claimGiftPack(packageId int, termId int) (bool, string) {
  107. u.lastPing = time.Now().Unix()
  108. pack := u.getPack(packageId)
  109. if pack == nil {
  110. log.Release("user_giftpack.claimGiftPack not found %d", packageId)
  111. return false, "package not found"
  112. }
  113. if pack.Status != pb.PackageStatus_BOUGHT {
  114. log.Release("user_giftpack.claimGiftPack not proper status %d", pack.Status)
  115. return false, "not proper status"
  116. }
  117. // 是否可领?
  118. if !u.isTermClaimable(packageId, termId) {
  119. return false, "unclaimable"
  120. }
  121. // 加道具
  122. items := getManager().getTermItems(packageId, termId)
  123. if len(items) > 0 {
  124. item.AddItems(u.userId, items, "novicewelfare_giftpack", common.LOGTYPE_NOVICE_WELFARE_GIFTPACK)
  125. }
  126. // 更新状态
  127. for i := 0; i < len(pack.Terms); i++ {
  128. if pack.Terms[i].TermIndex == termId {
  129. pack.Terms[i].ClaimDay = common.GetNowDayIndex()
  130. go transSetUserTerm(u.userId, packageId, termId, pack.Terms[i].ClaimDay)
  131. }
  132. }
  133. // 如果已经领取完该礼包,则结束
  134. if u.isPackageFinished(packageId) {
  135. pack.Status = pb.PackageStatus_FINISHED
  136. go transSetUserGiftPack(u.userId, packageId, pack.StartDay, pack.Status)
  137. }
  138. return true, "ok"
  139. }
  140. func (u *user_giftpack) getPack(packageId int) *pb.UserGiftPack {
  141. for _, v := range u.packs {
  142. if v.PackageId == packageId {
  143. return v
  144. }
  145. }
  146. return nil
  147. }
  148. func (u *user_giftpack) getTerm(packageId int, termId int) *pb.UserGrowthTerm {
  149. for _, v := range u.packs {
  150. if v.PackageId != packageId {
  151. continue
  152. }
  153. for i := 0; i < len(v.Terms); i++ {
  154. if v.Terms[i].TermIndex == termId {
  155. return &v.Terms[i]
  156. }
  157. }
  158. }
  159. return nil
  160. }
  161. func (u *user_giftpack) isTermClaimable(packageId, termId int) bool {
  162. curTerm := u.getTerm(packageId, termId)
  163. if curTerm == nil {
  164. log.Release("user_giftpack.isTermClaimable term not found %d.%d", packageId, termId)
  165. return false
  166. }
  167. if curTerm.ClaimDay != 0 {
  168. log.Release("user_giftpack.isTermClaimable term claimed %d.%d", packageId, termId)
  169. return false
  170. }
  171. lastTerm := u.getTerm(packageId, termId-1)
  172. if lastTerm != nil {
  173. if lastTerm.ClaimDay == 0 {
  174. return false
  175. }
  176. if common.GetNowDayIndex() == lastTerm.ClaimDay {
  177. return false
  178. }
  179. }
  180. return true
  181. }
  182. func (u *user_giftpack) isPackageFinished(packageId int) bool {
  183. pack := u.getPack(packageId)
  184. if pack == nil {
  185. log.Release("user_giftpack.isPackageFinished not found %d", packageId)
  186. return false
  187. }
  188. for _, v := range pack.Terms {
  189. if v.ClaimDay == 0 {
  190. return false
  191. }
  192. }
  193. return true
  194. }
  195. func (u *user_giftpack) buyGiftPack(productId string) {
  196. u.lastPing = time.Now().Unix()
  197. sysPack := getManager().getSysPackageByProductId(productId)
  198. if sysPack == nil {
  199. log.Release("user_giftpack.buyGiftPack[%d] syspack not found %s", u.userId, productId)
  200. return
  201. }
  202. packageId := sysPack.Id
  203. pack := u.getPack(packageId)
  204. if pack == nil {
  205. log.Release("user_giftpack.buyGiftPack[%d] not found %d", u.userId, packageId)
  206. return
  207. }
  208. if pack.Status != pb.PackageStatus_TOBUY {
  209. log.Release("user_giftpack.buyGiftPack[%d] not proper status [%d][%d]", u.userId, packageId, pack.Status)
  210. return
  211. }
  212. // 激活
  213. pack.Status = pb.PackageStatus_BOUGHT
  214. pack.Terms = []pb.UserGrowthTerm{}
  215. go transSetUserGiftPack(u.userId, packageId, pack.StartDay, pack.Status)
  216. for _, v := range sysPack.Terms {
  217. term := pb.UserGrowthTerm{TermIndex: v.TermIndex}
  218. pack.Terms = append(pack.Terms, term)
  219. go transSetUserTerm(u.userId, packageId, v.TermIndex, 0)
  220. }
  221. }