| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- package levelrewards
- import (
- "encoding/json"
- "os"
- "strconv"
- "sync"
- "time"
- "bet24.com/log"
- coreClient "bet24.com/servers/coreservice/client"
- "bet24.com/servers/coreservice/shop"
- pb "bet24.com/servers/micros/activityservice/proto"
- item "bet24.com/servers/micros/item_inventory/proto"
- platformconfig "bet24.com/servers/micros/platformconfig/proto"
- )
- var mgr *levelrewardsMgr
- const config_key = "activity_levelrewards"
- func getManager() *levelrewardsMgr {
- if mgr == nil {
- mgr = new(levelrewardsMgr)
- mgr.ctor()
- }
- return mgr
- }
- type levelrewardsMgr struct {
- configString string
- lock *sync.RWMutex
- userList map[int]*userTask
- pb.LevelRewards
- }
- func (lvr *levelrewardsMgr) ctor() {
- lvr.lock = &sync.RWMutex{}
- lvr.userList = make(map[int]*userTask)
- lvr.readConf()
- lvr.checkExpiredUsers()
- }
- func (lvr *levelrewardsMgr) readConf() {
- time.AfterFunc(time.Second*600, lvr.readConf)
- configString := platformconfig.GetConfig(config_key)
- //if configString == "" {
- data, err := os.ReadFile("serviceconf/activity_levelrewards.json")
- if err != nil {
- log.Release("levelrewards.readConf read config failed")
- return
- }
- configString = string(data)
- if configString != "" {
- platformconfig.SetConfig(config_key, configString)
- }
- //}
- if configString == lvr.configString {
- return
- }
- lvr.configString = configString
- // 读取配置
- err = json.Unmarshal([]byte(configString), &lvr.LevelRewards)
- if err != nil {
- log.Release("levelrewards.readConf Unmarshal failed %s", configString)
- }
- lvr.loadProductItem()
- }
- func (lvr *levelrewardsMgr) checkExpiredUsers() {
- time.AfterFunc(time.Second*600, lvr.checkExpiredUsers)
- var toRemove []int
- lvr.lock.RLock()
- for k, v := range lvr.userList {
- if v.isExpire() {
- toRemove = append(toRemove, k)
- }
- }
- lvr.lock.RUnlock()
- if len(toRemove) == 0 {
- return
- }
- log.Debug("levelrewards.checkExpiredUsers removing %v", toRemove)
- lvr.lock.Lock()
- for _, v := range toRemove {
- delete(lvr.userList, v)
- }
- lvr.lock.Unlock()
- }
- // 加载产品道具
- func (lvr *levelrewardsMgr) loadProductItem() {
- respProduct := coreClient.GetProduct(0, 0, lvr.LevelRewards.ProductPrice.ProductId)
- if respProduct.RetCode != 1 {
- return
- }
- var itemInfo shop.Shop_Item
- if err := json.Unmarshal([]byte(respProduct.Data), &itemInfo); err != nil {
- log.Error("%s GetProduct json unmarshal err %v", "userTask.loadProductItem", err)
- return
- }
- lvr.LevelRewards.ProductPrice.Price = itemInfo.Price
- lvr.LevelRewards.ProductPrice.Items = itemInfo.Extra
- }
- func (lvr *levelrewardsMgr) dumpSys() {
- log.Release("-------------------------------")
- log.Release("levelrewards.dumpSys")
- defer func() {
- log.Release("+++++++++++++++++++++++++++++++")
- log.Release("")
- }()
- d, _ := json.Marshal(lvr.LevelRewards)
- log.Release(string(d))
- return
- }
- func (lvr *levelrewardsMgr) dumpUser(param string) {
- log.Release("-------------------------------")
- log.Release("levelrewards.dumpUser %s", param)
- defer func() {
- log.Release("+++++++++++++++++++++++++++++++")
- log.Release("")
- }()
- if param == "" {
- lvr.lock.RLock()
- log.Release(" Total User Count:%d", len(lvr.userList))
- lvr.lock.RUnlock()
- return
- }
- var userId int
- var err error
- if userId, err = strconv.Atoi(param); err != nil {
- log.Release("atoi error %v", err)
- return
- }
- lvr.lock.RLock()
- u, ok := lvr.userList[userId]
- lvr.lock.RUnlock()
- if !ok {
- log.Release("User does not exist!")
- return
- }
- u.dump()
- }
- func (lvr *levelrewardsMgr) clear(userId int) {
- lvr.lock.Lock()
- defer lvr.lock.Unlock()
- delete(lvr.userList, userId)
- }
- func (lvr *levelrewardsMgr) getSysLevelRewards() pb.LevelRewards {
- return lvr.LevelRewards
- }
- func (lvr *levelrewardsMgr) getSysTask(level int) pb.LevelTask {
- for k, v := range lvr.LevelRewards.Tasks {
- if v.Level == level {
- return lvr.LevelRewards.Tasks[k]
- }
- }
- return pb.LevelTask{}
- }
- func (lvr *levelrewardsMgr) getSysTaskLevel(level int) int {
- var sysLevel int
- for _, v := range lvr.LevelRewards.Tasks {
- if level < v.Level {
- continue
- }
- sysLevel = v.Level
- }
- return sysLevel
- }
- func (lvr *levelrewardsMgr) getUserTask(userId int) *userTask {
- lvr.lock.RLock()
- u, ok := lvr.userList[userId]
- lvr.lock.RUnlock()
- if ok {
- u.updateTimeStamp()
- return u
- }
- u = newUserTask(userId)
- lvr.lock.Lock()
- lvr.userList[userId] = u
- lvr.lock.Unlock()
- return u
- }
- func (lvr *levelrewardsMgr) getLevelRewards(userId int) string {
- u := lvr.getUserTask(userId)
- ret := u.getLevelRewards()
- jsonRet, _ := json.Marshal(ret)
- return string(jsonRet)
- }
- func (lvr *levelrewardsMgr) claimLevelRewards(userId, level int, isAll bool) (bool, []item.ItemPack) {
- u := lvr.getUserTask(userId)
- return u.claimLevelRewards(level, isAll)
- }
- func (lvr *levelrewardsMgr) isLevelRewardsTip(userId int) bool {
- u := lvr.getUserTask(userId)
- return u.isLevelRewardsTip()
- }
- func (lvr *levelrewardsMgr) onUserLevelChange(userId, oldLevel, newLevel int) {
- u := lvr.getUserTask(userId)
- u.onUserLevelChange(oldLevel, newLevel)
- return
- }
|