controller.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. package callback
  2. import (
  3. "bet24.com/servers/micros/audioroom/handler/manager"
  4. "encoding/hex"
  5. "encoding/json"
  6. "net/http"
  7. "sort"
  8. "strconv"
  9. "strings"
  10. "bet24.com/log"
  11. "bet24.com/public"
  12. "bet24.com/servers/micros/audioroom/config"
  13. pb "bet24.com/servers/micros/audioroom/proto"
  14. "github.com/gin-gonic/gin"
  15. )
  16. // 创建房间(房间第1个人进来时创建的房间流)
  17. func CreateRoom(c *gin.Context) {
  18. var req Request_CreateRoom
  19. if err := c.ShouldBind(&req); err != nil {
  20. log.Error("callback.CreateRoom params err %v", err)
  21. return
  22. }
  23. log.Debug("controller.CreateRoom %+v", req)
  24. // 处理业务逻辑
  25. if !checkSign(req.Signature, req.Timestamp, req.Nonce) {
  26. log.Error("controller.CreateRoom 校验失败 %+v", req)
  27. return
  28. }
  29. roomId, err := strconv.Atoi(req.Room_id)
  30. if err != nil {
  31. log.Error("controller.CreateRoom room_id strconv.Atoi err %v", err)
  32. return
  33. }
  34. // 获取房间信息
  35. buf, _ := json.Marshal(struct {
  36. RoomId int
  37. }{
  38. RoomId: roomId,
  39. })
  40. pb.OnAudioRoomMsg(0, "getAudioRoom", string(buf))
  41. c.String(http.StatusOK, "success")
  42. return
  43. }
  44. // 登录房间
  45. func LoginRoom(c *gin.Context) {
  46. var req Request_LoginRoom
  47. if err := c.ShouldBind(&req); err != nil {
  48. log.Error("callback.LoginRoom params err %v", err)
  49. return
  50. }
  51. log.Debug("controller.LoginRoom %+v", req)
  52. // 处理业务逻辑
  53. if !checkSign(req.Signature, req.Timestamp, req.Nonce) {
  54. log.Error("controller.LoginRoom 校验失败 %+v", req)
  55. return
  56. }
  57. userId, err := strconv.Atoi(req.User_account)
  58. if err != nil {
  59. log.Error("controller.LoginRoom user_account strconv.Atoi err %v", err)
  60. return
  61. }
  62. roomId, err := strconv.Atoi(req.Room_id)
  63. if err != nil {
  64. log.Error("controller.LoginRoom room_id strconv.Atoi err %v", err)
  65. return
  66. }
  67. // 进入房间
  68. buf, _ := json.Marshal(struct {
  69. RoomId int
  70. }{
  71. roomId,
  72. })
  73. pb.OnAudioRoomMsg(userId, "enterAudioRoom", string(buf))
  74. c.String(http.StatusOK, "success")
  75. return
  76. }
  77. // 退出房间
  78. func LogoutRoom(c *gin.Context) {
  79. var req Request_LogoutRoom
  80. if err := c.ShouldBind(&req); err != nil {
  81. log.Error("callback.logoutRoom params err %v", err)
  82. return
  83. }
  84. log.Debug("controller.LogoutRoom %+v", req)
  85. // 处理业务逻辑
  86. if !checkSign(req.Signature, req.Timestamp, req.Nonce) {
  87. log.Error("controller.LogoutRoom 校验失败 %+v", req)
  88. return
  89. }
  90. userId, err := strconv.Atoi(req.User_account)
  91. if err != nil {
  92. log.Error("controller.LogoutRoom user_account strconv.Atoi err %v", err)
  93. return
  94. }
  95. roomId, err := strconv.Atoi(req.Room_id)
  96. if err != nil {
  97. log.Error("controller.LogoutRoom room_id strconv.Atoi err %v", err)
  98. return
  99. }
  100. // 离开房间
  101. manager.ExitRoomNotify(userId, roomId)
  102. c.String(http.StatusOK, "success")
  103. return
  104. }
  105. // 流创建回调
  106. func StreamCreate(c *gin.Context) {
  107. var req Request_StreamCreate
  108. if err := c.ShouldBind(&req); err != nil {
  109. log.Error("callback.StreamCreate params err %v", err)
  110. return
  111. }
  112. log.Debug("controller.StreamCreate %+v", req)
  113. // 处理业务逻辑
  114. if !checkSign(req.Signature, req.Timestamp, req.Nonce) {
  115. log.Error("controller.StreamCreate 校验失败 %+v", req)
  116. return
  117. }
  118. userId, err := strconv.Atoi(req.User_id)
  119. if err != nil {
  120. log.Error("controller.StreamCreate user_id strconv.Atoi err %v", err)
  121. return
  122. }
  123. roomId, err := strconv.Atoi(req.Room_id)
  124. if err != nil {
  125. log.Error("controller.StreamCreate room_id strconv.Atoi err %v", err)
  126. return
  127. }
  128. // 上麦通知
  129. manager.OnTheMicNotify(userId, roomId, req.Stream_id)
  130. c.String(http.StatusOK, "success")
  131. return
  132. }
  133. // 流关闭回调
  134. func StreamClose(c *gin.Context) {
  135. var req Request_StreamClose
  136. if err := c.ShouldBind(&req); err != nil {
  137. log.Error("callback.StreamClose params err %v", err)
  138. return
  139. }
  140. log.Debug("controller.StreamClose %+v", req)
  141. // 处理业务逻辑
  142. if !checkSign(req.Signature, req.Timestamp, req.Nonce) {
  143. log.Error("controller.StreamClose 校验失败 %+v", req)
  144. return
  145. }
  146. userId, err := strconv.Atoi(req.User_id)
  147. if err != nil {
  148. log.Error("controller.StreamClose user_id strconv.Atoi err %v", err)
  149. return
  150. }
  151. roomId, err := strconv.Atoi(req.Room_id)
  152. if err != nil {
  153. log.Error("controller.StreamClose room_id strconv.Atoi err %v", err)
  154. return
  155. }
  156. if userId < 0 {
  157. userId *= -1
  158. }
  159. // 下麦
  160. manager.OffTheMicNotify(userId, roomId, req.Stream_id)
  161. c.String(http.StatusOK, "success")
  162. return
  163. }
  164. // 校验
  165. func checkSign(signature, timestamp, nonce string) bool {
  166. var list = []string{config.Server.Zego.Callbacksecret, nonce, timestamp}
  167. // 参数值按字典降序排序
  168. sort.SliceStable(list, func(i, j int) bool {
  169. return list[i] < list[j]
  170. })
  171. data := strings.Join(list, "")
  172. sign := hex.EncodeToString(public.Sha1([]byte(data)))
  173. // log.Debug("controller.checkSign data=%s sign=%s signature=%s", data, sign, signature)
  174. return sign == signature
  175. }