| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- package handler
- import (
- "encoding/json"
- "os"
- "strconv"
- "sync"
- "time"
- "bet24.com/log"
- "bet24.com/servers/common"
- pb "bet24.com/servers/micros/badge/proto"
- platformconfig "bet24.com/servers/micros/platformconfig/proto"
- )
- const config_key = "badge_config"
- var mgr *badgeMgr
- type badgeMgr struct {
- lock *sync.RWMutex // 锁
- sysList []*pb.Badge // 系统徽章列表
- userList map[int]*userInfo // 用户徽章列表
- lastConfigString string
- }
- func newBadgeMgr() {
- mgr = new(badgeMgr)
- mgr.lock = &sync.RWMutex{}
- mgr.userList = make(map[int]*userInfo)
- mgr.loadSysBadgeList()
- mgr.doCheck()
- return
- }
- // 加载系统徽章
- func (b *badgeMgr) loadSysBadgeList() {
- go time.AfterFunc(10*time.Minute, mgr.loadSysBadgeList)
- configString := platformconfig.GetConfig(config_key)
- if configString == "" {
- data, err := os.ReadFile("serviceconf/badge_config.json")
- if err != nil {
- log.Release("read config failed serviceconf/badge_config.json %v", err)
- return
- }
- configString = string(data)
- platformconfig.SetConfig(config_key, configString)
- }
- if configString == b.lastConfigString {
- return
- }
- b.lastConfigString = configString
- err := json.Unmarshal([]byte(configString), &b.sysList)
- if err != nil {
- log.Release("badgeMgr.loadSysBadgeList Unmarshal config [%s] err:%v", configString, err)
- return
- }
- // 刷新榜单数据
- transRefreshRankData()
- return
- }
- // 轮询
- func (b *badgeMgr) doCheck() {
- ticker := time.NewTicker(1 * time.Minute)
- go func(t *time.Ticker) {
- for {
- select {
- case <-t.C:
- b.checkUserExpire()
- }
- }
- }(ticker)
- }
- // 检查用户过期
- func (b *badgeMgr) checkUserExpire() {
- var toRemove []int
- b.lock.RLock()
- // 遍历所有用户
- for _, v := range b.userList {
- // 判断是否过期
- if !v.isExpire() {
- continue
- }
- toRemove = append(toRemove, v.userId)
- v.destructor()
- }
- b.lock.RUnlock()
- if len(toRemove) == 0 {
- return
- }
- b.lock.Lock()
- defer b.lock.Unlock()
- for _, u := range toRemove {
- // 删除
- delete(b.userList, u)
- log.Debug("badgeMgr.checkUserExpire userId=%d 已完成清理", u)
- }
- return
- }
- // 获取系统成就的徽章列表
- func (b *badgeMgr) getSysBadgeList() string {
- d, _ := json.Marshal(b.sysList)
- return string(d)
- }
- // 获取用户
- func (b *badgeMgr) getUser(userId int) *userInfo {
- b.lock.RLock()
- u, ok := b.userList[userId]
- b.lock.RUnlock()
- if ok {
- u.updateTimeStamp()
- return u
- }
- u = newUserInfo(userId)
- b.lock.Lock()
- b.userList[userId] = u
- b.lock.Unlock()
- return u
- }
- // 获取系统成就的徽章信息
- func (b *badgeMgr) getSysBadgeInfo(badgeId int) *pb.Badge {
- for k, v := range b.sysList {
- if v.BadgeId == badgeId {
- return b.sysList[k]
- }
- }
- return nil
- }
- // 获取用户徽章列表
- func (b *badgeMgr) getUserBadgeList(userId int) string {
- u := b.getUser(userId)
- if u == nil {
- log.Debug("badgeMgr.getUserBadgeInfo userId=%d not exist", userId)
- return ""
- }
- list := u.getUserBadgeList()
- d, _ := json.Marshal(list)
- return string(d)
- }
- // 获取用户佩戴与展示的徽章
- func (b *badgeMgr) getBadgeWearAndShow(userId int) []pb.BadgePosition {
- u := b.getUser(userId)
- if u == nil {
- log.Debug("badgeMgr.getBadgeWearAndShow userId=%d not exist", userId)
- return []pb.BadgePosition{}
- }
- return u.getBadgeWearAndShow()
- }
- // 佩戴成就徽章
- func (b *badgeMgr) wearBadge(userId, badgeId, position int) string {
- u := b.getUser(userId)
- if u == nil {
- log.Debug("badgeMgr.wearBadge userId=%d not exist", userId)
- return ""
- }
- list := u.wearBadge(badgeId, position)
- d, _ := json.Marshal(list)
- return string(d)
- }
- // 触发动作(徽章进度)
- func (b *badgeMgr) doAction(userId, action, progress int, param pb.Scope) {
- u := b.getUser(userId)
- if u == nil {
- log.Debug("badgeMgr.doAction userId=%d not exist", userId)
- return
- }
- u.doAction(action, progress, param)
- return
- }
- // 打印用户
- func (b *badgeMgr) dumpUser(param1 string) {
- log.Release("-------------------------------")
- log.Release("badgeMgr.dumpSys success")
- defer func() {
- log.Release("+++++++++++++++++++++++++++++++")
- log.Release("")
- }()
- if param1 == "" {
- b.lock.RLock()
- log.Release(" Total User Count:%d", len(b.userList))
- b.lock.RUnlock()
- return
- }
- var userId int
- var err error
- if param1 != "" {
- userId, err = strconv.Atoi(param1)
- if err != nil {
- log.Release("badgeMgr.dumpUser Parameter invalid. param1[%s]", param1)
- return
- }
- }
- v := b.getUser(userId)
- if v == nil {
- log.Release("badgeMgr.dumpUser user[%d] not exist", userId)
- return
- }
- log.Release("当前用户ID:%d", v.userId)
- for _, info := range v.badgeList {
- log.Release("徽章id:%d", info.BadgeId)
- log.Release("徽章等级:%d", info.Level)
- log.Release("经验值:%d", info.Exps)
- log.Release("成就点数:%d", info.Points)
- log.Release("领取次数:%d", info.Times)
- log.Release("当前位置:%d", info.Position)
- log.Release("是否能佩戴:%v", info.Wearable)
- if info.ExpiresTime > 0 {
- log.Release("过期时间:%s", common.TimeStampToString(int64(info.ExpiresTime)))
- }
- for k, t := range info.UnlockTime {
- log.Release(" 等级[%d],解锁时间:%s", k+1, common.TimeStampToString(int64(t)))
- }
- log.Release("")
- }
- }
- // 打印系统徽章
- func (b *badgeMgr) dumpSys() {
- log.Release("-------------------------------")
- log.Release("badgeMgr.dumpSys success")
- defer func() {
- log.Release("+++++++++++++++++++++++++++++++")
- log.Release("")
- }()
- sysList := b.getSysBadgeList()
- log.Release(sysList)
- }
|