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.
go-fly/ws/visitor.go

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) {
kefu, 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 || kefu == nil {
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
}
}()
}