package controller import ( "strings" "ems.agt/src/framework/i18n" "ems.agt/src/framework/logger" "ems.agt/src/framework/utils/ctx" "ems.agt/src/framework/utils/parse" "ems.agt/src/framework/vo/result" "ems.agt/src/modules/ws/service" "github.com/gin-gonic/gin" ) // 实例化控制层 WSController 结构体 var NewWSController = &WSController{ wsService: service.NewWSImpl, wsSendService: service.NewWSSendImpl, } // WebSocket通信 // // PATH /ws type WSController struct { // WebSocket 服务 wsService service.IWS // WebSocket消息发送 服务 wsSendService service.IWSSend } // 通用 // // GET /?subGroupIDs=0 func (s *WSController) WS(c *gin.Context) { language := ctx.AcceptLanguage(c) // 登录用户信息 loginUser, err := ctx.LoginUser(c) if err != nil { c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) return } // 订阅消息组 var subGroupIDs []string subGroupIDStr := c.Query("subGroupID") if subGroupIDStr != "" { // 处理字符转id数组后去重 ids := strings.Split(subGroupIDStr, ",") uniqueIDs := parse.RemoveDuplicates(ids) if len(uniqueIDs) > 0 { subGroupIDs = uniqueIDs } } // 将 HTTP 连接升级为 WebSocket 连接 conn := s.wsService.UpgraderWs(c.Writer, c.Request) if conn == nil { return } defer conn.Close() wsClient := s.wsService.NewClient(loginUser.UserID, subGroupIDs, conn) // 等待停止信号 for value := range wsClient.StopChan { logger.Infof("ws Stop Client UID %s %s", wsClient.BindUid, value) return } } // 测试 // // GET /test?clientId=&groupID= func (s *WSController) Test(c *gin.Context) { language := ctx.AcceptLanguage(c) // 登录用户信息 loginUser, err := ctx.LoginUser(c) if err != nil { c.JSON(401, result.CodeMsg(401, i18n.TKey(language, err.Error()))) return } // err = s.wsSendService.ByClientID(c.Query("clientId"), loginUser) // if err != nil { // c.JSON(200, result.ErrMsg(err.Error())) // return // } err = s.wsSendService.ByGroupID(c.Query("groupID"), loginUser) if err != nil { c.JSON(200, result.ErrMsg(err.Error())) return } c.JSON(200, result.Ok(nil)) }