| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- package level
- import (
- "encoding/json"
- "fmt"
- "strconv"
- "sync"
- "bet24.com/log"
- pb "bet24.com/servers/micros/userservices/proto"
- )
- type levelmgr struct {
- level_list []pb.LevelInfo
- game_list []pb.GameExpInfo
- user_list map[int]*userlevel
- maxLevel int
- lock *sync.RWMutex
- }
- func newLevelMgr() *levelmgr {
- ret := new(levelmgr)
- ret.user_list = make(map[int]*userlevel)
- ret.lock = &sync.RWMutex{}
- ret.loadLevelInfo()
- ret.loadGameExpInfo()
- return ret
- }
- func (lm *levelmgr) loadLevelInfo() {
- lm.lock.Lock()
- defer lm.lock.Unlock()
- lm.maxLevel, lm.level_list = getSysLevelList()
- fmt.Println("level====", lm.maxLevel, lm.level_list)
- }
- func (lm *levelmgr) loadGameExpInfo() {
- lm.lock.Lock()
- defer lm.lock.Unlock()
- lm.game_list = getGameExpList()
- }
- func (lm *levelmgr) onUserEnter(userId int) {
- lm.lock.RLock()
- _, ok := lm.user_list[userId]
- lm.lock.RUnlock()
- if ok {
- return
- }
- usr := newUserLevel(userId)
- lm.lock.Lock()
- lm.user_list[userId] = usr
- lm.lock.Unlock()
- }
- func (lm *levelmgr) onUserExit(userId int) {
- lm.lock.Lock()
- defer lm.lock.Unlock()
- delete(lm.user_list, userId)
- }
- func (lm *levelmgr) getUser(userId int) *userlevel {
- lm.lock.RLock()
- user, ok := lm.user_list[userId]
- lm.lock.RUnlock()
- if !ok {
- user = newUserLevel(userId)
- if user == nil {
- return nil
- }
- lm.lock.Lock()
- lm.user_list[userId] = user
- lm.lock.Unlock()
- }
- return user
- }
- func (lm *levelmgr) getUserLevel(userId int) pb.LevelBaseInfo {
- user := lm.getUser(userId)
- if user == nil {
- log.Debug("levelmgr.getUserLevel userId=%d not exist", userId)
- return user.LevelBaseInfo
- }
- return user.LevelBaseInfo
- }
- func (lm *levelmgr) addExperience(userId, exp int) int {
- lm.lock.Lock()
- user, ok := lm.user_list[userId]
- lm.lock.Unlock()
- if !ok {
- // 用户不存在,直接入库
- user = newUserLevel(userId)
- }
- return user.addExperience(exp)
- }
- func (lm *levelmgr) addGameExperience(userId, gameId, score int) {
- // log.Debug("addGameExperience userId=%d gameId=%d score=%d", userId, gameId, score)
- lm.lock.Lock()
- user, ok := lm.user_list[userId]
- lm.lock.Unlock()
- if !ok {
- // 用户不存在,直接入库
- user = newUserLevel(userId)
- }
- // 获取经验值
- exp := lm.getExps(gameId, score)
- // log.Debug("addGameExperience userId=%d gameId=%d score=%d exp=%d", userId, gameId, score, exp)
- if exp <= 0 {
- return
- }
- // 加经验
- user.addExperience(exp)
- }
- // 根据游戏ID获取经验值
- func (lm *levelmgr) getExps(gameId, score int) int {
- for _, v := range lm.game_list {
- if v.GameID == gameId {
- if score > 0 {
- return v.WinExp
- }
- return v.LoseExp
- }
- }
- return 0
- }
- func (lm *levelmgr) getLevelList() string {
- lm.lock.RLock()
- d, _ := json.Marshal(lm.level_list)
- lm.lock.RUnlock()
- return string(d)
- }
- func (lm *levelmgr) getLevelByExperience(exp int) int {
- lm.lock.RLock()
- defer lm.lock.RUnlock()
- ret := 0
- for _, v := range lm.level_list {
- if exp < v.Exp {
- continue
- }
- if v.Level <= ret {
- continue
- }
- ret = v.Level
- }
- return ret
- }
- func (lm *levelmgr) getLevelInfo(level int) pb.LevelInfo {
- for _, v := range lm.level_list {
- if v.Level == level {
- return v
- }
- }
- log.Debug("levelmgr.getLevelInfo level not found [%d]", level)
- return pb.LevelInfo{}
- }
- // 是否显示游戏大厅
- func (lm *levelmgr) isShowGameHall(userId int) bool {
- // log.Debug("isShowGameHall userId=%d", userId)
- user := lm.getUser(userId)
- if user == nil {
- log.Debug("levelmgr.isShowGameHall userId=%d not exist", userId)
- return false
- }
- return user.isShow()
- }
- // 判断是否开启元宝大厅
- func (lm *levelmgr) isOpen(level int) bool {
- for _, v := range lm.level_list {
- if v.Level != level {
- continue
- }
- for _, k := range v.Privileges {
- if k.Privilege == pb.LevelPrivilege_ShowGameHall {
- return true
- }
- }
- return false
- }
- return false
- }
- func (lm *levelmgr) loginAward(userId int) (bool, int) {
- user := lm.getUser(userId)
- if user == nil {
- log.Debug("levelmgr.loginAward userId=%d not exist", userId)
- return false, 0
- }
- return user.loginAward()
- }
- func (lm *levelmgr) dumpSys(param string) {
- log.Release("-------------------------------")
- log.Release("levelmgr.dumpSys %s", param)
- defer func() {
- log.Release("+++++++++++++++++++++++++++++++")
- log.Release("")
- }()
- log.Release(lm.getLevelList())
- }
- func (lm *levelmgr) dumpUser(param string) {
- log.Release("-------------------------------")
- log.Release("levelmgr.dumpUser %s", param)
- defer func() {
- log.Release("+++++++++++++++++++++++++++++++")
- log.Release("")
- }()
- var userId int
- var err error
- if userId, err = strconv.Atoi(param); err != nil {
- log.Release("atoi error %v", err)
- return
- }
- uv := lm.getUser(userId)
- if uv == nil {
- log.Release("user %d not exist", userId)
- return
- }
- uv.dump()
- }
|