levelmanager.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. package level
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strconv"
  6. "sync"
  7. "bet24.com/log"
  8. pb "bet24.com/servers/micros/userservices/proto"
  9. )
  10. type levelmgr struct {
  11. level_list []pb.LevelInfo
  12. game_list []pb.GameExpInfo
  13. user_list map[int]*userlevel
  14. maxLevel int
  15. lock *sync.RWMutex
  16. }
  17. func newLevelMgr() *levelmgr {
  18. ret := new(levelmgr)
  19. ret.user_list = make(map[int]*userlevel)
  20. ret.lock = &sync.RWMutex{}
  21. ret.loadLevelInfo()
  22. ret.loadGameExpInfo()
  23. return ret
  24. }
  25. func (lm *levelmgr) loadLevelInfo() {
  26. lm.lock.Lock()
  27. defer lm.lock.Unlock()
  28. lm.maxLevel, lm.level_list = getSysLevelList()
  29. fmt.Println("level====", lm.maxLevel, lm.level_list)
  30. }
  31. func (lm *levelmgr) loadGameExpInfo() {
  32. lm.lock.Lock()
  33. defer lm.lock.Unlock()
  34. lm.game_list = getGameExpList()
  35. }
  36. func (lm *levelmgr) onUserEnter(userId int) {
  37. lm.lock.RLock()
  38. _, ok := lm.user_list[userId]
  39. lm.lock.RUnlock()
  40. if ok {
  41. return
  42. }
  43. usr := newUserLevel(userId)
  44. lm.lock.Lock()
  45. lm.user_list[userId] = usr
  46. lm.lock.Unlock()
  47. }
  48. func (lm *levelmgr) onUserExit(userId int) {
  49. lm.lock.Lock()
  50. defer lm.lock.Unlock()
  51. delete(lm.user_list, userId)
  52. }
  53. func (lm *levelmgr) getUser(userId int) *userlevel {
  54. lm.lock.RLock()
  55. user, ok := lm.user_list[userId]
  56. lm.lock.RUnlock()
  57. if !ok {
  58. user = newUserLevel(userId)
  59. if user == nil {
  60. return nil
  61. }
  62. lm.lock.Lock()
  63. lm.user_list[userId] = user
  64. lm.lock.Unlock()
  65. }
  66. return user
  67. }
  68. func (lm *levelmgr) getUserLevel(userId int) pb.LevelBaseInfo {
  69. user := lm.getUser(userId)
  70. if user == nil {
  71. log.Debug("levelmgr.getUserLevel userId=%d not exist", userId)
  72. return user.LevelBaseInfo
  73. }
  74. return user.LevelBaseInfo
  75. }
  76. func (lm *levelmgr) addExperience(userId, exp int) int {
  77. lm.lock.Lock()
  78. user, ok := lm.user_list[userId]
  79. lm.lock.Unlock()
  80. if !ok {
  81. // 用户不存在,直接入库
  82. user = newUserLevel(userId)
  83. }
  84. return user.addExperience(exp)
  85. }
  86. func (lm *levelmgr) addGameExperience(userId, gameId, score int) {
  87. // log.Debug("addGameExperience userId=%d gameId=%d score=%d", userId, gameId, score)
  88. lm.lock.Lock()
  89. user, ok := lm.user_list[userId]
  90. lm.lock.Unlock()
  91. if !ok {
  92. // 用户不存在,直接入库
  93. user = newUserLevel(userId)
  94. }
  95. // 获取经验值
  96. exp := lm.getExps(gameId, score)
  97. // log.Debug("addGameExperience userId=%d gameId=%d score=%d exp=%d", userId, gameId, score, exp)
  98. if exp <= 0 {
  99. return
  100. }
  101. // 加经验
  102. user.addExperience(exp)
  103. }
  104. // 根据游戏ID获取经验值
  105. func (lm *levelmgr) getExps(gameId, score int) int {
  106. for _, v := range lm.game_list {
  107. if v.GameID == gameId {
  108. if score > 0 {
  109. return v.WinExp
  110. }
  111. return v.LoseExp
  112. }
  113. }
  114. return 0
  115. }
  116. func (lm *levelmgr) getLevelList() string {
  117. lm.lock.RLock()
  118. d, _ := json.Marshal(lm.level_list)
  119. lm.lock.RUnlock()
  120. return string(d)
  121. }
  122. func (lm *levelmgr) getLevelByExperience(exp int) int {
  123. lm.lock.RLock()
  124. defer lm.lock.RUnlock()
  125. ret := 0
  126. for _, v := range lm.level_list {
  127. if exp < v.Exp {
  128. continue
  129. }
  130. if v.Level <= ret {
  131. continue
  132. }
  133. ret = v.Level
  134. }
  135. return ret
  136. }
  137. func (lm *levelmgr) getLevelInfo(level int) pb.LevelInfo {
  138. for _, v := range lm.level_list {
  139. if v.Level == level {
  140. return v
  141. }
  142. }
  143. log.Debug("levelmgr.getLevelInfo level not found [%d]", level)
  144. return pb.LevelInfo{}
  145. }
  146. // 是否显示游戏大厅
  147. func (lm *levelmgr) isShowGameHall(userId int) bool {
  148. // log.Debug("isShowGameHall userId=%d", userId)
  149. user := lm.getUser(userId)
  150. if user == nil {
  151. log.Debug("levelmgr.isShowGameHall userId=%d not exist", userId)
  152. return false
  153. }
  154. return user.isShow()
  155. }
  156. // 判断是否开启元宝大厅
  157. func (lm *levelmgr) isOpen(level int) bool {
  158. for _, v := range lm.level_list {
  159. if v.Level != level {
  160. continue
  161. }
  162. for _, k := range v.Privileges {
  163. if k.Privilege == pb.LevelPrivilege_ShowGameHall {
  164. return true
  165. }
  166. }
  167. return false
  168. }
  169. return false
  170. }
  171. func (lm *levelmgr) loginAward(userId int) (bool, int) {
  172. user := lm.getUser(userId)
  173. if user == nil {
  174. log.Debug("levelmgr.loginAward userId=%d not exist", userId)
  175. return false, 0
  176. }
  177. return user.loginAward()
  178. }
  179. func (lm *levelmgr) dumpSys(param string) {
  180. log.Release("-------------------------------")
  181. log.Release("levelmgr.dumpSys %s", param)
  182. defer func() {
  183. log.Release("+++++++++++++++++++++++++++++++")
  184. log.Release("")
  185. }()
  186. log.Release(lm.getLevelList())
  187. }
  188. func (lm *levelmgr) dumpUser(param string) {
  189. log.Release("-------------------------------")
  190. log.Release("levelmgr.dumpUser %s", param)
  191. defer func() {
  192. log.Release("+++++++++++++++++++++++++++++++")
  193. log.Release("")
  194. }()
  195. var userId int
  196. var err error
  197. if userId, err = strconv.Atoi(param); err != nil {
  198. log.Release("atoi error %v", err)
  199. return
  200. }
  201. uv := lm.getUser(userId)
  202. if uv == nil {
  203. log.Release("user %d not exist", userId)
  204. return
  205. }
  206. uv.dump()
  207. }