spliter.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package manager
  2. import (
  3. "Wine-Server/utils"
  4. "Wine-Server/utils/tables"
  5. "github.com/gin-gonic/gin"
  6. "github.com/gorilla/websocket"
  7. )
  8. func managerConnected(mid string, conn *websocket.Conn) *tables.ManagerTable {
  9. table := &tables.ManagerTable{Id: mid}
  10. err := table.Get()
  11. if err != nil {
  12. utils.Logger.Println("manager query failed:", err)
  13. _ = conn.WriteJSON(utils.WsError("manager query failed"))
  14. return nil
  15. }
  16. table.Last = utils.TimeNow()
  17. err = table.Update(utils.JsonType{"last": table.Last})
  18. if err != nil {
  19. utils.Logger.Println("update last active time failed:", err)
  20. _ = conn.WriteJSON(utils.WsError("Update last active time failed"))
  21. return nil
  22. }
  23. if _, exist := utils.ManagerWss[mid]; exist {
  24. _ = conn.WriteJSON(utils.WsEvent("onePageOnly", nil))
  25. return nil
  26. }
  27. utils.ManagerLock.Lock()
  28. utils.ManagerWss[mid] = conn
  29. utils.ManagerLock.Unlock()
  30. utils.Logger.Printf("manager[%s] connected\n", mid)
  31. return table
  32. }
  33. func managerDisconnect(mid string) {
  34. utils.ManagerLock.Lock()
  35. delete(utils.ManagerWss, mid)
  36. utils.ManagerLock.Unlock()
  37. utils.Logger.Printf("manager[%s] disconnected\n", mid)
  38. }
  39. func loginSocket(conn *websocket.Conn) (string, error) {
  40. var mid string
  41. for {
  42. var msg utils.WsMsg
  43. err := conn.ReadJSON(&msg)
  44. if err != nil {
  45. _ = conn.Close()
  46. return "", err
  47. }
  48. switch msg.Event {
  49. case "pin":
  50. keepAlive(conn)
  51. break
  52. case "getUserInfo": // in case: redis token expired
  53. break
  54. case "login":
  55. mid, err = userLogin(conn, msg.Data)
  56. if err == nil {
  57. return mid, nil
  58. }
  59. break
  60. default:
  61. utils.Logger.Println(msg.Event)
  62. _ = conn.WriteJSON(utils.WsError("loginSocket event only"))
  63. break
  64. }
  65. }
  66. }
  67. func SocketHandler(ctx *gin.Context) {
  68. conn, err := utils.UpgradeHttp2Ws.Upgrade(ctx.Writer, ctx.Request, nil)
  69. if err != nil {
  70. utils.Logger.Println("can't establish manager socket connect")
  71. ctx.JSON(utils.HttpError, utils.Fail("can't establish socket connect"))
  72. return
  73. }
  74. getSecrets(conn)
  75. var mid string
  76. token := ctx.Param("token")
  77. if token == "undefined" { // no token -> login
  78. mid, err = loginSocket(conn)
  79. } else {
  80. mid, err = utils.Redis.Get(utils.WxPayCli, token).Result()
  81. if err != nil { // expired -> login
  82. _ = conn.WriteJSON(utils.WsEvent("tokenExpired", nil))
  83. mid, err = loginSocket(conn)
  84. } else { // update expire time
  85. err = utils.Redis.Expire(utils.WxPayCli, token, utils.Duration(7*24*60*60)).Err()
  86. if err != nil {
  87. utils.Logger.Println(err)
  88. }
  89. }
  90. }
  91. if err != nil {
  92. return
  93. }
  94. manager := managerConnected(mid, conn)
  95. if manager == nil {
  96. return
  97. }
  98. defer managerDisconnect(mid)
  99. for {
  100. var msg utils.WsMsg
  101. err = conn.ReadJSON(&msg)
  102. if err != nil {
  103. return
  104. }
  105. switch msg.Event {
  106. case "pin":
  107. keepAlive(conn)
  108. break
  109. case "getUserInfo":
  110. getUserInfo(conn, manager)
  111. break
  112. case "logout":
  113. userLogout(conn, msg.Data)
  114. return
  115. case "superQueryManager":
  116. superQueryManager(conn, manager, msg.Data)
  117. break
  118. case "superQueryDevice":
  119. superQueryDevice(conn, manager, msg.Data)
  120. break
  121. case "superUpdateDevice":
  122. superUpdateDevice(conn, manager, msg.Data)
  123. break
  124. case "superBatchAssign":
  125. superBatchAssign(conn, manager, msg.Data)
  126. break
  127. case "superQueryWine":
  128. superQueryWine(conn, manager, msg.Data)
  129. break
  130. case "superDeleteWine":
  131. superDeleteWine(conn, manager, msg.Data)
  132. break
  133. default:
  134. _ = conn.WriteJSON(utils.WsError("unrecognized event"))
  135. break
  136. }
  137. }
  138. }