tablesink_cmd.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. package gamelogic
  2. import (
  3. "encoding/json"
  4. "bet24.com/log"
  5. "bet24.com/servers/games/masharie_table/common"
  6. "bet24.com/servers/insecureframe/message"
  7. userservices "bet24.com/servers/micros/userservices/proto"
  8. "bet24.com/servers/transaction"
  9. "bet24.com/servers/user"
  10. )
  11. func (ts *tablesink) OnGameMessage(userIndex int32, msg, data string) bool {
  12. /*
  13. if !ok {
  14. log.Debug("tablesink.OnGameMessage user not exist %d", userIndex)
  15. return false
  16. }
  17. */
  18. log.Debug("tablesink.OnGameMessage Receive Msg %d,%v,%v", userIndex, msg, data)
  19. usr, _ := ts.table.GetUser(userIndex)
  20. if usr == nil {
  21. log.Debug("tablesink.OnGameMessage user not exist")
  22. return false
  23. }
  24. userId := usr.GetUserId()
  25. switch msg {
  26. case History:
  27. ts.sendHistory(userIndex)
  28. case Option:
  29. ts.sendGameOption(userIndex)
  30. case Bet:
  31. ts.handleBet(userIndex, userId, data)
  32. case BatchBet:
  33. ts.handleBatchBet(userIndex, userId, msg, data)
  34. case BetClear:
  35. ts.onBetClear(userIndex, userId, msg, data)
  36. case BetRecord:
  37. ts.onGetBetRecord(userIndex, userId, msg, data)
  38. case BetRank:
  39. ts.onGetBetRank(userIndex, userId, msg, data)
  40. case UserList:
  41. ts.onGetUserList(userIndex, msg)
  42. case FreeChip:
  43. ts.onCheckFreeChip(userIndex, userId, msg, data)
  44. case FreeBet:
  45. ts.handleFreeBet(userIndex, userId, data)
  46. case PrizeRank:
  47. ts.onGetPrizeRank(userIndex, userId, msg, data)
  48. case ApplyBanker:
  49. ts.onApplyBanker(userIndex, userId, msg, data)
  50. case CancelBanker:
  51. ts.onCancelBanker(userIndex, userId, msg)
  52. default:
  53. log.Debug("tablesink.OnGameMessage unhandled message %v data %v", msg, data)
  54. }
  55. return true
  56. }
  57. func (ts *tablesink) sendBetFailed(userIndex int32, index int, errMsg string) {
  58. var bet_failed struct {
  59. ErrorMsg string
  60. Index int
  61. }
  62. bet_failed.Index = index
  63. bet_failed.ErrorMsg = errMsg
  64. d, _ := json.Marshal(bet_failed)
  65. ts.table.SendGameData(userIndex, Betfailed, string(d))
  66. }
  67. func (ts *tablesink) sendBetOK(userIndex int32, data string) {
  68. ts.table.SendGameData(userIndex, Bet, data)
  69. }
  70. func (ts *tablesink) sendHistory(userIndex int32) {
  71. ts.table.SendGameData(userIndex, History, ts.getHistory())
  72. }
  73. func (ts *tablesink) sendGameScene(userIndex int32) {
  74. ts.table.SendGameData(userIndex, message.Table_GameScene, ts.getStateData())
  75. }
  76. // 处理筹码下注
  77. func (ts *tablesink) handleBet(userIndex int32, userId int, data string) {
  78. usr := ts.table.GetUserByUserId(userId)
  79. if usr == nil {
  80. log.Debug("tablesink.handleBet user not exist UserId:%v", userId)
  81. return
  82. }
  83. // 庄家不能下注
  84. if userId == ts.bankerInfo.UserId {
  85. log.Debug("tablesink.handleBet user is banker")
  86. return
  87. }
  88. // log.Debug("handleBet %v", data)
  89. var bet common.Bet
  90. e := json.Unmarshal([]byte(data), &bet)
  91. if e != nil {
  92. log.Release("handleBet Unmarshal data failed %v |e=%v:", data, e)
  93. return
  94. }
  95. amount := bet.Amount
  96. bet.UserId = userId
  97. bet.IsFree = false
  98. bet.IsRobot = usr.IsRobot()
  99. if amount <= 0 {
  100. ts.sendBetFailed(userIndex, bet.Index, "Invalid Bet!")
  101. return
  102. }
  103. // 看下能否下注
  104. ok, errMsg := ts.isCanBet(bet)
  105. if !ok {
  106. ts.sendBetFailed(userIndex, bet.Index, errMsg)
  107. return
  108. }
  109. ok, errMsg = ts.checkGold(bet)
  110. if !ok {
  111. ts.sendBetFailed(userIndex, bet.Index, errMsg)
  112. return
  113. }
  114. ret, _ := ts.table.WriteUserMoney(userId, -amount, 0, 1, common.GAMEID*100+1, ts.roomInfo.RoomName)
  115. if !ret {
  116. // 扣金币失败
  117. ts.sendBetFailed(userIndex, bet.Index, "Not enough cash!")
  118. return
  119. }
  120. ts.lock.RLock()
  121. _, isBet := ts.userBetList[userId]
  122. ts.lock.RUnlock()
  123. ok, err := ts.addBet(bet)
  124. if !ok {
  125. ts.table.WriteUserMoney(userId, amount, 0, 3, common.GAMEID*100+3, ts.roomInfo.RoomName)
  126. ts.sendBetFailed(userIndex, bet.Index, err)
  127. } else {
  128. ts.handleBetSuccess(userId, bet, usr)
  129. if !isBet && !usr.IsRobot() {
  130. //如果第一次下注写重连
  131. gs.setOfflineStatus(userId, true, ts.getBetRemainingSecond(), true)
  132. }
  133. d, _ := json.Marshal(bet)
  134. ts.sendBetOK(-1, string(d))
  135. }
  136. }
  137. // 处理批量下注
  138. func (ts *tablesink) handleBatchBet(userIndex int32, userId int, msg, data string) {
  139. usr := ts.table.GetUserByUserId(userId)
  140. if usr == nil {
  141. log.Debug("tablesink.handleBatchBet user not exist UserId:%v", userId)
  142. return
  143. }
  144. // 庄家不能下注
  145. if userId == ts.bankerInfo.UserId {
  146. log.Debug("tablesink.handleBatchBet user is banker")
  147. return
  148. }
  149. var batchBet common.Batch_Bet
  150. e := json.Unmarshal([]byte(data), &batchBet)
  151. if e != nil {
  152. log.Release("handleBatchBet Unmarshal data failed %v", data)
  153. return
  154. }
  155. // 先判断所有区域是否能下
  156. totalAmount := 0
  157. for _, v := range batchBet.Bets {
  158. var bet common.Bet
  159. bet.BetBase = v
  160. bet.UserId = userId
  161. ok, errMsg := ts.isCanBet(bet)
  162. if !ok {
  163. log.Debug("handleBatchBet.isCanBet failed to add bet %v,%v", bet, errMsg)
  164. ts.sendBetFailed(userIndex, bet.Index, errMsg)
  165. return
  166. }
  167. ok, errMsg = ts.checkGold(bet)
  168. if !ok {
  169. log.Debug("handleBatchBet.checkGold failed to add bet %v,%v", bet, errMsg)
  170. ts.sendBetFailed(userIndex, bet.Index, errMsg)
  171. return
  172. }
  173. totalAmount += bet.Amount
  174. }
  175. ret, _ := ts.table.WriteUserMoney(userId, -totalAmount, 0, 1, common.GAMEID*100+1, ts.roomInfo.RoomName)
  176. if !ret {
  177. // 扣金币失败
  178. ts.sendBetFailed(userIndex, 0, "Not enough cash!")
  179. return
  180. }
  181. ts.lock.RLock()
  182. _, isBet := ts.userBetList[userId]
  183. ts.lock.RUnlock()
  184. for i, v := range batchBet.Bets {
  185. var bet common.Bet
  186. bet.BetBase = v
  187. bet.UserId = userId
  188. bet.IsFree = false
  189. bet.IsRobot = usr.IsRobot()
  190. ok, _ := ts.addBet(bet)
  191. if !ok {
  192. go ts.table.WriteUserMoney(userId, bet.Amount, 0, 3, common.GAMEID*100+3, ts.roomInfo.RoomName)
  193. } else {
  194. if i == 0 && !isBet && !usr.IsRobot() {
  195. //如果第一次下注写重连
  196. gs.setOfflineStatus(userId, true, ts.getBetRemainingSecond(), true)
  197. }
  198. ts.handleBetSuccess(userId, bet, usr)
  199. }
  200. }
  201. ts.table.SendGameData(-1, msg, data)
  202. }
  203. // 处理免费筹码下注
  204. func (ts *tablesink) handleFreeBet(userIndex int32, userId int, data string) {
  205. usr := ts.table.GetUserByUserId(userId)
  206. if usr == nil {
  207. log.Debug("tablesink.handleFreeBet user not exist UserId:%v", userId)
  208. return
  209. }
  210. // log.Debug("handleFreeBet %v", data)
  211. var bet common.Bet
  212. e := json.Unmarshal([]byte(data), &bet)
  213. if e != nil {
  214. log.Release("handleFreeBet Unmarshal data failed %v |e=%v:", data, e)
  215. return
  216. }
  217. amount := bet.Amount
  218. bet.UserId = userId
  219. bet.IsFree = true
  220. bet.IsRobot = usr.IsRobot()
  221. if amount <= 0 {
  222. ts.sendBetFailed(userIndex, bet.Index, "Invalid Bet!")
  223. return
  224. }
  225. // 看下能否下注
  226. ok, errMsg := ts.isCanBet(bet)
  227. if !ok {
  228. ts.sendBetFailed(userIndex, bet.Index, errMsg)
  229. return
  230. }
  231. ok, errMsg = ts.checkGold(bet)
  232. if !ok {
  233. ts.sendBetFailed(userIndex, bet.Index, errMsg)
  234. return
  235. }
  236. //扣除免费筹码
  237. result, freeChip := ts.freeChips.useFreeChips(userId, amount)
  238. if !result {
  239. log.Debug("handleFreeBet.useFreeChips Not enough free chip %v,freeChip:%v", result, freeChip)
  240. ts.sendBetFailed(userIndex, bet.Index, "Not enough free chip!")
  241. return
  242. }
  243. ts.lock.RLock()
  244. _, isBet := ts.userBetList[userId]
  245. ts.lock.RUnlock()
  246. addResult, err := ts.addBet(bet)
  247. if !addResult {
  248. //下注失败,返还免费筹码
  249. ts.freeChips.addFreeChips(userId, amount)
  250. ts.sendBetFailed(userIndex, bet.Index, err)
  251. } else {
  252. //免费不记录下注额
  253. if !usr.IsRobot() {
  254. if !isBet {
  255. gs.setOfflineStatus(userId, true, ts.getBetRemainingSecond(), true)
  256. }
  257. d, _ := json.Marshal(bet)
  258. ts.table.SendGameData(userIndex, FreeBet, string(d))
  259. }
  260. //免费卷不广播给所有人,有免费卷下注时,总额度是不对的
  261. // d, _ := json.Marshal(bet)
  262. // ts.sendBetOK(-1, string(d))
  263. }
  264. }
  265. // 成功下注后处理handleBetSuccess
  266. func (ts *tablesink) handleBetSuccess(userId int, bet common.Bet, usr *user.UserInfo) {
  267. if !usr.IsRobot() {
  268. amount := bet.Amount
  269. switch bet.BetId {
  270. case int(common.BidType_Diamond):
  271. ts.diamondAmount += amount
  272. case int(common.BidType_Club):
  273. ts.clubAmount += amount
  274. case int(common.BidType_Heart):
  275. ts.heartAmount += amount
  276. case int(common.BidType_Spade):
  277. ts.spadeAmount += amount
  278. }
  279. }
  280. }
  281. func (ts *tablesink) onBetClear(userIndex int32, userId int, msg, data string) {
  282. ts.lock.Lock()
  283. betList, ok := ts.userBetList[userId]
  284. if !ok {
  285. ts.lock.Unlock()
  286. return
  287. }
  288. amount := 0
  289. for _, v := range betList {
  290. ts.roomInfo.TotalBet -= v.Amount
  291. amount += v.Amount
  292. }
  293. delete(ts.userBetList, userId)
  294. ts.lock.Unlock()
  295. ts.table.WriteUserMoney(userId, amount, 0, 3, common.GAMEID*100+3, ts.roomInfo.RoomName)
  296. betClear := common.UserClear{UserId: userId}
  297. d, _ := json.Marshal(betClear)
  298. ts.table.SendGameData(userIndex, msg, string(d))
  299. ts.userList.clearBet(userId, amount)
  300. }
  301. func (ts *tablesink) onGetBetRecord(userIndex int32, userId int, msg, data string) {
  302. //log.Debug("tablesink.onGetBetRecord %v", data)
  303. var getRecord struct {
  304. RecordCount int
  305. }
  306. e := json.Unmarshal([]byte(data), &getRecord)
  307. if e != nil {
  308. log.Release("tablesink.onGetBetRecord Unmarshal data failed %v", data)
  309. return
  310. }
  311. records := transaction.GetGameRecord(userId, common.GAMEID, ts.roomInfo.RoomName, getRecord.RecordCount)
  312. retData, _ := json.Marshal(records)
  313. ts.table.SendGameData(userIndex, msg, string(retData))
  314. }
  315. func (ts *tablesink) sendGameOption(userIndex int32) {
  316. d, _ := json.Marshal(ts.roomInfo.RoomInfoBase)
  317. ts.table.SendGameData(userIndex, Option, string(d))
  318. }
  319. func (ts *tablesink) onGetUserList(userIndex int32, msg string) {
  320. //合并两个表
  321. userlist := ts.userList.getLuckyStarUsers(1, ts.bankerInfo.UserId)
  322. userlist = append(userlist, ts.userList.getBetGoldRankingUsers(0)...)
  323. userIds := make([]int, len(userlist))
  324. for i, u := range userlist {
  325. userIds[i] = u.UserId
  326. }
  327. users := userservices.GetUserInfoInBulk(userIds)
  328. //补齐用户金币
  329. for i, v := range userlist {
  330. user := users[i]
  331. if user.UserId == v.UserId {
  332. userlist[i].Amount = ts.table.GetUserChipOrGoldByUserId(user.UserId)
  333. }
  334. }
  335. retData, _ := json.Marshal(userlist)
  336. ts.table.SendGameData(userIndex, msg, string(retData))
  337. }
  338. func (ts *tablesink) onGetBetRank(userIndex int32, userId int, msg, data string) {
  339. log.Debug("tablesink.onGetBetRank %v", data)
  340. //获取betRank前20名
  341. dayRankList, dayJackpot, dayMyBetAmount, dayMyRank := ts.dayBetRank.getRankList(userId)
  342. weekRankList, weekJackpot, weekMyBetAmount, weekMyRank := ts.weekBetRank.getRankList(userId)
  343. //判断排行榜数据是否为空
  344. if len(dayRankList) == 0 && len(weekRankList) == 0 {
  345. //如果排行榜数据为空,则返回空数据
  346. rankData := struct {
  347. Day []common.ScoreUser `json:"Day"`
  348. Week []common.ScoreUser `json:"Week"`
  349. }{
  350. Day: []common.ScoreUser{},
  351. Week: []common.ScoreUser{},
  352. }
  353. retData, _ := json.Marshal(rankData)
  354. ts.table.SendGameData(userIndex, msg, string(retData))
  355. return
  356. }
  357. //拼接数据返回
  358. rankData := struct {
  359. Day struct {
  360. RankList []common.ScoreUser `json:"RankList"`
  361. Jackpot int `json:"Jackpot"`
  362. MyBetAmount int `json:"MyBetAmount"`
  363. MyRank int `json:"MyRank"`
  364. } `json:"Day"`
  365. Week struct {
  366. RankList []common.ScoreUser `json:"RankList"`
  367. Jackpot int `json:"Jackpot"`
  368. MyBetAmount int `json:"MyBetAmount"`
  369. MyRank int `json:"MyRank"`
  370. } `json:"Week"`
  371. }{}
  372. //如果昵称为空则补齐
  373. dayUserList := make([]common.ScoreUser, 0, len(dayRankList))
  374. //如果rankList昵称为空则补齐
  375. dayUserIds := make([]int, len(dayRankList))
  376. for i, u := range dayRankList {
  377. dayUserIds[i] = u.UserId
  378. }
  379. dayUsers := userservices.GetUserInfoInBulk(dayUserIds)
  380. for i, v := range dayRankList {
  381. scoreUser := common.ScoreUser{
  382. UserId: v.UserId,
  383. BetAmount: v.BetAmount,
  384. NickName: "",
  385. FaceId: 0,
  386. FaceUrl: "",
  387. VipLevel: 0,
  388. VipExpire: 0,
  389. Decorations: nil,
  390. }
  391. user := dayUsers[i]
  392. if user.UserId == v.UserId {
  393. scoreUser.NickName = user.NickName
  394. scoreUser.FaceId = user.FaceId
  395. scoreUser.FaceUrl = user.FaceUrl
  396. scoreUser.VipLevel = user.Vip
  397. scoreUser.VipExpire = user.VipExpire
  398. scoreUser.Decorations = user.Decorations
  399. }
  400. dayUserList = append(dayUserList, scoreUser)
  401. }
  402. weekUserList := make([]common.ScoreUser, 0, len(weekRankList))
  403. weekUserIds := make([]int, len(weekRankList))
  404. for i, u := range weekRankList {
  405. weekUserIds[i] = u.UserId
  406. }
  407. weekUsers := userservices.GetUserInfoInBulk(weekUserIds)
  408. for i, v := range weekRankList {
  409. scoreUser := common.ScoreUser{
  410. UserId: v.UserId,
  411. BetAmount: v.BetAmount,
  412. NickName: "",
  413. FaceId: 0,
  414. FaceUrl: "",
  415. VipLevel: 0,
  416. VipExpire: 0,
  417. Decorations: nil,
  418. }
  419. user := weekUsers[i]
  420. if user.UserId == v.UserId {
  421. scoreUser.NickName = user.NickName
  422. scoreUser.FaceId = user.FaceId
  423. scoreUser.FaceUrl = user.FaceUrl
  424. scoreUser.VipLevel = user.Vip
  425. scoreUser.VipExpire = user.VipExpire
  426. scoreUser.Decorations = user.Decorations
  427. }
  428. weekUserList = append(weekUserList, scoreUser)
  429. }
  430. rankData.Day.RankList = dayUserList
  431. rankData.Day.Jackpot = dayJackpot
  432. rankData.Day.MyBetAmount = dayMyBetAmount
  433. rankData.Day.MyRank = dayMyRank
  434. rankData.Week.RankList = weekUserList
  435. rankData.Week.Jackpot = weekJackpot
  436. rankData.Week.MyBetAmount = weekMyBetAmount
  437. rankData.Week.MyRank = weekMyRank
  438. retData, _ := json.Marshal(rankData)
  439. ts.table.SendGameData(userIndex, msg, string(retData))
  440. }
  441. func (ts *tablesink) onGetPrizeRank(userIndex int32, userId int, msg, data string) {
  442. log.Debug("tablesink.onGetPrizeRank %v", data)
  443. //获取奖池排行榜前20名
  444. rankList := ts.prizePool.getPrizeRank()
  445. //判断排行榜数据是否为空
  446. if len(rankList) == 0 {
  447. //如果排行榜数据为空,则返回空数据
  448. ts.table.SendGameData(userIndex, msg, "[]")
  449. return
  450. }
  451. //拼接数据返回
  452. scoreUserList := make([]common.ScoreUser, 0, len(rankList))
  453. userIds := make([]int, len(rankList))
  454. for i, u := range rankList {
  455. userIds[i] = u.UserId
  456. }
  457. users := userservices.GetUserInfoInBulk(userIds)
  458. //如果rankList昵称为空则补齐
  459. for i, v := range rankList {
  460. info := make([]int, 0, 2)
  461. info = append(info, v.Score)
  462. info = append(info, v.Time)
  463. scoreUser := common.ScoreUser{
  464. UserId: v.UserId,
  465. BetAmount: v.BetAmount,
  466. NickName: "",
  467. FaceId: 0,
  468. FaceUrl: "",
  469. VipLevel: 0,
  470. VipExpire: 0,
  471. Decorations: nil,
  472. Info: info,
  473. }
  474. user := users[i]
  475. if user.UserId == v.UserId {
  476. scoreUser.NickName = user.NickName
  477. scoreUser.FaceId = user.FaceId
  478. scoreUser.FaceUrl = user.FaceUrl
  479. scoreUser.VipLevel = user.Vip
  480. scoreUser.VipExpire = user.VipExpire
  481. scoreUser.Decorations = user.Decorations
  482. }
  483. scoreUserList = append(scoreUserList, scoreUser)
  484. }
  485. retData, _ := json.Marshal(scoreUserList)
  486. ts.table.SendGameData(userIndex, msg, string(retData))
  487. }
  488. func (ts *tablesink) onCheckFreeChip(userIndex int32, userId int, msg, data string) {
  489. //log.Debug("tablesink.onCheckFreeChip %v", data)
  490. freeChip, lastHour := ts.freeChips.checkFreeChipsNum(userId)
  491. //返回数据
  492. var result struct {
  493. Free int //剩余免费额度
  494. LastHour int //前一次领取时间 0 6 12 18
  495. }
  496. result.Free = freeChip
  497. result.LastHour = lastHour
  498. retData, _ := json.Marshal(result)
  499. ts.table.SendGameData(userIndex, msg, string(retData))
  500. }