spliter.go 4.3 KB

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