individualwaterpoolmgr.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package individualwaterpool
  2. import (
  3. "math/rand"
  4. "strconv"
  5. "sync"
  6. "bet24.com/log"
  7. pb "bet24.com/servers/micros/waterpool/proto"
  8. )
  9. var mgr *waterPoolMgr
  10. type waterPoolMgr struct {
  11. lock *sync.RWMutex
  12. userList map[int]*userWaterPool // 个人奖池信息
  13. config IndividualPoolConfig
  14. }
  15. func newWaterPoolManager() *waterPoolMgr {
  16. mgr = new(waterPoolMgr)
  17. mgr.lock = &sync.RWMutex{}
  18. mgr.userList = make(map[int]*userWaterPool)
  19. mgr.loadConfig()
  20. return mgr
  21. }
  22. // 用户进入,创建用户信息
  23. func (wpm *waterPoolMgr) addUser(userId int) {
  24. wpm.lock.RLock()
  25. _, ok := wpm.userList[userId]
  26. wpm.lock.RUnlock()
  27. if ok {
  28. return
  29. }
  30. wpm.lock.Lock()
  31. wpm.userList[userId] = newUserWaterPool(userId)
  32. wpm.lock.Unlock()
  33. }
  34. // 将用户标记为离线
  35. func (wpm *waterPoolMgr) removeUser(userId int) {
  36. wpm.lock.Lock()
  37. defer wpm.lock.Unlock()
  38. delete(wpm.userList, userId)
  39. }
  40. func (wpm *waterPoolMgr) getUserPoolType(userId, gameId, gameType, baseScore, gold int, isMatch bool, param int) (int, int) {
  41. if wpm.config.ConstantK <= 0 || baseScore <= 0 || gold <= 0 {
  42. return pb.PoolControl_Normal, 0
  43. }
  44. wpm.lock.RLock()
  45. u, ok := wpm.userList[userId]
  46. wpm.lock.RUnlock()
  47. if !ok {
  48. wpm.lock.Lock()
  49. wpm.userList[userId] = newUserWaterPool(userId)
  50. wpm.lock.Unlock()
  51. wpm.lock.RLock()
  52. u, ok = wpm.userList[userId]
  53. wpm.lock.RUnlock()
  54. if !ok {
  55. return pb.PoolControl_Normal, 0
  56. }
  57. }
  58. if u.poolType <= pb.PoolControl_Normal || u.poolValue == 0 {
  59. return pb.PoolControl_Normal, 0
  60. }
  61. gameCoefficient, minValue := wpm.config.getGameCoefficient(gameId, gameType, baseScore, isMatch)
  62. gameCoefficient *= 10000
  63. poolValue := u.poolValue
  64. if poolValue < 0 {
  65. poolValue = -poolValue
  66. }
  67. if poolValue < minValue {
  68. return pb.PoolControl_Normal, 0
  69. }
  70. value := baseScore
  71. if param > 0 {
  72. value = param
  73. }
  74. prob := (poolValue*value*(int(gameCoefficient)))/(gold*wpm.config.ConstantK) + wpm.config.MinProb*100
  75. if prob > wpm.config.MaxProb*100 && wpm.config.MaxProb > 0 {
  76. prob = wpm.config.MaxProb * 100
  77. }
  78. r := rand.Intn(10000)
  79. if r >= prob {
  80. return pb.PoolControl_Normal, 0
  81. }
  82. if u.poolType == pb.PoolControl_Lose {
  83. prob = -prob
  84. }
  85. return u.poolType, prob
  86. }
  87. func (wpm *waterPoolMgr) grantNewWaterPool(userId, value int, genType string) {
  88. wpm.lock.RLock()
  89. u, ok := wpm.userList[userId]
  90. wpm.lock.RUnlock()
  91. if !ok {
  92. wpm.lock.Lock()
  93. wpm.userList[userId] = newUserWaterPool(userId)
  94. wpm.lock.Unlock()
  95. wpm.lock.RLock()
  96. u, ok = wpm.userList[userId]
  97. wpm.lock.RUnlock()
  98. if !ok {
  99. return
  100. }
  101. }
  102. u.grantNewWaterPool(value, genType)
  103. if value > 0 {
  104. go trans_updataTotalWaterPoolInfo(value, 0, 0, 0, value)
  105. } else {
  106. go trans_updataTotalWaterPoolInfo(0, 0, -value, 0, -value)
  107. }
  108. }
  109. func (wpm *waterPoolMgr) updataUserWaterPool(userId, amount int, genType string, roomType, roomID int) {
  110. if amount == 0 {
  111. return
  112. }
  113. wpm.lock.RLock()
  114. u, ok := wpm.userList[userId]
  115. wpm.lock.RUnlock()
  116. if !ok {
  117. wpm.lock.Lock()
  118. wpm.userList[userId] = newUserWaterPool(userId)
  119. wpm.lock.Unlock()
  120. wpm.lock.RLock()
  121. u, ok = wpm.userList[userId]
  122. wpm.lock.RUnlock()
  123. if !ok {
  124. return
  125. }
  126. }
  127. u.updataWaterPool(amount, genType, roomType, roomID)
  128. }
  129. func (wpm *waterPoolMgr) getUserWaterPool(userId int) int {
  130. wpm.lock.RLock()
  131. u, ok := wpm.userList[userId]
  132. wpm.lock.RUnlock()
  133. if !ok {
  134. wpm.lock.Lock()
  135. wpm.userList[userId] = newUserWaterPool(userId)
  136. wpm.lock.Unlock()
  137. wpm.lock.RLock()
  138. u, ok = wpm.userList[userId]
  139. wpm.lock.RUnlock()
  140. if !ok {
  141. return 0
  142. }
  143. }
  144. return u.poolValue
  145. }
  146. func (wpm *waterPoolMgr) getUserWaterPoolGrantRecords(userId, beginTime, endTime, pageIndex, pageSize int) pb.GrantRecords {
  147. return trans_getUserWaterPoolInfoGrantRecord(userId, beginTime, endTime, pageIndex, pageSize)
  148. }
  149. func (wpm *waterPoolMgr) dumpUser(param string) {
  150. userId, _ := strconv.Atoi(param)
  151. wpm.lock.RLock()
  152. u, ok := wpm.userList[userId]
  153. wpm.lock.RUnlock()
  154. if !ok {
  155. return
  156. }
  157. log.Release("UserId[%d] poolType[%s] poolValue[%d]", u.userId, u.getPoolTypeDesc(), u.poolValue)
  158. }