gameframe_cmd.go 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. package frame
  2. import (
  3. "encoding/json"
  4. "strconv"
  5. "bet24.com/log"
  6. coreservice "bet24.com/servers/coreservice/client"
  7. "bet24.com/servers/insecureframe/gate"
  8. "bet24.com/servers/insecureframe/message"
  9. privateroom "bet24.com/servers/micros/privateroom/proto"
  10. "bet24.com/servers/user"
  11. )
  12. func (f *GameFrame) recvAutoSit(userIndex int32, data string, changeTable bool, isNewUser bool) bool {
  13. // 判断自己状态
  14. usr := gate.GetUserInfo(userIndex)
  15. if usr == nil {
  16. log.Debug("GameFrame.recvAutoSit user not exist %d", userIndex)
  17. return false
  18. }
  19. if usr.GetUserStatus() == user.UserStatus_Play || usr.GetUserStatus() == user.UserStatus_Offline {
  20. log.Debug("GameFrame.recvAutoSit user playing %d", userIndex)
  21. return false
  22. }
  23. roomLevel := f.gameSink.GetRoomLevel(data)
  24. if usr.GetUserLevel() < roomLevel {
  25. log.Debug("GameFrame.recvAutoSit User Level:%d < RoomLevel:%d", usr.GetUserLevel(), roomLevel)
  26. return false
  27. }
  28. lastTableId := usr.GetUserTableId()
  29. if lastTableId != -1 {
  30. // 从原先的桌子离开
  31. lastTable := f.getTable(lastTableId)
  32. if lastTable != nil {
  33. log.Debug("recvAutoSit remove from old table %d", lastTableId)
  34. lastTable.RemoveUser(userIndex, false, false)
  35. }
  36. }
  37. forceCreate := false
  38. if !changeTable {
  39. lastTableId = usr.GetUserLastTableId()
  40. } else {
  41. if f.isForceCreateTable(userIndex) {
  42. forceCreate = true
  43. }
  44. }
  45. // 找到一张桌子
  46. var table *ThreadsafeTable
  47. if isNewUser {
  48. table = f.createTable(data)
  49. } else {
  50. if !forceCreate {
  51. needFree := f.isNeedFreeTable(userIndex)
  52. table = f.getOrCreateTable(lastTableId, data, needFree, usr.GetUserIp())
  53. } else {
  54. table = f.createTable(data)
  55. }
  56. }
  57. if table == nil {
  58. log.Debug("GameFrame.recvAutoSit can not get or create table")
  59. return false
  60. }
  61. log.Debug("recvAutoSit add to new table %d", table.GetTableID())
  62. if f.gameSink.GetChairCount() < 2 {
  63. table.AddTableUser(userIndex, -1, false, true)
  64. } else {
  65. table.AddTableUser(userIndex, -1, false, false)
  66. }
  67. return true
  68. }
  69. func (f *GameFrame) addChangeTable(userIndex int32) {
  70. f.lock_changeTable.Lock()
  71. f.changeTableCount[userIndex]++
  72. f.lock_changeTable.Unlock()
  73. }
  74. func (f *GameFrame) isForceCreateTable(userIndex int32) bool {
  75. ret := false
  76. f.lock_changeTable.Lock()
  77. if f.changeTableCount[userIndex]%3 == 0 {
  78. ret = true
  79. //f.changeTableCount[userIndex] = 0
  80. }
  81. f.lock_changeTable.Unlock()
  82. return ret
  83. }
  84. func (f *GameFrame) isNeedFreeTable(userIndex int32) bool {
  85. f.lock_changeTable.RLock()
  86. defer f.lock_changeTable.RUnlock()
  87. return f.changeTableCount[userIndex] == 0
  88. }
  89. func (f *GameFrame) recvChangeTable(userIndex int32, data string) bool {
  90. f.addChangeTable(userIndex)
  91. return f.recvAutoSit(userIndex, data, true, false)
  92. }
  93. func (f *GameFrame) recvSitTable(userIndex int32, data string) bool {
  94. if f.gameSink.GetChairCount() < 2 {
  95. return f.recvWatchTable(userIndex, data)
  96. }
  97. //log.Debug("GameFrame.recvSitTable,%s", data)
  98. // 判断自己状态
  99. usr := gate.GetUserInfo(userIndex)
  100. if usr == nil {
  101. log.Debug("GameFrame.recvSitTable user not exist %d", userIndex)
  102. return false
  103. }
  104. var sit message.SitTable
  105. e := json.Unmarshal([]byte(data), &sit)
  106. if e != nil {
  107. log.Debug("GameFrame.recvSitTable Unmarshal failed %s", data)
  108. return false
  109. }
  110. user_status := usr.GetUserStatus()
  111. if user_status == user.UserStatus_Play {
  112. log.Debug("GameFrame.recvSitTable user playing %d", userIndex)
  113. return false
  114. }
  115. // 如果我的状态本来就是坐下的,
  116. /*if user_status == user.UserStatus_Sit && sit.TableId <= 0 {
  117. log.Debug("GameFrame.recvSitTable 已经坐下了")
  118. return false
  119. }*/
  120. // 如果我的状态是旁观的
  121. if user_status == user.UserStatus_Watch {
  122. // 直接转成坐下状态
  123. //f.setUserStatus(userIndex, user.UserStatus_Sit)
  124. sit.TableId = usr.GetUserTableId()
  125. }
  126. if sit.TableId < 0 {
  127. log.Debug("GameFrame.recvSitTable table not found %d", sit.TableId)
  128. return false
  129. }
  130. table := f.getTable(sit.TableId)
  131. if table == nil {
  132. log.Debug("GameFrame.recvSitTable table not found %d", sit.TableId)
  133. return false
  134. }
  135. // 如果多局已开始,不让坐下
  136. if table.IsMultiSetPlaying() {
  137. log.Debug("GameFrame.recvSitTable IsMultiSetPlaying %d", sit.TableId)
  138. return false
  139. }
  140. lastTableId := usr.GetUserTableId()
  141. if lastTableId != -1 && lastTableId != sit.TableId {
  142. // 从原先的桌子离开
  143. lastTable := f.getTable(lastTableId)
  144. if lastTable != nil {
  145. lastTable.RemoveUser(userIndex, false, false)
  146. }
  147. }
  148. /*
  149. 可以旁观
  150. if table.GetTableStatus() == TableStatus_Playing {
  151. return false
  152. }
  153. */
  154. log.Debug("GameFrame.recvSitTable,%s", data)
  155. // 如果是私人场,dual玩法
  156. sit.ChairId = table.adjustPrivateChairId(sit.ChairId)
  157. if sit.ChairId != -1 && !table.isChairEmpty(sit.ChairId) {
  158. return false
  159. }
  160. // 如果是私人场,并且是换位置
  161. if table.isPrivate() &&
  162. lastTableId == sit.TableId &&
  163. (user_status == user.UserStatus_Sit || user_status == user.UserStatus_Ready) &&
  164. usr.GetUserChairId() != sit.ChairId {
  165. if !privateroom.UserChangeChair(table.roomNo, usr.GetUserId(), sit.ChairId) {
  166. log.Release("GameFrame.recvSitTable UserChangeChair failed")
  167. return false
  168. }
  169. table.RemoveUser(userIndex, false, true)
  170. }
  171. return table.AddTableUser_sync(userIndex, sit.ChairId, false, false)
  172. }
  173. func (f *GameFrame) recvWatchTable(userIndex int32, data string) bool {
  174. usr := gate.GetUserInfo(userIndex)
  175. if usr == nil {
  176. log.Debug("GameFrame.recvWatchTable user not exist")
  177. return false
  178. }
  179. // 如果是playing
  180. if usr.GetUserStatus() == user.UserStatus_Play {
  181. log.Debug("GameFrame.recvWatchTable user playing")
  182. gate.SendMessage(userIndex, message.Frame_Watch, "watch failed")
  183. return false
  184. }
  185. var sit message.SitTable
  186. e := json.Unmarshal([]byte(data), &sit)
  187. if e != nil {
  188. log.Debug("GameFrame.recvWatchTable Unmarshal failed %s", data)
  189. return false
  190. }
  191. table := f.getTable(sit.TableId)
  192. if table == nil {
  193. log.Debug("GameFrame.recvWatchTable table not found %d", usr.GetUserTableId())
  194. return false
  195. }
  196. return table.AddTableUser(userIndex, sit.ChairId, false, true)
  197. }
  198. func (f *GameFrame) recvStandup(userIndex int32, data string) bool {
  199. usr := gate.GetUserInfo(userIndex)
  200. if usr == nil {
  201. log.Debug("GameFrame.recvStandup user not exist")
  202. return false
  203. }
  204. table := f.getTable(usr.GetUserTableId())
  205. if table == nil {
  206. log.Debug("GameFrame.recvStandup table not found %d", usr.GetUserTableId())
  207. return false
  208. }
  209. table.RemoveUser(userIndex, false, false)
  210. return true
  211. }
  212. func (f *GameFrame) recvWatch(userIndex int32, data string) bool {
  213. usr := gate.GetUserInfo(userIndex)
  214. if usr == nil {
  215. log.Debug("GameFrame.recvWatch user not exist")
  216. return false
  217. }
  218. // 如果是playing
  219. if usr.GetUserStatus() == user.UserStatus_Play {
  220. log.Debug("GameFrame.recvWatch user playing")
  221. gate.SendMessage(userIndex, message.Frame_Watch, "watch failed")
  222. return false
  223. }
  224. table := f.getTable(usr.GetUserTableId())
  225. if table == nil {
  226. log.Debug("GameFrame.recvWatch table not found %d", usr.GetUserTableId())
  227. return false
  228. }
  229. table.userWatch(userIndex)
  230. return true
  231. }
  232. func (f *GameFrame) recvReady(userIndex int32, isReady bool) bool {
  233. usr := gate.GetUserInfo(userIndex)
  234. if usr == nil {
  235. log.Debug("GameFrame.recvReady user not exist")
  236. return false
  237. }
  238. table := f.getTable(usr.GetUserTableId())
  239. if table == nil {
  240. log.Debug("GameFrame.recvReady table not found %d", usr.GetUserTableId())
  241. return false
  242. }
  243. return table.setUserReadyStatus(userIndex, isReady)
  244. }
  245. func (f *GameFrame) recvAdReward(userIndex int32, data string) bool {
  246. if f.gameSink.IsChipRoom() {
  247. return false
  248. }
  249. usr := gate.GetUserInfo(userIndex)
  250. if usr == nil {
  251. log.Debug("GameFrame.recvAdReward user not exist")
  252. return false
  253. }
  254. serialNo, err := strconv.Atoi(data)
  255. if err != nil {
  256. log.Debug("GameFrame.recvAdReward invalid argument [%s]", data)
  257. return false
  258. }
  259. // 调用coreservice的视频奖励
  260. // 根据返回信息刷新金币,并通知用户
  261. var rewarded message.AdRewarded
  262. rewarded.UserId = usr.GetUserId()
  263. rewarded.SerialNo = serialNo
  264. rewarded.Gold = coreservice.VideoSettle(rewarded.UserId, serialNo)
  265. d, _ := json.Marshal(rewarded)
  266. // log.Debug("GameFrame.recvAdReward sending data %s", string(d))
  267. gate.SendMessage(userIndex, message.Frame_ADReward, string(d))
  268. if rewarded.Gold > 0 {
  269. gate.RefreshGold(userIndex)
  270. }
  271. return true
  272. }
  273. func (f *GameFrame) recvFramePing(userIndex int32, data string) bool {
  274. gate.SendMessage(userIndex, message.Frame_Ping, data)
  275. return true
  276. }
  277. func (f *GameFrame) recvFrameVoiceMessage(userIndex int32, userId int, msg, data string) bool {
  278. usr := gate.GetUserInfo(userIndex)
  279. if usr == nil {
  280. log.Debug("recvFrameVoiceMessage user not exist,%d:%d,%s", userIndex, userId, msg)
  281. return false
  282. }
  283. table := f.getTable(usr.GetUserTableId())
  284. if table == nil {
  285. log.Debug("recvFrameVoiceMessage user not in table,%d:%d,%s", userIndex, userId, msg)
  286. return false
  287. }
  288. var voiceData struct {
  289. ChairId int
  290. Data string
  291. }
  292. voiceData.ChairId = usr.GetUserChairId()
  293. voiceData.Data = data
  294. d, _ := json.Marshal(voiceData)
  295. table.broadcastData(msg, string(d))
  296. return true
  297. }
  298. func (f *GameFrame) recvTableMessage(userIndex int32, userID int, msg, data string) bool {
  299. usr := gate.GetUserInfo(userIndex)
  300. if usr == nil {
  301. log.Debug("recvTableMessage user not exist,%d:%d,%s", userIndex, userID, msg)
  302. return false
  303. }
  304. table := f.getTable(usr.GetUserTableId())
  305. if table == nil {
  306. log.Debug("recvTableMessage user not in table,%d:%d,%s", userIndex, userID, msg)
  307. return false
  308. }
  309. return table.onTableMessage(usr, msg, data)
  310. }