user_signin.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. package signin
  2. import (
  3. "fmt"
  4. "bet24.com/log"
  5. "bet24.com/servers/common"
  6. inventory "bet24.com/servers/micros/item_inventory/proto"
  7. item "bet24.com/servers/micros/item_inventory/proto"
  8. vip "bet24.com/servers/micros/userservices/proto"
  9. )
  10. type userSignin struct {
  11. userId int
  12. signinList []Signin
  13. continueAward []*ContinueAward
  14. }
  15. func newUserSignin(userId int) *userSignin {
  16. us := new(userSignin)
  17. us.userId = userId
  18. us.loadSigninInfo()
  19. return us
  20. }
  21. func (us *userSignin) loadSigninInfo() {
  22. // 从数据库读取签到信息
  23. //1、签到列表
  24. signlist := userSignList(us.userId)
  25. for _, v := range mgr.getSignList() {
  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, Signin{
  34. Id: v.Id,
  35. Award: v.Award,
  36. DoubleVipLevel: v.DoubleVipLevel,
  37. SignTime: signTime,
  38. })
  39. }
  40. //2、连续签到奖励
  41. awardlist := userContinueSignList(us.userId)
  42. for _, v := range mgr.getContinueAwardList() {
  43. status := 0
  44. for _, s := range awardlist {
  45. if v.Day == s.Day {
  46. status = s.Status
  47. break
  48. }
  49. }
  50. us.continueAward = append(us.continueAward, &ContinueAward{
  51. Day: v.Day,
  52. Award: v.Award,
  53. Status: status,
  54. })
  55. }
  56. us.checkFinishSequence()
  57. }
  58. // 检查是否重新开启新一轮签到
  59. func (us *userSignin) checkFinishSequence() {
  60. count := len(us.signinList)
  61. if count == 0 {
  62. return
  63. }
  64. if us.signinList[count-1].SignTime == 0 {
  65. return
  66. }
  67. lastSignTime := us.signinList[count-1].SignTime
  68. now := common.GetTimeStamp()
  69. if common.IsSameDay(lastSignTime, now) {
  70. return
  71. }
  72. // 一轮结束,连续签到也清零
  73. us.signinList = mgr.getSignList()
  74. us.continueAward = mgr.getContinueAwardList()
  75. go us.updateSigninAll()
  76. go us.updateContinueAwardAll()
  77. }
  78. // 签到
  79. func (us *userSignin) signin() (bool, []item.ItemPack) {
  80. var items []item.ItemPack
  81. if len(us.signinList) == 0 {
  82. return false, items
  83. }
  84. signin := us.getCurrentSignin()
  85. if signin == nil {
  86. return false, items
  87. }
  88. signin.SignTime = common.GetTimeStamp()
  89. us.checkContinue()
  90. us.sendAward(signin.Award, fmt.Sprintf("签到ID:[%d]", signin.Id))
  91. items = append(items, signin.Award...)
  92. vipLevel := 0
  93. userVip := vip.GetUserVipInfo(us.userId)
  94. if userVip != nil && userVip.IsVip() {
  95. vipLevel = userVip.Level
  96. }
  97. if vipLevel >= signin.DoubleVipLevel && signin.DoubleVipLevel > 0 {
  98. us.sendAward(signin.Award, fmt.Sprintf("签到ID:[%d] vip doubled", signin.Id))
  99. items = append(items, signin.Award...)
  100. }
  101. us.updateSignin(signin.Id, signin.SignTime)
  102. return true, items
  103. }
  104. // 领取连续签到奖励
  105. func (us *userSignin) giftContinueAward(day int) (bool, []item.ItemPack) {
  106. var items []item.ItemPack
  107. if len(us.continueAward) <= 0 {
  108. return false, items
  109. }
  110. for _, v := range us.continueAward {
  111. if v.Day != day {
  112. continue
  113. }
  114. if v.Status != status_completed {
  115. return false, nil
  116. }
  117. // 设置为领取状态
  118. v.Status = status_received
  119. us.updateContinueAward(v.Day, v.Status)
  120. // 发放奖励
  121. us.sendAward(v.Award, fmt.Sprintf("连续签到[%d]天", v.Day))
  122. return true, v.Award
  123. }
  124. return false, nil
  125. }
  126. func (us *userSignin) calContinueDay() int {
  127. ret := 0
  128. count := len(us.signinList)
  129. lastSignTime := 0
  130. for i := count - 1; i >= 0; i-- {
  131. if us.signinList[i].SignTime == 0 {
  132. continue
  133. }
  134. if lastSignTime == 0 {
  135. lastSignTime = us.signinList[i].SignTime
  136. ret = 1
  137. continue
  138. }
  139. if !common.IsContinueDay(lastSignTime, us.signinList[i].SignTime) {
  140. return ret
  141. }
  142. ret++
  143. }
  144. return ret
  145. }
  146. func (us *userSignin) getLastSignTime() int {
  147. count := len(us.signinList)
  148. for i := count - 1; i >= 0; i-- {
  149. if us.signinList[i].SignTime != 0 {
  150. return us.signinList[i].SignTime
  151. }
  152. }
  153. return 0
  154. }
  155. func (us *userSignin) getCurrentSignin() *Signin {
  156. count := len(us.signinList)
  157. lastSignTime := 0
  158. lastSignIndex := -1
  159. for i := count - 1; i >= 0; i-- {
  160. if us.signinList[i].SignTime != 0 {
  161. lastSignIndex = i
  162. lastSignTime = us.signinList[i].SignTime
  163. break
  164. }
  165. }
  166. if lastSignIndex == count-1 {
  167. log.Debug("userSignin.getCurrentSignin [%d] sequence has done", us.userId)
  168. return nil
  169. }
  170. // 当日已签到?
  171. if lastSignTime > 0 {
  172. now := common.GetTimeStamp()
  173. if common.IsSameDay(lastSignTime, now) {
  174. log.Debug("userSignin.signin [%d] has signed today", us.userId)
  175. return nil
  176. }
  177. }
  178. return &us.signinList[lastSignIndex+1]
  179. }
  180. func (us *userSignin) getContinueDay() int {
  181. continueDay := 1
  182. count := len(us.signinList)
  183. if count == 0 {
  184. return continueDay
  185. }
  186. now := common.GetTimeStamp()
  187. lastSignTime := 0
  188. for i := count - 1; i > 0; i-- {
  189. if us.signinList[i].SignTime == 0 {
  190. continue
  191. }
  192. if lastSignTime == 0 {
  193. lastSignTime = us.signinList[i].SignTime
  194. // 是否当天或者第二天
  195. if !common.IsSameDay(lastSignTime, now) && !common.IsContinueDay(lastSignTime, now) {
  196. return 0
  197. }
  198. }
  199. if common.IsContinueDay(us.signinList[i].SignTime, us.signinList[i-1].SignTime) {
  200. continueDay++
  201. } else {
  202. break
  203. }
  204. }
  205. if lastSignTime == 0 {
  206. lastSignTime = us.signinList[0].SignTime
  207. }
  208. if lastSignTime == 0 {
  209. continueDay = 0
  210. }
  211. return continueDay
  212. }
  213. // 当日已签到,检查是否触发连续签到
  214. func (us *userSignin) checkContinue() {
  215. if len(us.continueAward) == 0 {
  216. return
  217. }
  218. continueDay := us.getContinueDay()
  219. for _, v := range us.continueAward {
  220. if v.Status != status_idle {
  221. continue
  222. }
  223. if continueDay < v.Day {
  224. continue
  225. }
  226. //完成
  227. v.Status = status_completed
  228. us.updateContinueAward(v.Day, v.Status)
  229. }
  230. return
  231. }
  232. func (us *userSignin) sendAward(items []item.ItemPack, desc string) {
  233. inventory.AddItems(us.userId, items, desc, common.LOGTYPE_SEND_SIGN)
  234. }
  235. func (us *userSignin) updateSigninAll() {
  236. for _, v := range us.signinList {
  237. us.updateSignin(v.Id, v.SignTime)
  238. }
  239. }
  240. func (us *userSignin) updateSignin(id, signTime int) {
  241. updateUserSign(us.userId, id, signTime)
  242. }
  243. func (us *userSignin) updateContinueAwardAll() {
  244. for _, v := range us.continueAward {
  245. us.updateContinueAward(v.Day, status_idle)
  246. }
  247. }
  248. func (us *userSignin) updateContinueAward(day, status int) {
  249. updateUserSignContinue(us.userId, day, status)
  250. }
  251. func (us *userSignin) getSigninInfo() *SigninInfo {
  252. signin := us.getCurrentSignin()
  253. return &SigninInfo{
  254. SigninTable: us.signinList,
  255. Continue: us.continueAward,
  256. Signable: signin != nil,
  257. ContinueDay: us.getContinueDay(),
  258. }
  259. }
  260. func (us *userSignin) checkSignTip() bool {
  261. sign := us.getCurrentSignin()
  262. return sign != nil
  263. }