| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- package rank
- import (
- "sync"
- "time"
- audioroomPb "bet24.com/servers/micros/audioroom/proto"
- badge "bet24.com/servers/micros/badge/proto"
- "bet24.com/servers/common"
- item "bet24.com/servers/micros/item_inventory/proto"
- cash "bet24.com/servers/micros/money/proto"
- "bet24.com/log"
- _ "bet24.com/servers/coreservice/friend"
- user "bet24.com/servers/micros/userservices/proto"
- )
- var Ranks *RankList
- type RankList struct {
- Ranks map[int][]*rankItem // 榜单类型--榜单列表
- RankHistory map[string][]*rankHistoryItem // 榜单历史
- lock *sync.RWMutex
- }
- func NewRankList() *RankList {
- obj := new(RankList)
- obj.Ranks = make(map[int][]*rankItem)
- obj.RankHistory = make(map[string][]*rankHistoryItem)
- obj.lock = &sync.RWMutex{}
- return obj
- }
- func (rl *RankList) Run() {
- rl.refreshData()
- }
- func (rl *RankList) refreshData() {
- go rl.doRefresh()
- time.AfterFunc(3*time.Second, rl.refreshData)
- }
- func (rl *RankList) doRefresh() {
- ranks := make(map[int][]*rankItem)
- for _, v := range getRankList() {
- // 语聊房榜单涉及到房间信息处理
- if v.RankType == RankType_audioRoom_lastWeek ||
- v.RankType == RankType_audioRoom_thisWeek ||
- v.RankType == RankType_audioRoom_consumeDiamond_day ||
- v.RankType == RankType_audioRoom_consumeDiamond_week ||
- v.RankType == RankType_audioRoom_consumeDiamond_month {
- // 获取语聊房信息
- r := audioroomPb.GetRoom(v.UserId)
- if r.RoomInfo == nil {
- log.Debug("rankList.doRefresh roomId=%d ==> %+v", v.UserId, v)
- continue
- }
- rankItem := &rankItem{
- RankType: v.RankType,
- Rank: v.Rank,
- Amount: v.Amount,
- UserHotInfo: user.UserHotInfo{
- UserId: r.RoomInfo.RoomId,
- NickName: r.RoomInfo.RoomName,
- FaceUrl: r.RoomInfo.RoomImg,
- },
- AwardItem: AwardItem{
- IsGift: v.IsGift,
- Awards: Awards.getAwards(v.RankType, v.Rank),
- },
- crdate: v.crdate,
- }
- ranks[v.RankType] = append(ranks[v.RankType], rankItem)
- continue
- }
- u := user.GetUserInfo(v.UserId)
- if u == nil {
- log.Debug("rankList.doRefresh userId=%d ==> %+v", v.UserId, v)
- continue
- }
- rankItem := &rankItem{
- RankType: v.RankType,
- Rank: v.Rank,
- Amount: v.Amount,
- UserHotInfo: user.UserHotInfo{
- UserId: v.UserId,
- NickName: u.NickName,
- FaceId: u.FaceId,
- FaceUrl: u.FaceUrl,
- Sex: u.Sex,
- UserWords: u.UserWords,
- Vip: u.Vip,
- Decorations: u.Decorations,
- Badges: u.Badges,
- Charm: u.Charm,
- VipExpire: u.VipExpire,
- },
- AwardItem: AwardItem{
- IsGift: v.IsGift,
- Awards: Awards.getAwards(v.RankType, v.Rank),
- },
- crdate: v.crdate,
- }
- ranks[v.RankType] = append(ranks[v.RankType], rankItem)
- }
- now := common.GetNowTime()
- // 只取零点且前三十分钟的数据才有效[00:30]
- if now.Hour() == 0 && now.Minute() > 5 && now.Minute() < 30 {
- // 榜单触发荣誉徽章(主要是周榜)
- for _, rankType := range badgeRankArray {
- // 榜单
- if badgeRanks := ranks[rankType]; len(badgeRanks) > 0 {
- for _, v := range badgeRanks {
- // 徽章进度(只统计周榜)
- go badge.DoAction(v.UserId, badge.Action_Ranking, 0, badge.Scope{
- RankCrdate: v.crdate,
- RankInfo: badge.RankInfo{
- Type: v.RankType,
- Rank: v.Rank,
- },
- })
- }
- }
- }
- }
- rl.lock.Lock()
- defer rl.lock.Unlock()
- rl.Ranks = ranks
- }
- // 获取排行榜列表
- func (rl *RankList) getRankList(userId, rankType, num int) (*AwardItem, []*rankItem) {
- var list []*rankItem
- rl.lock.RLock()
- if num > 0 && len(rl.Ranks[rankType]) >= num {
- list = rl.Ranks[rankType][:num]
- } else {
- list = rl.Ranks[rankType]
- }
- rl.lock.RUnlock()
- ret := new(AwardItem)
- for _, v := range list {
- if v.UserId != userId {
- //v.IsFriend = friend.IfFriend(userId, v.UserId)
- v.IsGift = Award_Invalid
- continue
- }
- ret.Amount = v.Amount
- ret.IsGift = v.IsGift
- ret.Awards = v.Awards
- // log.Debug("getRankList userId=%d rankType=%d v=%+v ret=%+v", userId, rankType, v, ret)
- // 没有奖励
- if ret.Awards == nil {
- ret.IsGift = Award_Invalid
- }
- }
- if ret.Amount > 0 {
- return ret, list
- }
- // 没有上榜数据,需要去DB取
- if rankType == RankType_wealth {
- _, ret.Amount = cash.GetMoney(userId)
- } else {
- ret.Amount = getRankInfo(userId, rankType)
- }
- return ret, list
- }
- // 领取奖励
- func (rl *RankList) award(userId, rankType, doubleFlag int) int {
- if doubleFlag != 0 && doubleFlag != 1 {
- return 11
- }
- rl.lock.RLock()
- list := rl.Ranks[rankType]
- rl.lock.RUnlock()
- if len(list) <= 0 {
- return 11
- }
- var awards []item.ItemPack
- for _, v := range list {
- if v.UserId != userId {
- continue
- }
- // 无效
- if v.IsGift == Award_Invalid {
- return 11
- }
- // 已领取完
- if v.IsGift == Award_Received {
- return 12
- }
- // 单次领取
- if v.IsGift != Award_Available {
- return 12
- }
- v.IsGift = Award_Received
- awards = v.Awards
- break
- }
- if len(awards) <= 0 {
- return 11
- }
- // 更新数据库
- ret := award(userId, rankType, doubleFlag)
- // 发放奖励
- if ret == 1 {
- item.AddItems(userId, awards, "榜单奖励", common.LOGTYPE_RANK_AWARD)
- }
- return ret
- }
- // 积分榜小红点
- func (rl *RankList) tip(userId, rankType int) bool {
- rl.lock.RLock()
- list := rl.Ranks[rankType]
- rl.lock.RUnlock()
- for _, v := range list {
- if v.UserId != userId {
- continue
- }
- if v.IsGift == Award_Available {
- return true
- }
- }
- return false
- }
|