123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- package manager
- import (
- adminDashboard "Wine-Server/handlers/manager/admin/dashboard"
- adminTrade "Wine-Server/handlers/manager/admin/trade"
- adminWine "Wine-Server/handlers/manager/admin/wine"
- adminWorker "Wine-Server/handlers/manager/admin/worker"
- superConfig "Wine-Server/handlers/manager/super/config"
- superDashboard "Wine-Server/handlers/manager/super/dashboard"
- superOrder "Wine-Server/handlers/manager/super/order"
- superRecord "Wine-Server/handlers/manager/super/record"
- superRole "Wine-Server/handlers/manager/super/role"
- "Wine-Server/utils"
- "Wine-Server/utils/tables"
- "github.com/gin-gonic/gin"
- "github.com/gorilla/websocket"
- "strings"
- )
- func managerConnected(mid string, conn *websocket.Conn) *tables.ManagerTable {
- table := &tables.ManagerTable{Id: mid}
- err := table.Get()
- if err != nil {
- utils.Logger.Println("manager query failed:", err)
- _ = conn.WriteJSON(utils.WsError("manager query failed"))
- return nil
- }
- table.Last = utils.TimeNow()
- err = table.Update(utils.JsonType{"last": table.Last})
- if err != nil {
- utils.Logger.Println("update last active time failed:", err)
- _ = conn.WriteJSON(utils.WsError("Update last active time failed"))
- return nil
- }
- if _, exist := utils.ManagerWss[mid]; exist {
- _ = conn.WriteJSON(utils.WsEvent("onePageOnly", nil))
- return nil
- }
- utils.ManagerLock.Lock()
- utils.ManagerWss[mid] = conn
- utils.ManagerLock.Unlock()
- utils.Logger.Printf("manager[%s] connected\n", mid)
- return table
- }
- func managerDisconnect(mid string) {
- utils.ManagerLock.Lock()
- delete(utils.ManagerWss, mid)
- utils.ManagerLock.Unlock()
- utils.Logger.Printf("manager[%s] disconnected\n", mid)
- }
- func loginSocket(conn *websocket.Conn) (string, error) {
- var mid string
- for {
- var msg utils.WsMsg
- err := conn.ReadJSON(&msg)
- if err != nil {
- _ = conn.Close()
- return "", err
- }
- switch msg.Event {
- case "pin":
- keepAlive(conn)
- break
- case "getUserInfo": // in case: redis token expired
- break
- case "login":
- mid, err = userLogin(conn, msg.Data)
- if err == nil {
- return mid, nil
- }
- break
- default:
- utils.Logger.Println(msg.Event)
- _ = conn.WriteJSON(utils.WsError("loginSocket event only"))
- break
- }
- }
- }
- func SocketHandler(ctx *gin.Context) {
- conn, err := utils.UpgradeHttp2Ws.Upgrade(ctx.Writer, ctx.Request, nil)
- if err != nil {
- utils.Logger.Println("can't establish manager socket connect")
- ctx.JSON(utils.HttpError, utils.Fail("can't establish socket connect"))
- return
- }
- getSecrets(conn)
- var mid string
- token := ctx.Param("token")
- if token == "undefined" { // no token -> login
- mid, err = loginSocket(conn)
- } else {
- mid, err = utils.Redis.Get(utils.WxPayCli, token).Result()
- if err != nil { // expired -> login
- _ = conn.WriteJSON(utils.WsEvent("tokenExpired", nil))
- mid, err = loginSocket(conn)
- } else { // update expire time
- err = utils.Redis.Expire(utils.WxPayCli, token, utils.Duration(7*24*60*60)).Err()
- if err != nil {
- utils.Logger.Println(err)
- }
- }
- }
- if err != nil {
- return
- }
- manager := managerConnected(mid, conn)
- if manager == nil {
- return
- }
- defer managerDisconnect(mid)
- for {
- var msg utils.WsMsg
- err = conn.ReadJSON(&msg)
- if err != nil {
- return
- }
- if msg.Event == "pin" {
- keepAlive(conn)
- } else if msg.Event == "getUserInfo" {
- getUserInfo(conn, manager)
- } else if msg.Event == "logout" {
- userLogout(conn, msg.Data)
- } else if strings.HasPrefix(msg.Event, "superDashboard") { // super:
- superDashboard.Handle(msg, conn, manager)
- } else if strings.HasPrefix(msg.Event, "superRole") {
- superRole.Handle(msg, conn, manager)
- } else if strings.HasPrefix(msg.Event, "superOrder") {
- superOrder.Handle(msg, conn, manager)
- } else if strings.HasPrefix(msg.Event, "superConfig") {
- superConfig.Handle(msg, conn, manager)
- } else if strings.HasPrefix(msg.Event, "superRecord") {
- superRecord.Handle(msg, conn, manager)
- } else if strings.HasPrefix(msg.Event, "adminDashboard") { // admin:
- adminDashboard.Handle(msg, conn, manager)
- } else if strings.HasPrefix(msg.Event, "adminWorker") {
- adminWorker.Handle(msg, conn, manager)
- } else if strings.HasPrefix(msg.Event, "adminTrade") {
- adminTrade.Handle(msg, conn, manager)
- } else if strings.HasPrefix(msg.Event, "adminWine") {
- adminWine.Handle(msg, conn, manager)
- } else {
- _ = conn.WriteJSON(utils.WsError("unrecognized event"))
- }
- }
- }
|