handler.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package ws
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "gadmin/config"
  7. "gadmin/internal/admin/consts"
  8. "gadmin/internal/admin/gm_rpc/rpc_share"
  9. "gadmin/internal/gorm/query"
  10. "gadmin/utility/player"
  11. "leafstalk/covenant/msg"
  12. "strconv"
  13. "time"
  14. "github.com/gorilla/websocket"
  15. "github.com/sirupsen/logrus"
  16. )
  17. var (
  18. errUserNotFound = Msg{
  19. Type: consts.SocketQueryUser,
  20. Code: consts.CodePanicErr,
  21. Msg: "用户查询失败..",
  22. }
  23. )
  24. func (client *Client) HandlerReqMsg(reqMsg ReqMsg) {
  25. if reqMsg.Type != consts.SocketHeartBeat {
  26. logrus.WithField("from", "HandlerReqMsg").Infof("ws收到消息 sid:%d, admin_id:%v, 请求数据: %+v", client.Id, client.claims.ID, reqMsg)
  27. }
  28. switch reqMsg.Type {
  29. // 心跳
  30. case consts.SocketHeartBeat:
  31. client.lastHeart = time.Now().Unix()
  32. client.WriteResp([]byte(`{"type":1, "pong":1}`))
  33. // 查询用户
  34. case consts.SocketQueryUser:
  35. playerId, _ := strconv.ParseInt(reqMsg.Data, 10, 64)
  36. if playerId == 0 {
  37. client.msgChan <- errUserNotFound
  38. }
  39. DB, err := player.GetDBByUserId(playerId)
  40. if err != nil {
  41. client.msgChan <- Msg{
  42. Type: consts.SocketQueryUser,
  43. Code: consts.CodePanicErr,
  44. Msg: "用户查询失败 GetDBByUserId:" + err.Error(),
  45. }
  46. return
  47. }
  48. if DB <= 0 {
  49. client.msgChan <- Msg{
  50. Type: consts.SocketQueryUser,
  51. Code: consts.CodePanicErr,
  52. Msg: "玩家服务器信息获取失败",
  53. }
  54. return
  55. }
  56. data := &msg.GmPlayer{
  57. MsgId: fmt.Sprintf("qu:%d:%d", client.Id, playerId),
  58. PlayerID: playerId,
  59. OperatorId: client.claims.ID,
  60. }
  61. var resp *msg.ResponseGmPlayer
  62. res, err := config.GmNats.GmRequest(DB, "GmPlayer", data)
  63. if err != nil {
  64. client.msgChan <- Msg{
  65. Type: consts.SocketQueryUser,
  66. Code: consts.CodePanicErr,
  67. Msg: "用户查询失败 nats查询出错:" + err.Error(),
  68. }
  69. return
  70. }
  71. if err = json.Unmarshal(res, &resp); err != nil {
  72. client.msgChan <- Msg{
  73. Type: consts.SocketQueryUser,
  74. Code: consts.CodePanicErr,
  75. Msg: "用户查询失败 nats Unmarshal出错:" + err.Error(),
  76. }
  77. return
  78. }
  79. rpc_share.LogChan <- rpc_share.LogMsg{
  80. MsgID: data.MsgId,
  81. Data: resp,
  82. }
  83. // 查询开关
  84. case consts.SocketQuerySwitcher:
  85. data := &msg.GetGmIosPay{
  86. MsgId: fmt.Sprintf("qs:%d:%s", client.Id, reqMsg.Data),
  87. }
  88. q := query.Use(config.DB).ServerOption
  89. server, err := q.Order(q.ID.Desc()).First()
  90. if err != nil {
  91. logrus.Warnf("SocketQuerySwitcher 查询出错 server err:%+v", err)
  92. client.msgChan <- Msg{
  93. Type: consts.SocketQuerySwitcher,
  94. Code: consts.CodePanicErr,
  95. Msg: "查询开关信息失败 获取服务器错误:" + err.Error(),
  96. }
  97. return
  98. }
  99. var resp *msg.ResponseGetGmIosPay
  100. res, err := config.GmNats.GmRequest(int(server.ServerID), "GetGmIosPay", data)
  101. if err != nil {
  102. client.msgChan <- Msg{
  103. Type: consts.SocketQuerySwitcher,
  104. Code: consts.CodePanicErr,
  105. Msg: "查询开关信息失败 nats查询出错:" + err.Error(),
  106. }
  107. return
  108. }
  109. if err = json.Unmarshal(res, &resp); err != nil {
  110. client.msgChan <- Msg{
  111. Type: consts.SocketQueryUserGuide,
  112. Code: consts.CodePanicErr,
  113. Msg: "查询开关信息失败 nats Unmarshal出错:" + err.Error(),
  114. }
  115. return
  116. }
  117. rpc_share.LogChan <- rpc_share.LogMsg{
  118. MsgID: data.MsgId,
  119. Data: resp,
  120. }
  121. }
  122. }
  123. func (client *Client) WriteResp(data []byte) (err error) {
  124. client.Lock.Lock()
  125. defer client.Lock.Unlock()
  126. if client.lastHeart < time.Now().Unix()-300 {
  127. client.c.Close()
  128. return errors.New("timeout")
  129. }
  130. err = client.c.WriteMessage(websocket.TextMessage, data)
  131. return
  132. }