rankList.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. package rank
  2. import (
  3. "sync"
  4. "time"
  5. audioroomPb "bet24.com/servers/micros/audioroom/proto"
  6. badge "bet24.com/servers/micros/badge/proto"
  7. "bet24.com/servers/common"
  8. item "bet24.com/servers/micros/item_inventory/proto"
  9. cash "bet24.com/servers/micros/money/proto"
  10. "bet24.com/log"
  11. _ "bet24.com/servers/coreservice/friend"
  12. user "bet24.com/servers/micros/userservices/proto"
  13. )
  14. var Ranks *RankList
  15. type RankList struct {
  16. Ranks map[int][]*rankItem // 榜单类型--榜单列表
  17. RankHistory map[string][]*rankHistoryItem // 榜单历史
  18. lock *sync.RWMutex
  19. }
  20. func NewRankList() *RankList {
  21. obj := new(RankList)
  22. obj.Ranks = make(map[int][]*rankItem)
  23. obj.RankHistory = make(map[string][]*rankHistoryItem)
  24. obj.lock = &sync.RWMutex{}
  25. return obj
  26. }
  27. func (rl *RankList) Run() {
  28. rl.refreshData()
  29. }
  30. func (rl *RankList) refreshData() {
  31. go rl.doRefresh()
  32. time.AfterFunc(3*time.Second, rl.refreshData)
  33. }
  34. func (rl *RankList) doRefresh() {
  35. ranks := make(map[int][]*rankItem)
  36. for _, v := range getRankList() {
  37. // 语聊房榜单涉及到房间信息处理
  38. if v.RankType == RankType_audioRoom_lastWeek ||
  39. v.RankType == RankType_audioRoom_thisWeek ||
  40. v.RankType == RankType_audioRoom_consumeDiamond_day ||
  41. v.RankType == RankType_audioRoom_consumeDiamond_week ||
  42. v.RankType == RankType_audioRoom_consumeDiamond_month {
  43. // 获取语聊房信息
  44. r := audioroomPb.GetRoom(v.UserId)
  45. if r.RoomInfo == nil {
  46. log.Debug("rankList.doRefresh roomId=%d ==> %+v", v.UserId, v)
  47. continue
  48. }
  49. rankItem := &rankItem{
  50. RankType: v.RankType,
  51. Rank: v.Rank,
  52. Amount: v.Amount,
  53. UserHotInfo: user.UserHotInfo{
  54. UserId: r.RoomInfo.RoomId,
  55. NickName: r.RoomInfo.RoomName,
  56. FaceUrl: r.RoomInfo.RoomImg,
  57. },
  58. AwardItem: AwardItem{
  59. IsGift: v.IsGift,
  60. Awards: Awards.getAwards(v.RankType, v.Rank),
  61. },
  62. crdate: v.crdate,
  63. }
  64. ranks[v.RankType] = append(ranks[v.RankType], rankItem)
  65. continue
  66. }
  67. u := user.GetUserInfo(v.UserId)
  68. if u == nil {
  69. log.Debug("rankList.doRefresh userId=%d ==> %+v", v.UserId, v)
  70. continue
  71. }
  72. rankItem := &rankItem{
  73. RankType: v.RankType,
  74. Rank: v.Rank,
  75. Amount: v.Amount,
  76. UserHotInfo: user.UserHotInfo{
  77. UserId: v.UserId,
  78. NickName: u.NickName,
  79. FaceId: u.FaceId,
  80. FaceUrl: u.FaceUrl,
  81. Sex: u.Sex,
  82. UserWords: u.UserWords,
  83. Vip: u.Vip,
  84. Decorations: u.Decorations,
  85. Badges: u.Badges,
  86. Charm: u.Charm,
  87. VipExpire: u.VipExpire,
  88. },
  89. AwardItem: AwardItem{
  90. IsGift: v.IsGift,
  91. Awards: Awards.getAwards(v.RankType, v.Rank),
  92. },
  93. crdate: v.crdate,
  94. }
  95. ranks[v.RankType] = append(ranks[v.RankType], rankItem)
  96. }
  97. now := common.GetNowTime()
  98. // 只取零点且前三十分钟的数据才有效[00:30]
  99. if now.Hour() == 0 && now.Minute() > 5 && now.Minute() < 30 {
  100. // 榜单触发荣誉徽章(主要是周榜)
  101. for _, rankType := range badgeRankArray {
  102. // 榜单
  103. if badgeRanks := ranks[rankType]; len(badgeRanks) > 0 {
  104. for _, v := range badgeRanks {
  105. // 徽章进度(只统计周榜)
  106. go badge.DoAction(v.UserId, badge.Action_Ranking, 0, badge.Scope{
  107. RankCrdate: v.crdate,
  108. RankInfo: badge.RankInfo{
  109. Type: v.RankType,
  110. Rank: v.Rank,
  111. },
  112. })
  113. }
  114. }
  115. }
  116. }
  117. rl.lock.Lock()
  118. defer rl.lock.Unlock()
  119. rl.Ranks = ranks
  120. }
  121. // 获取排行榜列表
  122. func (rl *RankList) getRankList(userId, rankType, num int) (*AwardItem, []*rankItem) {
  123. var list []*rankItem
  124. rl.lock.RLock()
  125. if num > 0 && len(rl.Ranks[rankType]) >= num {
  126. list = rl.Ranks[rankType][:num]
  127. } else {
  128. list = rl.Ranks[rankType]
  129. }
  130. rl.lock.RUnlock()
  131. ret := new(AwardItem)
  132. for _, v := range list {
  133. if v.UserId != userId {
  134. //v.IsFriend = friend.IfFriend(userId, v.UserId)
  135. v.IsGift = Award_Invalid
  136. continue
  137. }
  138. ret.Amount = v.Amount
  139. ret.IsGift = v.IsGift
  140. ret.Awards = v.Awards
  141. // log.Debug("getRankList userId=%d rankType=%d v=%+v ret=%+v", userId, rankType, v, ret)
  142. // 没有奖励
  143. if ret.Awards == nil {
  144. ret.IsGift = Award_Invalid
  145. }
  146. }
  147. if ret.Amount > 0 {
  148. return ret, list
  149. }
  150. // 没有上榜数据,需要去DB取
  151. if rankType == RankType_wealth {
  152. _, ret.Amount = cash.GetMoney(userId)
  153. } else {
  154. ret.Amount = getRankInfo(userId, rankType)
  155. }
  156. return ret, list
  157. }
  158. // 领取奖励
  159. func (rl *RankList) award(userId, rankType, doubleFlag int) int {
  160. if doubleFlag != 0 && doubleFlag != 1 {
  161. return 11
  162. }
  163. rl.lock.RLock()
  164. list := rl.Ranks[rankType]
  165. rl.lock.RUnlock()
  166. if len(list) <= 0 {
  167. return 11
  168. }
  169. var awards []item.ItemPack
  170. for _, v := range list {
  171. if v.UserId != userId {
  172. continue
  173. }
  174. // 无效
  175. if v.IsGift == Award_Invalid {
  176. return 11
  177. }
  178. // 已领取完
  179. if v.IsGift == Award_Received {
  180. return 12
  181. }
  182. // 单次领取
  183. if v.IsGift != Award_Available {
  184. return 12
  185. }
  186. v.IsGift = Award_Received
  187. awards = v.Awards
  188. break
  189. }
  190. if len(awards) <= 0 {
  191. return 11
  192. }
  193. // 更新数据库
  194. ret := award(userId, rankType, doubleFlag)
  195. // 发放奖励
  196. if ret == 1 {
  197. item.AddItems(userId, awards, "榜单奖励", common.LOGTYPE_RANK_AWARD)
  198. }
  199. return ret
  200. }
  201. // 积分榜小红点
  202. func (rl *RankList) tip(userId, rankType int) bool {
  203. rl.lock.RLock()
  204. list := rl.Ranks[rankType]
  205. rl.lock.RUnlock()
  206. for _, v := range list {
  207. if v.UserId != userId {
  208. continue
  209. }
  210. if v.IsGift == Award_Available {
  211. return true
  212. }
  213. }
  214. return false
  215. }