userlevel.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package level
  2. import (
  3. "bet24.com/log"
  4. "bet24.com/servers/common"
  5. activityservice "bet24.com/servers/micros/activityservice/proto"
  6. inventory "bet24.com/servers/micros/item_inventory/proto"
  7. item "bet24.com/servers/micros/item_inventory/proto"
  8. notification "bet24.com/servers/micros/notification/proto"
  9. "bet24.com/servers/micros/userservices/handler/vip"
  10. pb "bet24.com/servers/micros/userservices/proto"
  11. "encoding/json"
  12. "fmt"
  13. "sync"
  14. "time"
  15. )
  16. type userlevel struct {
  17. userId int // 用户ID
  18. pb.LevelBaseInfo // 基本信息
  19. lock *sync.RWMutex
  20. }
  21. func newUserLevel(userId int) *userlevel {
  22. ul := new(userlevel)
  23. ul.userId = userId
  24. ul.lock = &sync.RWMutex{}
  25. ul.loadUserLevelInfo()
  26. return ul
  27. }
  28. // 初始化用户Vip信息
  29. func (ul *userlevel) loadUserLevelInfo() {
  30. ul.LevelBaseInfo = getUserLevel(ul.userId)
  31. // 如果等级不匹配,保留等级的情况下,清理经验值
  32. if ul.Level != mgr.getLevelByExperience(ul.Experience) {
  33. li := mgr.getLevelInfo(ul.Level)
  34. //log.Release("userlevel.loadUserLevelInfo update user[%d]'s Experience [%d]->[%d] of Level[%d]",
  35. // ul.userId, ul.Experience, li.Exp, ul.Level)
  36. ul.Experience = li.Exp
  37. go ul.updateUserLevel()
  38. }
  39. if ul.LevelBaseInfo.LoginAward == pb.Award_Notify {
  40. go func() {
  41. time.Sleep(2 * time.Second)
  42. // 通知客户端
  43. notification.AddNotification(ul.userId, notification.Notification_Chip, "")
  44. }()
  45. }
  46. }
  47. func (ul *userlevel) addExperience(value int) int {
  48. // 非facebook账号
  49. /*if !ul.IsAdd && !ul.IsFacebook {
  50. return
  51. }*/
  52. if ul.Level >= mgr.maxLevel {
  53. return 0
  54. }
  55. // 额外经验加成
  56. vipAddRate := vip.GetExtraExperience(ul.userId)
  57. if vipAddRate > 0 {
  58. value = value * (100 + vipAddRate) / 100
  59. }
  60. ul.Experience += value
  61. newLevel := mgr.getLevelByExperience(ul.Experience)
  62. defer ul.updateUserLevel()
  63. if newLevel == ul.Level {
  64. ul.broadcastExperience(value)
  65. return value
  66. }
  67. // 处理跨级问题
  68. var giftPack []item.ItemPack
  69. for i := ul.Level + 1; i <= newLevel; i++ {
  70. li := mgr.getLevelInfo(i)
  71. giftPack = append(giftPack, li.GiftPack...)
  72. }
  73. // 等级礼包
  74. go activityservice.OnUserLevelChange(ul.userId, ul.Level, newLevel)
  75. ul.Level = newLevel
  76. ul.broadcastExperience(value)
  77. if len(giftPack) > 0 {
  78. ul.sendAward(giftPack, fmt.Sprintf("user level up[%d] award", newLevel), common.LOGTYPE_LEVEL_UPGRADE)
  79. }
  80. var levelInfo pb.LevelInfo
  81. levelInfo.Level = ul.Level
  82. levelInfo.Exp = ul.Experience
  83. //levelInfo.GiftPack = giftPack
  84. d, _ := json.Marshal(levelInfo)
  85. go notification.AddNotification(ul.userId, notification.Notification_Level, string(d))
  86. return value
  87. }
  88. func (ul *userlevel) broadcastExperience(delta int) {
  89. var expChange struct {
  90. Delta int
  91. Exp int
  92. }
  93. expChange.Delta = delta
  94. expChange.Exp = ul.Experience
  95. d, _ := json.Marshal(expChange)
  96. go notification.AddNotification(ul.userId, notification.Notification_Experience, string(d))
  97. }
  98. func (ul *userlevel) sendAward(items []item.ItemPack, desc string, logType int) {
  99. if len(items) <= 0 {
  100. return
  101. }
  102. inventory.AddItems(ul.userId, items, desc, logType)
  103. }
  104. func (ul *userlevel) updateUserLevel() {
  105. go updateUserLevel(ul.userId, ul.Level, ul.Experience, ul.LoginAward)
  106. }
  107. // 是否显示大厅
  108. func (ul *userlevel) isShow() bool {
  109. // 白名单
  110. if ul.IsWhite == pb.WhiteList_Black {
  111. return true
  112. }
  113. // 达到条件
  114. if ul.LoginAward >= pb.Award_Available {
  115. return true
  116. }
  117. return false
  118. }
  119. func (ul *userlevel) loginAward() (bool, int) {
  120. if ul.LoginAward != pb.Award_Available {
  121. return false, 0
  122. }
  123. ul.LoginAward = pb.Award_Received
  124. retCode, amount := loginAward(ul.userId)
  125. if !retCode {
  126. return retCode, 0
  127. }
  128. var items []item.ItemPack
  129. items = append(items, item.ItemPack{
  130. ItemId: item.Item_Chip,
  131. Count: amount,
  132. })
  133. inventory.AddItems(ul.userId, items, "元宝大厅登录奖励", common.LOGTYPE_LOGIN_AWARD)
  134. return retCode, amount
  135. }
  136. func (ul *userlevel) dump() {
  137. ul.lock.RLock()
  138. defer ul.lock.RUnlock()
  139. log.Debug(" userlevel.dump %d:[%d.%d] IsWhite[%d]", ul.userId, ul.Level, ul.Experience, ul.IsWhite)
  140. }