You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
206 lines
5.3 KiB
206 lines
5.3 KiB
package ws
|
|
|
|
import (
|
|
"encoding/json"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/gorilla/websocket"
|
|
"github.com/taoshihan1991/imaptool/common"
|
|
"github.com/taoshihan1991/imaptool/models"
|
|
"log"
|
|
"time"
|
|
)
|
|
|
|
func NewVisitorServer(c *gin.Context) {
|
|
//go kefuServerBackend()
|
|
conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
|
|
if err != nil {
|
|
log.Print("upgrade:", err)
|
|
return
|
|
}
|
|
//获取GET参数,创建WS
|
|
vistorInfo := models.FindVisitorByVistorId(c.Query("visitor_id"))
|
|
if vistorInfo.VisitorId == "" {
|
|
c.JSON(200, gin.H{
|
|
"code": 400,
|
|
"msg": "访客不存在",
|
|
})
|
|
return
|
|
}
|
|
user := &User{
|
|
Conn: conn,
|
|
Name: vistorInfo.Name,
|
|
Avator: vistorInfo.Avator,
|
|
Id: vistorInfo.VisitorId,
|
|
To_id: vistorInfo.ToId,
|
|
UpdateTime: time.Now(),
|
|
}
|
|
go models.UpdateVisitorStatus(vistorInfo.VisitorId, 1)
|
|
//go SendServerJiang(vistorInfo.Name, "来了", c.Request.Host)
|
|
|
|
AddVisitorToList(user)
|
|
|
|
for {
|
|
//接受消息
|
|
var receive []byte
|
|
messageType, receive, err := conn.ReadMessage()
|
|
if err != nil {
|
|
for _, visitor := range ClientList {
|
|
if visitor.Conn == conn {
|
|
log.Println("删除用户", visitor.Id)
|
|
delete(ClientList, visitor.Id)
|
|
VisitorOffline(visitor.To_id, visitor.Id, visitor.Name)
|
|
}
|
|
}
|
|
log.Println(err)
|
|
return
|
|
}
|
|
|
|
message <- &Message{
|
|
conn: conn,
|
|
content: receive,
|
|
context: c,
|
|
messageType: messageType,
|
|
}
|
|
}
|
|
}
|
|
func AddVisitorToList(user *User) {
|
|
//用户id对应的连接
|
|
oldUser, ok := ClientList[user.Id]
|
|
if oldUser != nil || ok {
|
|
msg := TypeMessage{
|
|
Type: "close",
|
|
Data: user.Id,
|
|
}
|
|
str, _ := json.Marshal(msg)
|
|
if err := oldUser.Conn.WriteMessage(websocket.TextMessage, str); err != nil {
|
|
oldUser.Conn.Close()
|
|
user.UpdateTime = oldUser.UpdateTime
|
|
delete(ClientList, user.Id)
|
|
}
|
|
}
|
|
ClientList[user.Id] = user
|
|
lastMessage := models.FindLastMessageByVisitorId(user.Id)
|
|
userInfo := make(map[string]string)
|
|
userInfo["uid"] = user.Id
|
|
userInfo["username"] = user.Name
|
|
userInfo["avator"] = user.Avator
|
|
userInfo["last_message"] = lastMessage.Content
|
|
if userInfo["last_message"] == "" {
|
|
userInfo["last_message"] = "新访客"
|
|
}
|
|
msg := TypeMessage{
|
|
Type: "userOnline",
|
|
Data: userInfo,
|
|
}
|
|
str, _ := json.Marshal(msg)
|
|
|
|
//新版
|
|
OneKefuMessage(user.To_id, str)
|
|
}
|
|
func VisitorOnline(kefuId string, visitor models.Visitor) {
|
|
lastMessage := models.FindLastMessageByVisitorId(visitor.VisitorId)
|
|
userInfo := make(map[string]string)
|
|
userInfo["uid"] = visitor.VisitorId
|
|
userInfo["username"] = visitor.Name
|
|
userInfo["avator"] = visitor.Avator
|
|
userInfo["last_message"] = lastMessage.Content
|
|
if userInfo["last_message"] == "" {
|
|
userInfo["last_message"] = "新访客"
|
|
}
|
|
msg := TypeMessage{
|
|
Type: "userOnline",
|
|
Data: userInfo,
|
|
}
|
|
str, _ := json.Marshal(msg)
|
|
OneKefuMessage(kefuId, str)
|
|
}
|
|
func VisitorOffline(kefuId string, visitorId string, visitorName string) {
|
|
|
|
models.UpdateVisitorStatus(visitorId, 0)
|
|
userInfo := make(map[string]string)
|
|
userInfo["uid"] = visitorId
|
|
userInfo["name"] = visitorName
|
|
msg := TypeMessage{
|
|
Type: "userOffline",
|
|
Data: userInfo,
|
|
}
|
|
str, _ := json.Marshal(msg)
|
|
//新版
|
|
OneKefuMessage(kefuId, str)
|
|
}
|
|
func VisitorNotice(visitorId string, notice string) {
|
|
msg := TypeMessage{
|
|
Type: "notice",
|
|
Data: notice,
|
|
}
|
|
str, _ := json.Marshal(msg)
|
|
visitor, ok := ClientList[visitorId]
|
|
if !ok || visitor == nil || visitor.Conn == nil {
|
|
return
|
|
}
|
|
visitor.Conn.WriteMessage(websocket.TextMessage, str)
|
|
}
|
|
func VisitorMessage(visitorId, content string, kefuInfo models.User) {
|
|
msg := TypeMessage{
|
|
Type: "message",
|
|
Data: ClientMessage{
|
|
Name: kefuInfo.Nickname,
|
|
Avator: kefuInfo.Avator,
|
|
Id: kefuInfo.Name,
|
|
Time: time.Now().Format("2006-01-02 15:04:05"),
|
|
ToId: visitorId,
|
|
Content: content,
|
|
IsKefu: "no",
|
|
},
|
|
}
|
|
str, _ := json.Marshal(msg)
|
|
visitor, ok := ClientList[visitorId]
|
|
if !ok || visitor == nil || visitor.Conn == nil {
|
|
return
|
|
}
|
|
visitor.Conn.WriteMessage(websocket.TextMessage, str)
|
|
}
|
|
func VisitorAutoReply(vistorInfo models.Visitor, kefuInfo models.User, content string) {
|
|
kefus, ok := KefuList[kefuInfo.Name]
|
|
reply := models.FindReplyItemByUserIdTitle(kefuInfo.Name, content)
|
|
if reply.Content != "" {
|
|
time.Sleep(1 * time.Second)
|
|
VisitorMessage(vistorInfo.VisitorId, reply.Content, kefuInfo)
|
|
KefuMessage(vistorInfo.VisitorId, reply.Content, kefuInfo)
|
|
models.CreateMessage(kefuInfo.Name, vistorInfo.VisitorId, reply.Content, "kefu")
|
|
}
|
|
if !ok || len(kefus) == 0 {
|
|
time.Sleep(1 * time.Second)
|
|
welcome := models.FindWelcomeByUserIdKey(kefuInfo.Name, "offline")
|
|
if welcome.Content == "" || reply.Content != "" {
|
|
return
|
|
}
|
|
VisitorMessage(vistorInfo.VisitorId, welcome.Content, kefuInfo)
|
|
models.CreateMessage(kefuInfo.Name, vistorInfo.VisitorId, welcome.Content, "kefu")
|
|
}
|
|
}
|
|
func cleanVisitorExpire() {
|
|
go func() {
|
|
log.Println("cleanVisitorExpire start...")
|
|
for {
|
|
for _, user := range ClientList {
|
|
diff := time.Now().Sub(user.UpdateTime).Seconds()
|
|
if diff >= common.VisitorExpire {
|
|
msg := TypeMessage{
|
|
Type: "auto_close",
|
|
Data: user.Id,
|
|
}
|
|
str, _ := json.Marshal(msg)
|
|
if err := user.Conn.WriteMessage(websocket.TextMessage, str); err != nil {
|
|
user.Conn.Close()
|
|
delete(ClientList, user.Id)
|
|
}
|
|
log.Println(user.Name + ":cleanVisitorExpire finshed")
|
|
}
|
|
}
|
|
t := time.NewTimer(time.Second * 5)
|
|
<-t.C
|
|
}
|
|
}()
|
|
}
|