package controller import ( "encoding/json" "fmt" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" "github.com/taoshihan1991/imaptool/config" "github.com/taoshihan1991/imaptool/models" "github.com/taoshihan1991/imaptool/tools" "github.com/taoshihan1991/imaptool/ws" "log" "math/rand" "strconv" ) func PostVisitor(c *gin.Context) { name := c.PostForm("name") avator := c.PostForm("avator") toId := c.PostForm("to_id") id := c.PostForm("id") refer := c.PostForm("refer") city := c.PostForm("city") client_ip := c.PostForm("client_ip") if name == "" || avator == "" || toId == "" || id == "" || refer == "" || city == "" || client_ip == "" { c.JSON(200, gin.H{ "code": 400, "msg": "error", }) return } kefuInfo := models.FindUser(toId) if kefuInfo.ID == 0 { c.JSON(200, gin.H{ "code": 400, "msg": "用户不存在", }) return } models.CreateVisitor(name, avator, c.ClientIP(), toId, id, refer, city, client_ip) userInfo := make(map[string]string) userInfo["uid"] = id userInfo["username"] = name userInfo["avator"] = avator msg := TypeMessage{ Type: "userOnline", Data: userInfo, } str, _ := json.Marshal(msg) kefuConns := kefuList[toId] if kefuConns != nil { for k, kefuConn := range kefuConns { log.Println(k, "xxxxxxxx") kefuConn.WriteMessage(websocket.TextMessage, str) } } c.JSON(200, gin.H{ "code": 200, "msg": "ok", }) } func PostVisitorLogin(c *gin.Context) { ipcity := tools.ParseIp(c.ClientIP()) avator := fmt.Sprintf("/static/images/%d.jpg", rand.Intn(14)) toId := c.PostForm("to_id") id := c.PostForm("visitor_id") if id == "" { id = tools.Uuid() } refer := c.PostForm("refer") var ( city string name string ) if ipcity != nil { city = ipcity.CountryName + ipcity.RegionName + ipcity.CityName name = ipcity.CountryName + ipcity.RegionName + ipcity.CityName + "网友" } else { city = "未识别地区" name = "匿名网友" } client_ip := c.ClientIP() //log.Println(name,avator,c.ClientIP(),toId,id,refer,city,client_ip) if name == "" || avator == "" || toId == "" || id == "" || refer == "" || city == "" || client_ip == "" { c.JSON(200, gin.H{ "code": 400, "msg": "error", }) return } kefuInfo := models.FindUser(toId) if kefuInfo.ID == 0 { c.JSON(200, gin.H{ "code": 400, "msg": "客服不存在", }) return } models.CreateVisitor(name, avator, c.ClientIP(), toId, id, refer, city, client_ip) visitor := models.FindVisitorByVistorId(id) c.JSON(200, gin.H{ "code": 200, "msg": "ok", "result": visitor, }) } func GetVisitor(c *gin.Context) { visitorId := c.Query("visitorId") vistor := models.FindVisitorByVistorId(visitorId) c.JSON(200, gin.H{ "code": 200, "msg": "ok", "result": vistor, }) } // @Summary 获取访客列表接口 // @Produce json // @Accept multipart/form-data // @Param page query string true "分页" // @Param token header string true "认证token" // @Success 200 {object} controller.Response // @Failure 200 {object} controller.Response // @Router /visitors [get] func GetVisitors(c *gin.Context) { page, _ := strconv.Atoi(c.Query("page")) kefuId, _ := c.Get("kefu_name") vistors := models.FindVisitorsByKefuId(uint(page), config.VisitorPageSize, kefuId.(string)) count := models.CountVisitorsByKefuId(kefuId.(string)) c.JSON(200, gin.H{ "code": 200, "msg": "ok", "result": gin.H{ "list": vistors, "count": count, "pagesize": config.PageSize, }, }) } // @Summary 获取访客聊天信息接口 // @Produce json // @Accept multipart/form-data // @Param visitorId query string true "访客ID" // @Param token header string true "认证token" // @Success 200 {object} controller.Response // @Failure 200 {object} controller.Response // @Router /messages [get] func GetVisitorMessage(c *gin.Context) { visitorId := c.Query("visitorId") messages := models.FindMessageByVisitorId(visitorId) result := make([]map[string]interface{}, 0) for _, message := range messages { item := make(map[string]interface{}) var visitor models.Visitor var kefu models.User if visitor.Name == "" || kefu.Name == "" { kefu = models.FindUser(message.KefuId) visitor = models.FindVisitorByVistorId(message.VisitorId) } item["time"] = message.CreatedAt.Format("2006-01-02 15:04:05") item["content"] = message.Content item["mes_type"] = message.MesType item["visitor_name"] = visitor.Name item["visitor_avator"] = visitor.Avator item["kefu_name"] = kefu.Nickname item["kefu_avator"] = kefu.Avator result = append(result, item) } models.ReadMessageByVisitorId(visitorId) c.JSON(200, gin.H{ "code": 200, "msg": "ok", "result": result, }) } // @Summary 获取在线访客列表接口 // @Produce json // @Success 200 {object} controller.Response // @Failure 200 {object} controller.Response // @Router /visitors_online [get] func GetVisitorOnlines(c *gin.Context) { users := make([]map[string]string, 0) visitorIds := make([]string, 0) for uid, visitor := range ws.ClientList { userInfo := make(map[string]string) userInfo["uid"] = uid userInfo["name"] = visitor.Name userInfo["avator"] = visitor.Avator users = append(users, userInfo) visitorIds = append(visitorIds, visitor.Id) } //查询最新消息 messages := models.FindLastMessage(visitorIds) temp := make(map[string]string, 0) for _, mes := range messages { temp[mes.VisitorId] = mes.Content } for _, user := range users { user["last_message"] = temp[user["uid"]] } tcps := make([]string, 0) for ip, _ := range clientTcpList { tcps = append(tcps, ip) } c.JSON(200, gin.H{ "code": 200, "msg": "ok", "result": gin.H{ "ws": users, "tcp": tcps, }, }) } // @Summary 获取客服的在线访客列表接口 // @Produce json // @Success 200 {object} controller.Response // @Failure 200 {object} controller.Response // @Router /visitors_kefu_online [get] func GetKefusVisitorOnlines(c *gin.Context) { kefuName, _ := c.Get("kefu_name") roleId, _ := c.Get("kefu_id") users := make([]*VisitorOnline, 0) visitorIds := make([]string, 0) for uid, visitor := range ws.ClientList { if visitor.To_id != kefuName && roleId.(float64) != 2 { continue } userInfo := new(VisitorOnline) userInfo.Uid = uid userInfo.Username = visitor.Name userInfo.Avator = visitor.Avator users = append(users, userInfo) visitorIds = append(visitorIds, visitor.Id) } //查询最新消息 messages := models.FindLastMessage(visitorIds) temp := make(map[string]string, 0) for _, mes := range messages { temp[mes.VisitorId] = mes.Content } for _, user := range users { user.LastMessage = temp[user.Uid] if user.LastMessage == "" { user.LastMessage = "新访客" } } tcps := make([]string, 0) for ip, _ := range clientTcpList { tcps = append(tcps, ip) } c.JSON(200, gin.H{ "code": 200, "msg": "ok", "result": users, }) }