| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- package ladder
- import (
- "bet24.com/log"
- "bet24.com/servers/common"
- inventory "bet24.com/servers/micros/item_inventory/proto"
- item "bet24.com/servers/micros/item_inventory/proto"
- "strconv"
- "sync"
- "time"
- )
- var conMgr *consecutiveMgr
- func getConsecutiveMgr() *consecutiveMgr {
- if conMgr == nil {
- conMgr = new(consecutiveMgr)
- conMgr.ctor()
- }
- return conMgr
- }
- type consecutiveMgr struct {
- lock *sync.RWMutex
- userRecords map[int]*userConsecutiveRecord
- }
- func (cm *consecutiveMgr) ctor() {
- log.Release("ladder.consecutiveMgr.ctor()")
- cm.lock = &sync.RWMutex{}
- cm.userRecords = make(map[int]*userConsecutiveRecord)
- }
- func (cm *consecutiveMgr) checkExpireUser() {
- time.AfterFunc(10*time.Minute, cm.checkExpireUser)
- var toRemove []int
- cm.lock.RLock()
- for k, v := range cm.userRecords {
- if v.isExpired() {
- toRemove = append(toRemove, k)
- }
- }
- cm.lock.RUnlock()
- if len(toRemove) == 0 {
- return
- }
- log.Release("consecutiveMgr.checkExpireUser removing %v", toRemove)
- cm.lock.Lock()
- for _, v := range toRemove {
- delete(cm.userRecords, v)
- }
- cm.lock.Unlock()
- }
- func (cm *consecutiveMgr) loadUserRecord(userId int) *userConsecutiveRecord {
- return newUserConsecutiveRecord(userId)
- }
- func (cm *consecutiveMgr) getUserRecord(userId int) *userConsecutiveRecord {
- cm.lock.RLock()
- ur, ok := cm.userRecords[userId]
- cm.lock.RUnlock()
- if !ok {
- ur = cm.loadUserRecord(userId)
- cm.lock.Lock()
- cm.userRecords[userId] = ur
- cm.lock.Unlock()
- }
- return ur
- }
- func (cm *consecutiveMgr) getUserConsecutiveWinCount(userId int, gameId int) int {
- ur := cm.getUserRecord(userId)
- if ur == nil {
- log.Release("consecutiveMgr.getUserConsecutiveWinCount[%d] user not exist", userId)
- return 0
- }
- return ur.getConsecutiveWinCount(gameId)
- }
- func (cm *consecutiveMgr) addUserRecord(userId int, gameId int, score int) {
- ur := cm.getUserRecord(userId)
- if ur == nil {
- log.Release("consecutiveMgr.addUserRecord[%d] user not exist", userId)
- return
- }
- ur.addRecord(score, gameId)
- }
- func (cm *consecutiveMgr) removeLastLost(userId int, gameId int) bool {
- ur := cm.getUserRecord(userId)
- if ur == nil {
- log.Release("consecutiveMgr.removeLastLost[%d] user not exist", userId)
- return false
- }
- // 检查道具是否有
- price := getLadderConfig().ConsecutiveCardPrice
- if price.Count > 0 {
- ok, errMsg := inventory.Consume(userId, price.ItemId, common.LOGTYPE_LADDER_CONSECUTIVE_CARD, price.Count, 0)
- if !ok {
- log.Release("consecutiveMgr.removeLastLost[%d] Consume failed %s", userId, errMsg)
- return false
- }
- }
- removeOk := ur.removeLastLost(gameId)
- if !removeOk {
- // 道具加回去
- if price.Count > 0 {
- inventory.AddItems(userId, []item.ItemPack{price}, "CONSECUTIVE_CARD return", common.LOGTYPE_LADDER_CONSECUTIVE_CARD)
- }
- }
- return removeOk
- }
- func (cm *consecutiveMgr) dump(param string) {
- log.Release("-------------------------------")
- log.Release("consecutiveMgr.dump")
- defer func() {
- log.Release("+++++++++++++++++++++++++++++++")
- log.Release("")
- }()
- var userId int
- var err error
- if userId, err = strconv.Atoi(param); err != nil {
- log.Release("atoi error %v", err)
- return
- }
- ur := cm.getUserRecord(userId)
- if ur == nil {
- log.Release(" no record")
- return
- }
- ur.dump()
- }
|