spliter.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. utils.Logger.Println(msg.Event)
  72. _ = conn.WriteJSON(utils.WsError("loginSocket event only"))
  73. break
  74. }
  75. }
  76. }
  77. func SocketHandler(ctx *gin.Context) {
  78. conn, err := utils.UpgradeHttp2Ws.Upgrade(ctx.Writer, ctx.Request, nil)
  79. if err != nil {
  80. utils.Logger.Println("can't establish manager socket connect")
  81. ctx.JSON(utils.HttpError, utils.Fail("can't establish socket connect"))
  82. return
  83. }
  84. getSecrets(conn)
  85. var mid string
  86. token := ctx.Param("token")
  87. if token == "undefined" { // no token -> login
  88. mid, err = loginSocket(conn)
  89. } else {
  90. mid, err = utils.Redis.Get(utils.WxPayCli, token).Result()
  91. if err != nil { // expired -> login
  92. _ = conn.WriteJSON(utils.WsEvent("tokenExpired", nil))
  93. mid, err = loginSocket(conn)
  94. } else { // update expire time
  95. err = utils.Redis.Expire(utils.WxPayCli, token, utils.Duration(7*24*60*60)).Err()
  96. if err != nil {
  97. utils.Logger.Println(err)
  98. }
  99. }
  100. }
  101. if err != nil {
  102. return
  103. }
  104. manager := managerConnected(mid, conn)
  105. if manager == nil {
  106. return
  107. }
  108. defer managerDisconnect(mid)
  109. for {
  110. var msg utils.WsMsg
  111. err = conn.ReadJSON(&msg)
  112. if err != nil {
  113. return
  114. }
  115. if msg.Event == "pin" {
  116. keepAlive(conn)
  117. } else if msg.Event == "getUserInfo" {
  118. getUserInfo(conn, manager)
  119. } else if msg.Event == "logout" {
  120. userLogout(conn, msg.Data)
  121. } else if strings.HasPrefix(msg.Event, "superDashboard") { // super:
  122. superDashboard.Handle(msg, conn, manager)
  123. } else if strings.HasPrefix(msg.Event, "superRole") {
  124. superRole.Handle(msg, conn, manager)
  125. } else if strings.HasPrefix(msg.Event, "superOrder") {
  126. superOrder.Handle(msg, conn, manager)
  127. } else if strings.HasPrefix(msg.Event, "superConfig") {
  128. superConfig.Handle(msg, conn, manager)
  129. } else if strings.HasPrefix(msg.Event, "superRecord") {
  130. superRecord.Handle(msg, conn, manager)
  131. } else if strings.HasPrefix(msg.Event, "adminDashboard") { // admin:
  132. adminDashboard.Handle(msg, conn, manager)
  133. } else if strings.HasPrefix(msg.Event, "adminWorker") {
  134. adminWorker.Handle(msg, conn, manager)
  135. } else if strings.HasPrefix(msg.Event, "adminTrade") {
  136. adminTrade.Handle(msg, conn, manager)
  137. } else if strings.HasPrefix(msg.Event, "adminWine") {
  138. adminWine.Handle(msg, conn, manager)
  139. } else {
  140. _ = conn.WriteJSON(utils.WsError("unrecognized event"))
  141. }
  142. }
  143. }