user_signin.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. package signin
  2. import (
  3. badge "bet24.com/servers/micros/badge/proto"
  4. "fmt"
  5. "bet24.com/log"
  6. "bet24.com/servers/common"
  7. pb "bet24.com/servers/micros/activityservice/proto"
  8. inventory "bet24.com/servers/micros/item_inventory/proto"
  9. item "bet24.com/servers/micros/item_inventory/proto"
  10. vip "bet24.com/servers/micros/userservices/proto"
  11. )
  12. type userSignin struct {
  13. userId int
  14. signinList []pb.Signin
  15. }
  16. func newUserSignin(userId int) *userSignin {
  17. us := new(userSignin)
  18. us.userId = userId
  19. us.loadSigninInfo()
  20. return us
  21. }
  22. func (us *userSignin) loadSigninInfo() {
  23. //1、签到列表
  24. signlist := userSignList(us.userId)
  25. for _, v := range getManager().getSignList(true) {
  26. signTime := 0
  27. for _, s := range signlist {
  28. if v.Id == s.Id {
  29. signTime = s.SignTime
  30. break
  31. }
  32. }
  33. us.signinList = append(us.signinList, pb.Signin{
  34. Id: v.Id,
  35. Award: v.Award,
  36. DoubleVipLevel: v.DoubleVipLevel,
  37. SignTime: signTime,
  38. })
  39. }
  40. us.checkFinishSequence()
  41. }
  42. // 检查是否重新开启新一轮签到
  43. func (us *userSignin) checkFinishSequence() {
  44. count := len(us.signinList)
  45. if count == 0 {
  46. return
  47. }
  48. if us.signinList[count-1].SignTime == 0 {
  49. return
  50. }
  51. lastSignTime := us.signinList[count-1].SignTime
  52. now := common.GetTimeStamp()
  53. if common.IsSameDay(lastSignTime, now) {
  54. return
  55. }
  56. // 一轮结束,连续签到也清零
  57. us.signinList = mgr.getSignList(true)
  58. go us.updateSigninAll()
  59. }
  60. // 签到
  61. func (us *userSignin) signin() (bool, *item.ItemPack) {
  62. var items *item.ItemPack
  63. if len(us.signinList) == 0 {
  64. log.Debug("userSignin.signin userId[%d] no signinList", us.userId)
  65. return false, items
  66. }
  67. signin := us.getCurrentSignin()
  68. if signin == nil {
  69. log.Debug("userSignin.signin userId[%d] getCurrentSignin == nil", us.userId)
  70. return false, items
  71. }
  72. signin.SignTime = common.GetTimeStamp()
  73. items = getManager().getPrizeByDayIndex(signin.Id)
  74. us.sendAward(items, fmt.Sprintf("签到ID:[%d]", signin.Id))
  75. vipLevel := 0
  76. userVip := vip.GetUserVipInfo(us.userId)
  77. if userVip != nil && userVip.IsVip() {
  78. vipLevel = userVip.Level
  79. }
  80. if vipLevel >= signin.DoubleVipLevel && signin.DoubleVipLevel > 0 {
  81. us.sendAward(items, fmt.Sprintf("签到ID:[%d] vip doubled", signin.Id))
  82. items.Count *= 2
  83. }
  84. // 新增徽章签到次数
  85. go badge.DoAction(us.userId, badge.Action_SignInCount, 1, badge.Scope{})
  86. us.updateSignin(signin.Id, signin.SignTime)
  87. return true, items
  88. }
  89. func (us *userSignin) getLastSignTime() int {
  90. count := len(us.signinList)
  91. for i := count - 1; i >= 0; i-- {
  92. if us.signinList[i].SignTime != 0 {
  93. return us.signinList[i].SignTime
  94. }
  95. }
  96. return 0
  97. }
  98. func (us *userSignin) getCurrentSignin() *pb.Signin {
  99. count := len(us.signinList)
  100. lastSignTime := 0
  101. lastSignIndex := -1
  102. for i := count - 1; i >= 0; i-- {
  103. if us.signinList[i].SignTime != 0 {
  104. lastSignIndex = i
  105. lastSignTime = us.signinList[i].SignTime
  106. break
  107. }
  108. }
  109. if lastSignIndex == count-1 {
  110. //log.Debug("userSignin.getCurrentSignin [%d] sequence has done", us.userId)
  111. return nil
  112. }
  113. // 当日已签到?
  114. if lastSignTime > 0 {
  115. now := common.GetTimeStamp()
  116. if common.IsSameDay(lastSignTime, now) {
  117. //log.Debug("userSignin.signin [%d] has signed today", us.userId)
  118. return nil
  119. }
  120. }
  121. return &us.signinList[lastSignIndex+1]
  122. }
  123. func (us *userSignin) sendAward(items *item.ItemPack, desc string) {
  124. if items == nil {
  125. log.Release("userSignin.sendAward userId[%d] items == nil", us.userId)
  126. return
  127. }
  128. inventory.AddItems(us.userId, []item.ItemPack{*items}, desc, common.LOGTYPE_SEND_SIGN)
  129. }
  130. func (us *userSignin) updateSigninAll() {
  131. for _, v := range us.signinList {
  132. us.updateSignin(v.Id, v.SignTime)
  133. }
  134. }
  135. func (us *userSignin) updateSignin(id, signTime int) {
  136. updateUserSign(us.userId, id, signTime)
  137. }
  138. func (us *userSignin) getSigninInfo() *pb.SigninInfo {
  139. signin := us.getCurrentSignin()
  140. return &pb.SigninInfo{
  141. SigninTable: us.signinList,
  142. Signable: signin != nil,
  143. }
  144. }
  145. func (us *userSignin) checkSignTip() bool {
  146. sign := us.getCurrentSignin()
  147. return sign != nil
  148. }