123 lines
2.6 KiB
Go
123 lines
2.6 KiB
Go
package ws
|
||
|
||
import (
|
||
"ai-css/models"
|
||
"ai-css/tools"
|
||
"encoding/json"
|
||
"log"
|
||
"time"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
"github.com/gorilla/websocket"
|
||
)
|
||
|
||
func NewKefuServer(c *gin.Context) {
|
||
kefuName, _ := c.Get("kefu_name")
|
||
kefuInfo := models.FindUser(kefuName.(string))
|
||
if kefuInfo.ID == 0 {
|
||
c.JSON(200, gin.H{
|
||
"code": 400,
|
||
"msg": "用户不存在",
|
||
})
|
||
return
|
||
}
|
||
|
||
//go kefuServerBackend()
|
||
conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
|
||
if err != nil {
|
||
log.Print("upgrade:", err)
|
||
return
|
||
}
|
||
//获取GET参数,创建WS
|
||
var kefu User
|
||
kefu.Id = kefuInfo.Name
|
||
kefu.Name = kefuInfo.Nickname
|
||
kefu.Avator = kefuInfo.Avator
|
||
kefu.Conn = conn
|
||
AddKefuToList(&kefu)
|
||
models.UpdateUserIsOnline(kefuInfo.Name, 1)
|
||
|
||
for {
|
||
//接受消息
|
||
var receive []byte
|
||
messageType, receive, err := conn.ReadMessage()
|
||
if err != nil {
|
||
log.Println("ws/user.go ", err)
|
||
conn.Close()
|
||
models.UpdateUserIsOnline(kefuInfo.Name, 0)
|
||
return
|
||
}
|
||
|
||
message <- &Message{
|
||
conn: conn,
|
||
content: receive,
|
||
context: c,
|
||
messageType: messageType,
|
||
}
|
||
}
|
||
}
|
||
func AddKefuToList(kefu *User) {
|
||
oldUser, ok := KefuList[kefu.Id]
|
||
if oldUser != nil || ok {
|
||
msg := TypeMessage{
|
||
Type: "close",
|
||
Data: kefu.Id,
|
||
}
|
||
str, _ := json.Marshal(msg)
|
||
if err := oldUser.Conn.WriteMessage(websocket.TextMessage, str); err != nil {
|
||
oldUser.Conn.Close()
|
||
}
|
||
}
|
||
KefuList[kefu.Id] = kefu
|
||
}
|
||
|
||
// 给指定客服发消息
|
||
func OneKefuMessage(toId string, str []byte) {
|
||
kefu, ok := KefuList[toId]
|
||
if ok {
|
||
log.Println("OneKefuMessage lock")
|
||
kefu.Mux.Lock()
|
||
defer kefu.Mux.Unlock()
|
||
log.Println("OneKefuMessage unlock")
|
||
error := kefu.Conn.WriteMessage(websocket.TextMessage, str)
|
||
tools.Logger().Println("send_kefu_message", error, string(str))
|
||
}
|
||
}
|
||
func KefuMessage(visitorId, content string, kefuInfo models.User) {
|
||
msg := TypeMessage{
|
||
Type: "message",
|
||
Data: ClientMessage{
|
||
Name: kefuInfo.Nickname,
|
||
Avator: kefuInfo.Avator,
|
||
Id: visitorId,
|
||
Time: time.Now().Format("2006-01-02 15:04:05"),
|
||
ToId: visitorId,
|
||
Content: content,
|
||
IsKefu: "yes",
|
||
},
|
||
}
|
||
str, _ := json.Marshal(msg)
|
||
OneKefuMessage(kefuInfo.Name, str)
|
||
}
|
||
|
||
// 给客服客户端发送消息判断客户端是否在线
|
||
func SendPingToKefuClient() {
|
||
msg := TypeMessage{
|
||
Type: "many pong",
|
||
}
|
||
str, _ := json.Marshal(msg)
|
||
for kefuId, kefu := range KefuList {
|
||
if kefu == nil {
|
||
continue
|
||
}
|
||
kefu.Mux.Lock()
|
||
defer kefu.Mux.Unlock()
|
||
err := kefu.Conn.WriteMessage(websocket.TextMessage, str)
|
||
if err != nil {
|
||
log.Println("定时发送ping给客服,失败", err.Error())
|
||
delete(KefuList, kefuId)
|
||
models.UpdateUserIsOnline(kefuId, 0)
|
||
}
|
||
}
|
||
}
|