| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542 |
- package gamelogic
- import (
- "encoding/json"
- "bet24.com/log"
- "bet24.com/servers/games/masharie_table/common"
- "bet24.com/servers/insecureframe/message"
- userservices "bet24.com/servers/micros/userservices/proto"
- "bet24.com/servers/transaction"
- "bet24.com/servers/user"
- )
- func (ts *tablesink) OnGameMessage(userIndex int32, msg, data string) bool {
- /*
- if !ok {
- log.Debug("tablesink.OnGameMessage user not exist %d", userIndex)
- return false
- }
- */
- log.Debug("tablesink.OnGameMessage Receive Msg %d,%v,%v", userIndex, msg, data)
- usr, _ := ts.table.GetUser(userIndex)
- if usr == nil {
- log.Debug("tablesink.OnGameMessage user not exist")
- return false
- }
- userId := usr.GetUserId()
- switch msg {
- case History:
- ts.sendHistory(userIndex)
- case Option:
- ts.sendGameOption(userIndex)
- case Bet:
- ts.handleBet(userIndex, userId, data)
- case BatchBet:
- ts.handleBatchBet(userIndex, userId, msg, data)
- case BetClear:
- ts.onBetClear(userIndex, userId, msg, data)
- case BetRecord:
- ts.onGetBetRecord(userIndex, userId, msg, data)
- case BetRank:
- ts.onGetBetRank(userIndex, userId, msg, data)
- case UserList:
- ts.onGetUserList(userIndex, msg)
- case FreeChip:
- ts.onCheckFreeChip(userIndex, userId, msg, data)
- case FreeBet:
- ts.handleFreeBet(userIndex, userId, data)
- case PrizeRank:
- ts.onGetPrizeRank(userIndex, userId, msg, data)
- case ApplyBanker:
- ts.onApplyBanker(userIndex, userId, msg, data)
- case CancelBanker:
- ts.onCancelBanker(userIndex, userId, msg)
- default:
- log.Debug("tablesink.OnGameMessage unhandled message %v data %v", msg, data)
- }
- return true
- }
- func (ts *tablesink) sendBetFailed(userIndex int32, index int, errMsg string) {
- var bet_failed struct {
- ErrorMsg string
- Index int
- }
- bet_failed.Index = index
- bet_failed.ErrorMsg = errMsg
- d, _ := json.Marshal(bet_failed)
- ts.table.SendGameData(userIndex, Betfailed, string(d))
- }
- func (ts *tablesink) sendBetOK(userIndex int32, data string) {
- ts.table.SendGameData(userIndex, Bet, data)
- }
- func (ts *tablesink) sendHistory(userIndex int32) {
- ts.table.SendGameData(userIndex, History, ts.getHistory())
- }
- func (ts *tablesink) sendGameScene(userIndex int32) {
- ts.table.SendGameData(userIndex, message.Table_GameScene, ts.getStateData())
- }
- // 处理筹码下注
- func (ts *tablesink) handleBet(userIndex int32, userId int, data string) {
- usr := ts.table.GetUserByUserId(userId)
- if usr == nil {
- log.Debug("tablesink.handleBet user not exist UserId:%v", userId)
- return
- }
- // 庄家不能下注
- if userId == ts.bankerInfo.UserId {
- log.Debug("tablesink.handleBet user is banker")
- return
- }
- // log.Debug("handleBet %v", data)
- var bet common.Bet
- e := json.Unmarshal([]byte(data), &bet)
- if e != nil {
- log.Release("handleBet Unmarshal data failed %v |e=%v:", data, e)
- return
- }
- amount := bet.Amount
- bet.UserId = userId
- bet.IsFree = false
- bet.IsRobot = usr.IsRobot()
- if amount <= 0 {
- ts.sendBetFailed(userIndex, bet.Index, "Invalid Bet!")
- return
- }
- // 看下能否下注
- ok, errMsg := ts.isCanBet(bet)
- if !ok {
- ts.sendBetFailed(userIndex, bet.Index, errMsg)
- return
- }
- ok, errMsg = ts.checkGold(bet)
- if !ok {
- ts.sendBetFailed(userIndex, bet.Index, errMsg)
- return
- }
- ret, _ := ts.table.WriteUserMoney(userId, -amount, 0, 1, common.GAMEID*100+1, ts.roomInfo.RoomName)
- if !ret {
- // 扣金币失败
- ts.sendBetFailed(userIndex, bet.Index, "Not enough cash!")
- return
- }
- ts.lock.RLock()
- _, isBet := ts.userBetList[userId]
- ts.lock.RUnlock()
- ok, err := ts.addBet(bet)
- if !ok {
- ts.table.WriteUserMoney(userId, amount, 0, 3, common.GAMEID*100+3, ts.roomInfo.RoomName)
- ts.sendBetFailed(userIndex, bet.Index, err)
- } else {
- ts.handleBetSuccess(userId, bet, usr)
- if !isBet && !usr.IsRobot() {
- //如果第一次下注写重连
- gs.setOfflineStatus(userId, true, ts.getBetRemainingSecond(), true)
- }
- d, _ := json.Marshal(bet)
- ts.sendBetOK(-1, string(d))
- }
- }
- // 处理批量下注
- func (ts *tablesink) handleBatchBet(userIndex int32, userId int, msg, data string) {
- usr := ts.table.GetUserByUserId(userId)
- if usr == nil {
- log.Debug("tablesink.handleBatchBet user not exist UserId:%v", userId)
- return
- }
- // 庄家不能下注
- if userId == ts.bankerInfo.UserId {
- log.Debug("tablesink.handleBatchBet user is banker")
- return
- }
- var batchBet common.Batch_Bet
- e := json.Unmarshal([]byte(data), &batchBet)
- if e != nil {
- log.Release("handleBatchBet Unmarshal data failed %v", data)
- return
- }
- // 先判断所有区域是否能下
- totalAmount := 0
- for _, v := range batchBet.Bets {
- var bet common.Bet
- bet.BetBase = v
- bet.UserId = userId
- ok, errMsg := ts.isCanBet(bet)
- if !ok {
- log.Debug("handleBatchBet.isCanBet failed to add bet %v,%v", bet, errMsg)
- ts.sendBetFailed(userIndex, bet.Index, errMsg)
- return
- }
- ok, errMsg = ts.checkGold(bet)
- if !ok {
- log.Debug("handleBatchBet.checkGold failed to add bet %v,%v", bet, errMsg)
- ts.sendBetFailed(userIndex, bet.Index, errMsg)
- return
- }
- totalAmount += bet.Amount
- }
- ret, _ := ts.table.WriteUserMoney(userId, -totalAmount, 0, 1, common.GAMEID*100+1, ts.roomInfo.RoomName)
- if !ret {
- // 扣金币失败
- ts.sendBetFailed(userIndex, 0, "Not enough cash!")
- return
- }
- ts.lock.RLock()
- _, isBet := ts.userBetList[userId]
- ts.lock.RUnlock()
- for i, v := range batchBet.Bets {
- var bet common.Bet
- bet.BetBase = v
- bet.UserId = userId
- bet.IsFree = false
- bet.IsRobot = usr.IsRobot()
- ok, _ := ts.addBet(bet)
- if !ok {
- go ts.table.WriteUserMoney(userId, bet.Amount, 0, 3, common.GAMEID*100+3, ts.roomInfo.RoomName)
- } else {
- if i == 0 && !isBet && !usr.IsRobot() {
- //如果第一次下注写重连
- gs.setOfflineStatus(userId, true, ts.getBetRemainingSecond(), true)
- }
- ts.handleBetSuccess(userId, bet, usr)
- }
- }
- ts.table.SendGameData(-1, msg, data)
- }
- // 处理免费筹码下注
- func (ts *tablesink) handleFreeBet(userIndex int32, userId int, data string) {
- usr := ts.table.GetUserByUserId(userId)
- if usr == nil {
- log.Debug("tablesink.handleFreeBet user not exist UserId:%v", userId)
- return
- }
- // log.Debug("handleFreeBet %v", data)
- var bet common.Bet
- e := json.Unmarshal([]byte(data), &bet)
- if e != nil {
- log.Release("handleFreeBet Unmarshal data failed %v |e=%v:", data, e)
- return
- }
- amount := bet.Amount
- bet.UserId = userId
- bet.IsFree = true
- bet.IsRobot = usr.IsRobot()
- if amount <= 0 {
- ts.sendBetFailed(userIndex, bet.Index, "Invalid Bet!")
- return
- }
- // 看下能否下注
- ok, errMsg := ts.isCanBet(bet)
- if !ok {
- ts.sendBetFailed(userIndex, bet.Index, errMsg)
- return
- }
- ok, errMsg = ts.checkGold(bet)
- if !ok {
- ts.sendBetFailed(userIndex, bet.Index, errMsg)
- return
- }
- //扣除免费筹码
- result, freeChip := ts.freeChips.useFreeChips(userId, amount)
- if !result {
- log.Debug("handleFreeBet.useFreeChips Not enough free chip %v,freeChip:%v", result, freeChip)
- ts.sendBetFailed(userIndex, bet.Index, "Not enough free chip!")
- return
- }
- ts.lock.RLock()
- _, isBet := ts.userBetList[userId]
- ts.lock.RUnlock()
- addResult, err := ts.addBet(bet)
- if !addResult {
- //下注失败,返还免费筹码
- ts.freeChips.addFreeChips(userId, amount)
- ts.sendBetFailed(userIndex, bet.Index, err)
- } else {
- //免费不记录下注额
- if !usr.IsRobot() {
- if !isBet {
- gs.setOfflineStatus(userId, true, ts.getBetRemainingSecond(), true)
- }
- d, _ := json.Marshal(bet)
- ts.table.SendGameData(userIndex, FreeBet, string(d))
- }
- //免费卷不广播给所有人,有免费卷下注时,总额度是不对的
- // d, _ := json.Marshal(bet)
- // ts.sendBetOK(-1, string(d))
- }
- }
- // 成功下注后处理handleBetSuccess
- func (ts *tablesink) handleBetSuccess(userId int, bet common.Bet, usr *user.UserInfo) {
- if !usr.IsRobot() {
- amount := bet.Amount
- switch bet.BetId {
- case int(common.BidType_Diamond):
- ts.diamondAmount += amount
- case int(common.BidType_Club):
- ts.clubAmount += amount
- case int(common.BidType_Heart):
- ts.heartAmount += amount
- case int(common.BidType_Spade):
- ts.spadeAmount += amount
- }
- }
- }
- func (ts *tablesink) onBetClear(userIndex int32, userId int, msg, data string) {
- ts.lock.Lock()
- betList, ok := ts.userBetList[userId]
- if !ok {
- ts.lock.Unlock()
- return
- }
- amount := 0
- for _, v := range betList {
- ts.roomInfo.TotalBet -= v.Amount
- amount += v.Amount
- }
- delete(ts.userBetList, userId)
- ts.lock.Unlock()
- ts.table.WriteUserMoney(userId, amount, 0, 3, common.GAMEID*100+3, ts.roomInfo.RoomName)
- betClear := common.UserClear{UserId: userId}
- d, _ := json.Marshal(betClear)
- ts.table.SendGameData(userIndex, msg, string(d))
- ts.userList.clearBet(userId, amount)
- }
- func (ts *tablesink) onGetBetRecord(userIndex int32, userId int, msg, data string) {
- //log.Debug("tablesink.onGetBetRecord %v", data)
- var getRecord struct {
- RecordCount int
- }
- e := json.Unmarshal([]byte(data), &getRecord)
- if e != nil {
- log.Release("tablesink.onGetBetRecord Unmarshal data failed %v", data)
- return
- }
- records := transaction.GetGameRecord(userId, common.GAMEID, ts.roomInfo.RoomName, getRecord.RecordCount)
- retData, _ := json.Marshal(records)
- ts.table.SendGameData(userIndex, msg, string(retData))
- }
- func (ts *tablesink) sendGameOption(userIndex int32) {
- d, _ := json.Marshal(ts.roomInfo.RoomInfoBase)
- ts.table.SendGameData(userIndex, Option, string(d))
- }
- func (ts *tablesink) onGetUserList(userIndex int32, msg string) {
- //合并两个表
- userlist := ts.userList.getLuckyStarUsers(1, ts.bankerInfo.UserId)
- userlist = append(userlist, ts.userList.getBetGoldRankingUsers(0)...)
- userIds := make([]int, len(userlist))
- for i, u := range userlist {
- userIds[i] = u.UserId
- }
- users := userservices.GetUserInfoInBulk(userIds)
- //补齐用户金币
- for i, v := range userlist {
- user := users[i]
- if user.UserId == v.UserId {
- userlist[i].Amount = ts.table.GetUserChipOrGoldByUserId(user.UserId)
- }
- }
- retData, _ := json.Marshal(userlist)
- ts.table.SendGameData(userIndex, msg, string(retData))
- }
- func (ts *tablesink) onGetBetRank(userIndex int32, userId int, msg, data string) {
- log.Debug("tablesink.onGetBetRank %v", data)
- //获取betRank前20名
- dayRankList, dayJackpot, dayMyBetAmount, dayMyRank := ts.dayBetRank.getRankList(userId)
- weekRankList, weekJackpot, weekMyBetAmount, weekMyRank := ts.weekBetRank.getRankList(userId)
- //判断排行榜数据是否为空
- if len(dayRankList) == 0 && len(weekRankList) == 0 {
- //如果排行榜数据为空,则返回空数据
- rankData := struct {
- Day []common.ScoreUser `json:"Day"`
- Week []common.ScoreUser `json:"Week"`
- }{
- Day: []common.ScoreUser{},
- Week: []common.ScoreUser{},
- }
- retData, _ := json.Marshal(rankData)
- ts.table.SendGameData(userIndex, msg, string(retData))
- return
- }
- //拼接数据返回
- rankData := struct {
- Day struct {
- RankList []common.ScoreUser `json:"RankList"`
- Jackpot int `json:"Jackpot"`
- MyBetAmount int `json:"MyBetAmount"`
- MyRank int `json:"MyRank"`
- } `json:"Day"`
- Week struct {
- RankList []common.ScoreUser `json:"RankList"`
- Jackpot int `json:"Jackpot"`
- MyBetAmount int `json:"MyBetAmount"`
- MyRank int `json:"MyRank"`
- } `json:"Week"`
- }{}
- //如果昵称为空则补齐
- dayUserList := make([]common.ScoreUser, 0, len(dayRankList))
- //如果rankList昵称为空则补齐
- dayUserIds := make([]int, len(dayRankList))
- for i, u := range dayRankList {
- dayUserIds[i] = u.UserId
- }
- dayUsers := userservices.GetUserInfoInBulk(dayUserIds)
- for i, v := range dayRankList {
- scoreUser := common.ScoreUser{
- UserId: v.UserId,
- BetAmount: v.BetAmount,
- NickName: "",
- FaceId: 0,
- FaceUrl: "",
- VipLevel: 0,
- VipExpire: 0,
- Decorations: nil,
- }
- user := dayUsers[i]
- if user.UserId == v.UserId {
- scoreUser.NickName = user.NickName
- scoreUser.FaceId = user.FaceId
- scoreUser.FaceUrl = user.FaceUrl
- scoreUser.VipLevel = user.Vip
- scoreUser.VipExpire = user.VipExpire
- scoreUser.Decorations = user.Decorations
- }
- dayUserList = append(dayUserList, scoreUser)
- }
- weekUserList := make([]common.ScoreUser, 0, len(weekRankList))
- weekUserIds := make([]int, len(weekRankList))
- for i, u := range weekRankList {
- weekUserIds[i] = u.UserId
- }
- weekUsers := userservices.GetUserInfoInBulk(weekUserIds)
- for i, v := range weekRankList {
- scoreUser := common.ScoreUser{
- UserId: v.UserId,
- BetAmount: v.BetAmount,
- NickName: "",
- FaceId: 0,
- FaceUrl: "",
- VipLevel: 0,
- VipExpire: 0,
- Decorations: nil,
- }
- user := weekUsers[i]
- if user.UserId == v.UserId {
- scoreUser.NickName = user.NickName
- scoreUser.FaceId = user.FaceId
- scoreUser.FaceUrl = user.FaceUrl
- scoreUser.VipLevel = user.Vip
- scoreUser.VipExpire = user.VipExpire
- scoreUser.Decorations = user.Decorations
- }
- weekUserList = append(weekUserList, scoreUser)
- }
- rankData.Day.RankList = dayUserList
- rankData.Day.Jackpot = dayJackpot
- rankData.Day.MyBetAmount = dayMyBetAmount
- rankData.Day.MyRank = dayMyRank
- rankData.Week.RankList = weekUserList
- rankData.Week.Jackpot = weekJackpot
- rankData.Week.MyBetAmount = weekMyBetAmount
- rankData.Week.MyRank = weekMyRank
- retData, _ := json.Marshal(rankData)
- ts.table.SendGameData(userIndex, msg, string(retData))
- }
- func (ts *tablesink) onGetPrizeRank(userIndex int32, userId int, msg, data string) {
- log.Debug("tablesink.onGetPrizeRank %v", data)
- //获取奖池排行榜前20名
- rankList := ts.prizePool.getPrizeRank()
- //判断排行榜数据是否为空
- if len(rankList) == 0 {
- //如果排行榜数据为空,则返回空数据
- ts.table.SendGameData(userIndex, msg, "[]")
- return
- }
- //拼接数据返回
- scoreUserList := make([]common.ScoreUser, 0, len(rankList))
- userIds := make([]int, len(rankList))
- for i, u := range rankList {
- userIds[i] = u.UserId
- }
- users := userservices.GetUserInfoInBulk(userIds)
- //如果rankList昵称为空则补齐
- for i, v := range rankList {
- info := make([]int, 0, 2)
- info = append(info, v.Score)
- info = append(info, v.Time)
- scoreUser := common.ScoreUser{
- UserId: v.UserId,
- BetAmount: v.BetAmount,
- NickName: "",
- FaceId: 0,
- FaceUrl: "",
- VipLevel: 0,
- VipExpire: 0,
- Decorations: nil,
- Info: info,
- }
- user := users[i]
- if user.UserId == v.UserId {
- scoreUser.NickName = user.NickName
- scoreUser.FaceId = user.FaceId
- scoreUser.FaceUrl = user.FaceUrl
- scoreUser.VipLevel = user.Vip
- scoreUser.VipExpire = user.VipExpire
- scoreUser.Decorations = user.Decorations
- }
- scoreUserList = append(scoreUserList, scoreUser)
- }
- retData, _ := json.Marshal(scoreUserList)
- ts.table.SendGameData(userIndex, msg, string(retData))
- }
- func (ts *tablesink) onCheckFreeChip(userIndex int32, userId int, msg, data string) {
- //log.Debug("tablesink.onCheckFreeChip %v", data)
- freeChip, lastHour := ts.freeChips.checkFreeChipsNum(userId)
- //返回数据
- var result struct {
- Free int //剩余免费额度
- LastHour int //前一次领取时间 0 6 12 18
- }
- result.Free = freeChip
- result.LastHour = lastHour
- retData, _ := json.Marshal(result)
- ts.table.SendGameData(userIndex, msg, string(retData))
- }
|