threadsafe_table_privateroom.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package frame
  2. import (
  3. "bet24.com/log"
  4. "bet24.com/servers/insecureframe/message"
  5. privateroom "bet24.com/servers/micros/privateroom/proto"
  6. "bet24.com/servers/user"
  7. "context"
  8. "encoding/json"
  9. "time"
  10. )
  11. const (
  12. dismiss_none = iota
  13. dismiss_yes
  14. dismiss_no
  15. )
  16. const dimiss_wait_sec = 120
  17. func (t *ThreadsafeTable) sendMessageToMainThread(msg *threadsafe_message) {
  18. if t.stopped {
  19. if msg.Callback != nil {
  20. msg.Callback <- 1
  21. }
  22. log.Release("sendMessageToMainThread tableId[%d] [%s] stopped", t.tableId, msg.Msg)
  23. return
  24. }
  25. for {
  26. c, cancel := context.WithTimeout(context.Background(), 2*time.Second)
  27. select {
  28. case t.messageChan <- msg:
  29. cancel()
  30. return
  31. case <-c.Done():
  32. log.Release("sendMessageToMainThread tableId[%d] [%s] [%s]timeout", t.tableId, msg.Msg, msg.Data)
  33. //gameFrame.dump()
  34. if msg.Callback != nil {
  35. msg.Callback <- 1
  36. }
  37. cancel()
  38. return
  39. }
  40. }
  41. }
  42. func (t *ThreadsafeTable) onPrivateRoomStatusChanged(old, new int) {
  43. data := msg_statusChanged{OldStatus: old, NewStatus: new}
  44. d, _ := json.Marshal(data)
  45. callBack := make(chan byte)
  46. msg := &threadsafe_message{Msg: "privateRoomStatusChanged", Data: string(d), Callback: callBack}
  47. //t.messageChan <- msg
  48. go t.sendMessageToMainThread(msg)
  49. <-callBack
  50. }
  51. func (t *ThreadsafeTable) onPrivateRoomDismissed() {
  52. callBack := make(chan byte)
  53. msg := &threadsafe_message{Msg: "privateRoomDismissed", Data: "", Callback: callBack}
  54. //t.messageChan <- msg
  55. go t.sendMessageToMainThread(msg)
  56. <-callBack
  57. }
  58. func (t *ThreadsafeTable) onPrivateRoomRequestDismiss(usr *user.UserInfo, msg, data string) bool {
  59. if t.isPrivateRoomDismissing() {
  60. log.Release("ThreadsafeTable.onPrivateRoomRequestDismiss dismissing")
  61. return false
  62. }
  63. chairId := usr.GetUserChairId()
  64. if chairId < 0 || chairId >= len(t.dismissRequest) {
  65. log.Release("ThreadsafeTable.onPrivateRoomRequestDismiss user chair invalid %d", chairId)
  66. return false
  67. }
  68. if !t.IsPlaying() {
  69. if usr.GetUserId() == t.owner {
  70. go privateroom.DismissPrivateRoom(t.roomNo)
  71. return true
  72. }
  73. log.Release("ThreadsafeTable.onPrivateRoomRequestDismiss not playing and not owner")
  74. return false
  75. }
  76. t.dismissRequest[chairId] = dismiss_yes
  77. t.broadcastPrivateRoomDismissStatus()
  78. if t.dismissTimer != nil {
  79. t.dismissTimer.Stop()
  80. }
  81. t.dismissTimer = time.AfterFunc(time.Second*dimiss_wait_sec, t.onDimissTimout)
  82. return true
  83. }
  84. func (t *ThreadsafeTable) onPrivateRoomDismissResp(usr *user.UserInfo, msg, data string) bool {
  85. if !t.isPrivateRoomDismissing() {
  86. log.Release("ThreadsafeTable.onPrivateRoomDismissResp not dismissing")
  87. return false
  88. }
  89. chairId := usr.GetUserChairId()
  90. if chairId < 0 || chairId >= len(t.dismissRequest) {
  91. log.Release("ThreadsafeTable.onPrivateRoomDismissResp user chair invalid %d", chairId)
  92. return false
  93. }
  94. if t.dismissRequest[chairId] != dismiss_none {
  95. log.Release("ThreadsafeTable.onPrivateRoomDismissResp user already responsed")
  96. return false
  97. }
  98. if data == "1" {
  99. t.dismissRequest[chairId] = dismiss_yes
  100. } else {
  101. t.dismissRequest[chairId] = dismiss_no
  102. }
  103. t.broadcastPrivateRoomDismissStatus()
  104. // 检查是否足够解散了
  105. t.checkPrivateRoomDismiss()
  106. return true
  107. }
  108. func (t *ThreadsafeTable) onDimissTimout() {
  109. for i := 0; i < len(t.dismissRequest); i++ {
  110. if t.dismissRequest[i] == dismiss_none {
  111. t.dismissRequest[i] = dismiss_yes
  112. }
  113. }
  114. t.checkPrivateRoomDismiss()
  115. }
  116. func (t *ThreadsafeTable) checkPrivateRoomDismiss() {
  117. yesCount := 0
  118. noCount := 0
  119. userCount := t.getPlayerCount()
  120. for _, v := range t.dismissRequest {
  121. if v == dismiss_yes {
  122. yesCount++
  123. }
  124. if v == dismiss_no {
  125. noCount++
  126. }
  127. }
  128. if yesCount == userCount {
  129. go privateroom.DismissPrivateRoom(t.roomNo)
  130. t.resetPrivateRoomDismiss()
  131. return
  132. }
  133. if noCount > 0 {
  134. t.resetPrivateRoomDismiss()
  135. return
  136. }
  137. }
  138. func (t *ThreadsafeTable) broadcastPrivateRoomDismissStatus() {
  139. d, _ := json.Marshal(t.dismissRequest)
  140. t.broadcastData(message.Frame_PrivateRoom_DimiissStatus, string(d))
  141. }
  142. func (t *ThreadsafeTable) isPrivateRoomDismissing() bool {
  143. for _, v := range t.dismissRequest {
  144. if v != dismiss_none {
  145. return true
  146. }
  147. }
  148. return false
  149. }
  150. func (t *ThreadsafeTable) resetPrivateRoomDismiss() {
  151. t.dismissTimer.Stop()
  152. t.dismissRequest = make([]int, t.tableSink.OnGetChairCount())
  153. }
  154. func (t *ThreadsafeTable) getPrivateRoomDismissYesCount() int {
  155. count := 0
  156. for _, v := range t.dismissRequest {
  157. if v != dismiss_yes {
  158. count++
  159. }
  160. }
  161. return count
  162. }