| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- package individualwaterpool
- import (
- "math/rand"
- "strconv"
- "sync"
- "bet24.com/log"
- pb "bet24.com/servers/micros/waterpool/proto"
- )
- var mgr *waterPoolMgr
- type waterPoolMgr struct {
- lock *sync.RWMutex
- userList map[int]*userWaterPool // 个人奖池信息
- config IndividualPoolConfig
- }
- func newWaterPoolManager() *waterPoolMgr {
- mgr = new(waterPoolMgr)
- mgr.lock = &sync.RWMutex{}
- mgr.userList = make(map[int]*userWaterPool)
- mgr.loadConfig()
- return mgr
- }
- // 用户进入,创建用户信息
- func (wpm *waterPoolMgr) addUser(userId int) {
- wpm.lock.RLock()
- _, ok := wpm.userList[userId]
- wpm.lock.RUnlock()
- if ok {
- return
- }
- wpm.lock.Lock()
- wpm.userList[userId] = newUserWaterPool(userId)
- wpm.lock.Unlock()
- }
- // 将用户标记为离线
- func (wpm *waterPoolMgr) removeUser(userId int) {
- wpm.lock.Lock()
- defer wpm.lock.Unlock()
- delete(wpm.userList, userId)
- }
- func (wpm *waterPoolMgr) getUserPoolType(userId, gameId, gameType, baseScore, gold int, isMatch bool, param int) (int, int) {
- if wpm.config.ConstantK <= 0 || baseScore <= 0 || gold <= 0 {
- return pb.PoolControl_Normal, 0
- }
- wpm.lock.RLock()
- u, ok := wpm.userList[userId]
- wpm.lock.RUnlock()
- if !ok {
- wpm.lock.Lock()
- wpm.userList[userId] = newUserWaterPool(userId)
- wpm.lock.Unlock()
- wpm.lock.RLock()
- u, ok = wpm.userList[userId]
- wpm.lock.RUnlock()
- if !ok {
- return pb.PoolControl_Normal, 0
- }
- }
- if u.poolType <= pb.PoolControl_Normal || u.poolValue == 0 {
- return pb.PoolControl_Normal, 0
- }
- gameCoefficient, minValue := wpm.config.getGameCoefficient(gameId, gameType, baseScore, isMatch)
- gameCoefficient *= 10000
- poolValue := u.poolValue
- if poolValue < 0 {
- poolValue = -poolValue
- }
- if poolValue < minValue {
- return pb.PoolControl_Normal, 0
- }
- value := baseScore
- if param > 0 {
- value = param
- }
- prob := (poolValue*value*(int(gameCoefficient)))/(gold*wpm.config.ConstantK) + wpm.config.MinProb*100
- if prob > wpm.config.MaxProb*100 && wpm.config.MaxProb > 0 {
- prob = wpm.config.MaxProb * 100
- }
- r := rand.Intn(10000)
- if r >= prob {
- return pb.PoolControl_Normal, 0
- }
- if u.poolType == pb.PoolControl_Lose {
- prob = -prob
- }
- return u.poolType, prob
- }
- func (wpm *waterPoolMgr) grantNewWaterPool(userId, value int, genType string) {
- wpm.lock.RLock()
- u, ok := wpm.userList[userId]
- wpm.lock.RUnlock()
- if !ok {
- wpm.lock.Lock()
- wpm.userList[userId] = newUserWaterPool(userId)
- wpm.lock.Unlock()
- wpm.lock.RLock()
- u, ok = wpm.userList[userId]
- wpm.lock.RUnlock()
- if !ok {
- return
- }
- }
- u.grantNewWaterPool(value, genType)
- if value > 0 {
- go trans_updataTotalWaterPoolInfo(value, 0, 0, 0, value)
- } else {
- go trans_updataTotalWaterPoolInfo(0, 0, -value, 0, -value)
- }
- }
- func (wpm *waterPoolMgr) updataUserWaterPool(userId, amount int, genType string, roomType, roomID int) {
- if amount == 0 {
- return
- }
- wpm.lock.RLock()
- u, ok := wpm.userList[userId]
- wpm.lock.RUnlock()
- if !ok {
- wpm.lock.Lock()
- wpm.userList[userId] = newUserWaterPool(userId)
- wpm.lock.Unlock()
- wpm.lock.RLock()
- u, ok = wpm.userList[userId]
- wpm.lock.RUnlock()
- if !ok {
- return
- }
- }
- u.updataWaterPool(amount, genType, roomType, roomID)
- }
- func (wpm *waterPoolMgr) getUserWaterPool(userId int) int {
- wpm.lock.RLock()
- u, ok := wpm.userList[userId]
- wpm.lock.RUnlock()
- if !ok {
- wpm.lock.Lock()
- wpm.userList[userId] = newUserWaterPool(userId)
- wpm.lock.Unlock()
- wpm.lock.RLock()
- u, ok = wpm.userList[userId]
- wpm.lock.RUnlock()
- if !ok {
- return 0
- }
- }
- return u.poolValue
- }
- func (wpm *waterPoolMgr) getUserWaterPoolGrantRecords(userId, beginTime, endTime, pageIndex, pageSize int) pb.GrantRecords {
- return trans_getUserWaterPoolInfoGrantRecord(userId, beginTime, endTime, pageIndex, pageSize)
- }
- func (wpm *waterPoolMgr) dumpUser(param string) {
- userId, _ := strconv.Atoi(param)
- wpm.lock.RLock()
- u, ok := wpm.userList[userId]
- wpm.lock.RUnlock()
- if !ok {
- return
- }
- log.Release("UserId[%d] poolType[%s] poolValue[%d]", u.userId, u.getPoolTypeDesc(), u.poolValue)
- }
|