ladder_manager.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package ladder
  2. import (
  3. "bet24.com/log"
  4. pb "bet24.com/servers/micros/ladderservice/proto"
  5. notification "bet24.com/servers/micros/notification/proto"
  6. "encoding/json"
  7. "strconv"
  8. "sync"
  9. "time"
  10. )
  11. var ldm *ladderMgr
  12. func getLadderManager() *ladderMgr {
  13. if ldm == nil {
  14. ldm = new(ladderMgr)
  15. ldm.ctor()
  16. }
  17. return ldm
  18. }
  19. type ladderMgr struct {
  20. lock *sync.RWMutex
  21. userlist map[int]*ladderUser
  22. }
  23. func (lm *ladderMgr) ctor() {
  24. lm.lock = &sync.RWMutex{}
  25. lm.userlist = make(map[int]*ladderUser)
  26. lm.checkExpireUser()
  27. }
  28. func (lm *ladderMgr) checkExpireUser() {
  29. time.AfterFunc(10*time.Minute, lm.checkExpireUser)
  30. var toRemove []int
  31. lm.lock.RLock()
  32. for k, v := range lm.userlist {
  33. if v.isExpired() {
  34. toRemove = append(toRemove, k)
  35. }
  36. }
  37. lm.lock.RUnlock()
  38. if len(toRemove) == 0 {
  39. return
  40. }
  41. log.Release("ladderMgr.checkExpireUser removing %v", toRemove)
  42. lm.lock.Lock()
  43. for _, v := range toRemove {
  44. delete(lm.userlist, v)
  45. }
  46. lm.lock.Unlock()
  47. }
  48. func (lm *ladderMgr) getLadderUser(userId int) *ladderUser {
  49. lm.lock.RLock()
  50. ur, ok := lm.userlist[userId]
  51. lm.lock.RUnlock()
  52. if !ok {
  53. ur = lm.loadLadderUser(userId)
  54. lm.lock.Lock()
  55. lm.userlist[userId] = ur
  56. lm.lock.Unlock()
  57. }
  58. return ur
  59. }
  60. func (lm *ladderMgr) loadLadderUser(userId int) *ladderUser {
  61. return newLadderUser(userId)
  62. }
  63. func (lm *ladderMgr) getUserLadderInfo(userId int) *pb.UserLadderInfo {
  64. u := lm.getLadderUser(userId)
  65. u.refreshPing()
  66. return &u.UserLadderInfo
  67. }
  68. func (lm *ladderMgr) dumpUser(param string) {
  69. log.Release("-------------------------------")
  70. log.Release("ladderMgr.dumpUser %s", param)
  71. defer func() {
  72. log.Release("+++++++++++++++++++++++++++++++")
  73. log.Release("")
  74. }()
  75. var userId int
  76. var err error
  77. if userId, err = strconv.Atoi(param); err != nil {
  78. log.Release("atoi error %v", err)
  79. return
  80. }
  81. lm.getLadderUser(userId).dump()
  82. }
  83. func (lm *ladderMgr) dumpCal(param string) {
  84. log.Release("-------------------------------")
  85. log.Release("ladderMgr.dumpCal %s", param)
  86. defer func() {
  87. log.Release("+++++++++++++++++++++++++++++++")
  88. log.Release("")
  89. }()
  90. var point int
  91. var err error
  92. if point, err = strconv.Atoi(param); err != nil {
  93. log.Release("atoi error %v", err)
  94. return
  95. }
  96. log.Release(" point[%d] ladder[%v]", point, getLadderInfoByPoint(point))
  97. }
  98. func (lm *ladderMgr) addUserScore(userId int, gameId int, score int, roomName string) (int, bool) {
  99. log.Debug("ladderMgr.addUserScore userId[%d] score[%d]", userId, score)
  100. usr := lm.getLadderUser(userId)
  101. // 加入连胜
  102. getConsecutiveMgr().addUserRecord(userId, gameId, score)
  103. // 计算分数
  104. var point int
  105. if score == 0 {
  106. point = 0
  107. } else if score < 0 {
  108. point = getLadderConfig().LosePoint
  109. } else {
  110. point = getLadderConfig().WinPoint
  111. }
  112. // 先获取当前连胜次数
  113. conWinCount := getConsecutiveMgr().getUserConsecutiveWinCount(userId, gameId)
  114. additionalPercent := getRoomManager().getRoomAdditionalPercent(gameId, roomName)
  115. winStreakScore := getLadderConfig().getConsecutiveWinAdditionalPoint(conWinCount)
  116. oldLadderInfo := usr.UserLadderInfo
  117. levelChanged := usr.addPoint(point, gameId, winStreakScore, additionalPercent)
  118. usr.addRecord(point, winStreakScore, additionalPercent)
  119. ladderChange := struct {
  120. Old pb.UserLadderInfo
  121. New pb.UserLadderInfo
  122. }{Old: oldLadderInfo, New: usr.UserLadderInfo}
  123. d, _ := json.Marshal(ladderChange)
  124. notification.AddNotification(userId, notification.Notification_LadderChanged, string(d))
  125. return point, levelChanged
  126. }
  127. func (lm *ladderMgr) refreshCurConWin(userId int) {
  128. lm.getLadderUser(userId).refreshCurConWin()
  129. }
  130. func (lm *ladderMgr) getSettlementRecord(userId int) pb.SettlementRecord {
  131. u := lm.getLadderUser(userId)
  132. return u.getSettlementRecord()
  133. }
  134. func (lm *ladderMgr) getHistoricalRecord(userId int) []pb.WinningStreak {
  135. u := lm.getLadderUser(userId)
  136. return u.getHistoricalRecord()
  137. }
  138. func getLadderInfoByPoint(point int) pb.LadderInfo {
  139. var ret pb.LadderInfo
  140. for _, ladder := range getLadderConfig().LadderConfigs {
  141. for _, level := range ladder.Levels {
  142. for _, star := range level.Stars {
  143. if point >= star.Point || ret.Ladder == 0 {
  144. ret.Ladder = ladder.Ladder
  145. ret.Level = level.Level
  146. ret.Star = star.Star
  147. } else {
  148. break
  149. }
  150. }
  151. }
  152. }
  153. return ret
  154. }
  155. func (lm *ladderMgr) getUserLock(userId int) *sync.RWMutex {
  156. u := lm.getLadderUser(userId)
  157. if u == nil {
  158. return nil
  159. }
  160. return u.userLock
  161. }