ladder_user.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package ladder
  2. import (
  3. "bet24.com/log"
  4. pb "bet24.com/servers/micros/ladderservice/proto"
  5. "sort"
  6. "sync"
  7. "time"
  8. )
  9. const ladderuser_expire_seconds = 1800
  10. type ladderUser struct {
  11. userId int
  12. pb.UserLadderInfo
  13. pb.SettlementRecord
  14. ping int64
  15. userLock *sync.RWMutex
  16. }
  17. func newLadderUser(userId int) *ladderUser {
  18. ret := &ladderUser{userId: userId}
  19. ret.UserLadderInfo = getUserLadderInfo(userId)
  20. ret.UserLadderInfo.Records = getUserLadderSettlementRecord(userId)
  21. ret.LadderInfo = getLadderInfoByPoint(ret.Point)
  22. ret.CurConWin = getConsecutiveMgr().getUserConsecutiveWinCount(userId, 0)
  23. ret.SettlementRecord.Records = nil
  24. ret.userLock = &sync.RWMutex{}
  25. ret.refreshPing()
  26. return ret
  27. }
  28. func (lu *ladderUser) refreshPing() {
  29. lu.ping = time.Now().Unix()
  30. }
  31. func (lu *ladderUser) isExpired() bool {
  32. return time.Now().Unix()-lu.ping > ladderuser_expire_seconds
  33. }
  34. func (lu *ladderUser) dump() {
  35. log.Release(" UserId[%d]MC[%d]W[%d]L[%d]D[%d]", lu.userId, lu.MaxConWin, lu.WinCount, lu.LoseCount, lu.DrawCount)
  36. log.Release(" Point[%d]Ld[%d]Lv[%d]St[%d]", lu.Point, lu.Ladder, lu.Level, lu.Star)
  37. log.Release(" SettlementRecord[%d]Ld[%d]Lv[%d]St[%d]", lu.Point, lu.Ladder, lu.Level, lu.Star)
  38. log.Release(" TotalPoint[%d] WinNumber[%d] WinPoint[%d] LoseNumber[%d] LosePoint[%d] AdditionalPercent[%d]",
  39. lu.TotalPoint, lu.WinNumber, lu.WinPoint, lu.LoseNumber, lu.LosePoint, lu.AdditionalPercent)
  40. log.Release(" Records[%v]", lu.SettlementRecord.Records)
  41. }
  42. // 添加点数,返回是否升级或降级
  43. func (lu *ladderUser) addPoint(point, gameId, winStreakScore, additionalPercent int) bool {
  44. if point == 0 {
  45. return false
  46. }
  47. lu.refreshPing()
  48. oldLadderInfo := lu.LadderInfo
  49. // 刷新局数
  50. if point == 0 {
  51. lu.DrawCount++
  52. } else if point > 0 {
  53. lu.WinCount++
  54. lu.Point += (winStreakScore + point) * (100 + additionalPercent) / 100
  55. } else {
  56. lu.LoseCount++
  57. lu.Point = lu.Point + point
  58. }
  59. lu.LadderInfo = getLadderInfoByPoint(lu.Point)
  60. if lu.LadderInfo.Ladder == 1 && lu.Point < 100 {
  61. lu.Point = 100
  62. }
  63. // 刷新最大连胜
  64. lu.CurConWin = getConsecutiveMgr().getUserConsecutiveWinCount(lu.userId, gameId)
  65. if lu.CurConWin > lu.MaxConWin {
  66. lu.MaxConWin = lu.CurConWin
  67. }
  68. go setUserLadderInfo(lu.userId, lu.UserLadderInfo)
  69. return lu.IsChanged(oldLadderInfo)
  70. }
  71. func (lu *ladderUser) refreshCurConWin() {
  72. lu.CurConWin = getConsecutiveMgr().getUserConsecutiveWinCount(lu.userId, 0)
  73. }
  74. // 获取用户结算记录
  75. func (lu *ladderUser) getSettlementRecord() pb.SettlementRecord {
  76. defer lu.clearRecord()
  77. sort.SliceStable(lu.SettlementRecord.Records, func(i, j int) bool {
  78. return lu.SettlementRecord.Records[i].WinType > lu.SettlementRecord.Records[j].WinType
  79. })
  80. return lu.SettlementRecord
  81. }
  82. func (lu *ladderUser) clearRecord() {
  83. lu.refreshPing()
  84. lu.SettlementRecord = pb.SettlementRecord{}
  85. }
  86. func (lu *ladderUser) addRecord(point, winStreakScore, additionalPercent int) {
  87. lu.SettlementRecord.AdditionalPercent = additionalPercent
  88. if point > 0 {
  89. lu.SettlementRecord.WinNumber++
  90. lu.SettlementRecord.WinPoint += point
  91. lu.SettlementRecord.TotalPoint += (winStreakScore + point) * (100 + additionalPercent) / 100
  92. }
  93. if point < 0 {
  94. lu.SettlementRecord.LoseNumber++
  95. lu.SettlementRecord.LosePoint += point
  96. lu.SettlementRecord.TotalPoint = lu.SettlementRecord.TotalPoint + point
  97. }
  98. // 小于二连胜不进入记录
  99. if lu.CurConWin < 2 {
  100. return
  101. }
  102. defer lu.setHistoricalRecord(winStreakScore, lu.CurConWin)
  103. for k, v := range lu.SettlementRecord.Records {
  104. if v.WinType == lu.CurConWin {
  105. lu.SettlementRecord.Records[k].WinCount++
  106. lu.SettlementRecord.Records[k].Point *= lu.SettlementRecord.Records[k].WinCount
  107. return
  108. }
  109. }
  110. lu.SettlementRecord.Records = append(lu.SettlementRecord.Records, pb.WinningStreak{
  111. Point: winStreakScore,
  112. WinCount: 1,
  113. WinType: lu.CurConWin,
  114. })
  115. }
  116. func (lu *ladderUser) setHistoricalRecord(winStreakScore, winType int) {
  117. for k, v := range lu.UserLadderInfo.Records {
  118. if v.WinType == winType {
  119. lu.UserLadderInfo.Records[k].WinCount++
  120. lu.UserLadderInfo.Records[k].Point *= lu.UserLadderInfo.Records[k].WinCount
  121. setUserLadderSettlementRecord(lu.userId, lu.UserLadderInfo.Records[k].Point, lu.UserLadderInfo.Records[k].WinCount, winType)
  122. return
  123. }
  124. }
  125. lu.UserLadderInfo.Records = append(lu.UserLadderInfo.Records, pb.WinningStreak{
  126. Point: winStreakScore,
  127. WinCount: 1,
  128. WinType: winType,
  129. })
  130. setUserLadderSettlementRecord(lu.userId, winStreakScore, 1, winType)
  131. }
  132. func (lu *ladderUser) getHistoricalRecord() []pb.WinningStreak {
  133. lu.refreshPing()
  134. sort.SliceStable(lu.UserLadderInfo.Records, func(i, j int) bool {
  135. return lu.UserLadderInfo.Records[i].WinType > lu.UserLadderInfo.Records[j].WinType
  136. })
  137. return lu.UserLadderInfo.Records
  138. }