tablesink_cmd.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. package gamelogic
  2. import (
  3. "encoding/json"
  4. "bet24.com/log"
  5. "bet24.com/servers/games/luckyfruit_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 BetList:
  41. ts.onGetBetList(userIndex, userId, msg, data)
  42. case FreeChip:
  43. ts.onCheckFreeChip(userIndex, userId, msg, data)
  44. case FreeBet:
  45. ts.handleFreeBet(userIndex, userId, data)
  46. default:
  47. log.Debug("tablesink.OnGameMessage unhandled message %v data %v", msg, data)
  48. }
  49. return true
  50. }
  51. func (ts *tablesink) sendBetFailed(userIndex int32, index int, errMsg string) {
  52. var bet_failed struct {
  53. ErrorMsg string
  54. Index int
  55. }
  56. bet_failed.Index = index
  57. bet_failed.ErrorMsg = errMsg
  58. d, _ := json.Marshal(bet_failed)
  59. ts.table.SendGameData(userIndex, Betfailed, string(d))
  60. }
  61. func (ts *tablesink) sendBetOK(userIndex int32, data string) {
  62. ts.table.SendGameData(userIndex, Bet, data)
  63. }
  64. func (ts *tablesink) sendHistory(userIndex int32) {
  65. ts.table.SendGameData(userIndex, History, ts.getHistory())
  66. }
  67. func (ts *tablesink) sendGameScene(userIndex int32) {
  68. ts.table.SendGameData(userIndex, message.Table_GameScene, ts.getStateData())
  69. }
  70. // 处理筹码下注
  71. func (ts *tablesink) handleBet(userIndex int32, userId int, data string) {
  72. usr, _ := ts.table.GetUser(userIndex)
  73. if usr == nil {
  74. log.Debug("tablesink.handleBet user not exist")
  75. return
  76. }
  77. // log.Debug("handleBet %v", data)
  78. var bet common.Bet
  79. e := json.Unmarshal([]byte(data), &bet)
  80. if e != nil {
  81. log.Release("handleBet Unmarshal data failed %v |e=%v:", data, e)
  82. return
  83. }
  84. amount := bet.Amount
  85. bet.UserId = userId
  86. bet.IsFree = false
  87. bet.IsRobot = usr.IsRobot()
  88. if amount <= 0 {
  89. ts.sendBetFailed(userIndex, bet.Index, "Invalid Bet!")
  90. return
  91. }
  92. // 看下能否下注
  93. ok, errMsg := ts.isCanBet(bet)
  94. if !ok {
  95. ts.sendBetFailed(userIndex, bet.Index, errMsg)
  96. return
  97. }
  98. ret, _ := ts.table.WriteUserMoney(userId, -amount, 0, 1, common.GAMEID*100+1, ts.roomInfo.RoomName)
  99. if !ret {
  100. // 扣金币失败
  101. ts.sendBetFailed(userIndex, bet.Index, "Not enough cash!")
  102. return
  103. }
  104. ok, err := ts.addBet(bet)
  105. if !ok {
  106. ts.table.WriteUserMoney(userId, amount, 0, 3, common.GAMEID*100+3, ts.roomInfo.RoomName)
  107. ts.sendBetFailed(userIndex, bet.Index, err)
  108. } else {
  109. ts.handleBetSuccess(userId, bet, usr)
  110. d, _ := json.Marshal(bet)
  111. ts.sendBetOK(-1, string(d))
  112. }
  113. }
  114. // 处理批量下注
  115. func (ts *tablesink) handleBatchBet(userIndex int32, userId int, msg, data string) {
  116. usr, _ := ts.table.GetUser(userIndex)
  117. if usr == nil {
  118. log.Debug("tablesink.handleBatchBet user not exist")
  119. return
  120. }
  121. var batchBet common.Batch_Bet
  122. e := json.Unmarshal([]byte(data), &batchBet)
  123. if e != nil {
  124. log.Release("handleBatchBet Unmarshal data failed %v", data)
  125. return
  126. }
  127. // 先判断所有区域是否能下
  128. totalAmount := 0
  129. for _, v := range batchBet.Bets {
  130. var bet common.Bet
  131. bet.BetBase = v
  132. bet.UserId = userId
  133. ok, errMsg := ts.isCanBet(bet)
  134. if !ok {
  135. log.Debug("handleBatchBet failed to add bet %v,%v", bet, errMsg)
  136. ts.sendBetFailed(userIndex, bet.Index, errMsg)
  137. return
  138. }
  139. totalAmount += bet.Amount
  140. }
  141. ret, _ := ts.table.WriteUserMoney(userId, -totalAmount, 0, 1, common.GAMEID*100+1, ts.roomInfo.RoomName)
  142. if !ret {
  143. // 扣金币失败
  144. ts.sendBetFailed(userIndex, 0, "Not enough cash!")
  145. return
  146. }
  147. for _, v := range batchBet.Bets {
  148. var bet common.Bet
  149. bet.BetBase = v
  150. bet.UserId = userId
  151. bet.IsFree = false
  152. bet.IsRobot = usr.IsRobot()
  153. ok, _ := ts.addBet(bet)
  154. if !ok {
  155. go ts.table.WriteUserMoney(userId, bet.Amount, 0, 3, common.GAMEID*100+3, ts.roomInfo.RoomName)
  156. } else {
  157. ts.handleBetSuccess(userId, bet, usr)
  158. }
  159. }
  160. ts.table.SendGameData(-1, msg, data)
  161. }
  162. // 处理免费筹码下注
  163. func (ts *tablesink) handleFreeBet(userIndex int32, userId int, data string) {
  164. usr, _ := ts.table.GetUser(userIndex)
  165. if usr == nil {
  166. log.Debug("tablesink.handleFreeBet user not exist")
  167. return
  168. }
  169. // log.Debug("handleFreeBet %v", data)
  170. var bet common.Bet
  171. e := json.Unmarshal([]byte(data), &bet)
  172. if e != nil {
  173. log.Release("handleFreeBet Unmarshal data failed %v |e=%v:", data, e)
  174. return
  175. }
  176. amount := bet.Amount
  177. bet.UserId = userId
  178. bet.IsFree = true
  179. bet.IsRobot = usr.IsRobot()
  180. if amount <= 0 {
  181. ts.sendBetFailed(userIndex, bet.Index, "Invalid Bet!")
  182. return
  183. }
  184. // 看下能否下注
  185. ok, errMsg := ts.isCanBet(bet)
  186. if !ok {
  187. ts.sendBetFailed(userIndex, bet.Index, errMsg)
  188. return
  189. }
  190. //检查免费筹码数量
  191. freeChip, _ := ts.freeChips.checkFreeChipsNum(userId)
  192. if freeChip < amount {
  193. log.Debug("handleFreeBet.checkFreeChipsNum Not enough free chip amount:%v,freeChip:%v", amount, freeChip)
  194. ts.sendBetFailed(userIndex, bet.Index, "Not enough free chip!")
  195. return
  196. }
  197. //扣除免费筹码
  198. ok, freeChip = ts.freeChips.useFreeChips(userId, amount)
  199. if !ok {
  200. log.Debug("handleFreeBet.useFreeChips Not enough free chip %v,freeChip:%v", ok, freeChip)
  201. ts.sendBetFailed(userIndex, bet.Index, "Not enough free chip!")
  202. return
  203. }
  204. ok, err := ts.addBet(bet)
  205. if !ok {
  206. //下注失败,返还免费筹码
  207. ts.freeChips.addFreeChips(userId, amount)
  208. ts.sendBetFailed(userIndex, bet.Index, err)
  209. } else {
  210. //免费不记录下注额
  211. d, _ := json.Marshal(bet)
  212. ts.table.SendGameData(userIndex, FreeBet, string(d))
  213. }
  214. }
  215. // 成功下注后处理handleBetSuccess
  216. func (ts *tablesink) handleBetSuccess(userId int, bet common.Bet, usr *user.UserInfo) {
  217. if !usr.IsRobot() {
  218. amount := bet.Amount
  219. switch bet.BetId {
  220. case int(common.Apple):
  221. ts.appleAmount += amount
  222. ts.drawAppleWinAmount += amount
  223. case int(common.Watermelon):
  224. ts.watermelonAmount += amount
  225. case int(common.Grape):
  226. ts.grapeAmount += amount
  227. case int(common.Banana):
  228. ts.bananaAmount += amount
  229. case int(common.Orange):
  230. ts.orangeAmount += amount
  231. }
  232. }
  233. }
  234. func (ts *tablesink) onBetClear(userIndex int32, userId int, msg, data string) {
  235. ts.lock.Lock()
  236. betList, ok := ts.userBetList[userId]
  237. if !ok {
  238. ts.lock.Unlock()
  239. return
  240. }
  241. amount := 0
  242. for _, v := range betList {
  243. ts.roomInfo.TotalBet -= v.Amount
  244. amount += v.Amount
  245. }
  246. delete(ts.userBetList, userId)
  247. ts.lock.Unlock()
  248. ts.table.WriteUserMoney(userId, amount, 0, 3, common.GAMEID*100+3, ts.roomInfo.RoomName)
  249. betClear := common.UserClear{UserId: userId}
  250. d, _ := json.Marshal(betClear)
  251. ts.table.SendGameData(userIndex, msg, string(d))
  252. ts.userList.clearBet(userId, amount)
  253. }
  254. func (ts *tablesink) onGetBetRecord(userIndex int32, userId int, msg, data string) {
  255. //log.Debug("tablesink.onGetBetRecord %v", data)
  256. var getRecord struct {
  257. RecordCount int
  258. }
  259. e := json.Unmarshal([]byte(data), &getRecord)
  260. if e != nil {
  261. log.Release("tablesink.onGetBetRecord Unmarshal data failed %v", data)
  262. return
  263. }
  264. records := transaction.GetGameRecord(userId, common.GAMEID, ts.roomInfo.RoomName, getRecord.RecordCount)
  265. retData, _ := json.Marshal(records)
  266. ts.table.SendGameData(userIndex, msg, string(retData))
  267. }
  268. func (ts *tablesink) sendGameOption(userIndex int32) {
  269. d, _ := json.Marshal(ts.roomInfo.RoomInfoBase)
  270. ts.table.SendGameData(userIndex, Option, string(d))
  271. }
  272. func (ts *tablesink) onGetBetRank(userIndex int32, userId int, msg, data string) {
  273. //用户id
  274. var userIds []int
  275. //获取betRank前15名
  276. rankList, jackpot, myBetAmount, myRank := ts.betRank.getRankList(userId)
  277. log.Debug("tablesink.onGetBetRank %v,userId:%d,rankList:%v, jackpot:%d, myBetAmount:%d, myRank:%d", data, userId, rankList, jackpot, myBetAmount, myRank)
  278. //不为空
  279. if len(rankList) > 0 {
  280. //拼接数据返回
  281. var rankData struct {
  282. RankList []common.ScoreUser
  283. Jackpot int
  284. MyBetAmount int
  285. MyRank int
  286. }
  287. scoreUserList := make([]common.ScoreUser, 0, len(rankList))
  288. //如果rankList昵称为空则补齐
  289. userIds = make([]int, len(rankList))
  290. for i, u := range rankList {
  291. userIds[i] = u.UserId
  292. }
  293. users := userservices.GetUserInfoInBulk(userIds)
  294. //如果rankList昵称为空则补齐
  295. for i, v := range rankList {
  296. scoreUser := common.ScoreUser{
  297. UserId: v.UserId,
  298. BetAmount: v.BetAmount,
  299. NickName: "",
  300. FaceId: 0,
  301. FaceUrl: "",
  302. VipLevel: 0,
  303. VipExpire: 0,
  304. Decorations: nil,
  305. }
  306. user := users[i]
  307. if user.UserId == v.UserId {
  308. scoreUser.NickName = user.NickName
  309. scoreUser.FaceId = user.FaceId
  310. scoreUser.FaceUrl = user.FaceUrl
  311. scoreUser.VipLevel = user.Vip
  312. scoreUser.VipExpire = user.VipExpire
  313. scoreUser.Decorations = user.Decorations
  314. }
  315. scoreUserList = append(scoreUserList, scoreUser)
  316. }
  317. rankData.RankList = scoreUserList
  318. rankData.Jackpot = jackpot
  319. rankData.MyBetAmount = myBetAmount
  320. rankData.MyRank = myRank
  321. retData, _ := json.Marshal(rankData)
  322. ts.table.SendGameData(userIndex, msg, string(retData))
  323. } else {
  324. ts.table.SendGameData(userIndex, msg, "[]")
  325. }
  326. }
  327. func (ts *tablesink) onGetBetList(userIndex int32, userId int, msg, data string) {
  328. rankList := ts.userList.getBetGoldRankingUsers(0)
  329. log.Debug("tablesink.onGetBetList %v,rankList:%v", data, rankList)
  330. //不为空
  331. if len(rankList) > 0 {
  332. retData, _ := json.Marshal(rankList)
  333. ts.table.SendGameData(userIndex, msg, string(retData))
  334. } else {
  335. ts.table.SendGameData(userIndex, msg, "[]")
  336. }
  337. }
  338. func (ts *tablesink) onCheckFreeChip(userIndex int32, userId int, msg, data string) {
  339. //log.Debug("tablesink.onCheckFreeChip %v", data)
  340. freeChip, lastHour := ts.freeChips.checkFreeChipsNum(userId)
  341. //返回数据
  342. var result struct {
  343. Free int //剩余免费额度
  344. LastHour int //前一次领取时间 0 6 12 18
  345. }
  346. result.Free = freeChip
  347. result.LastHour = lastHour
  348. retData, _ := json.Marshal(result)
  349. ts.table.SendGameData(userIndex, msg, string(retData))
  350. }