spliter.go 4.6 KB

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