|
|
@ -23,7 +23,7 @@ type Message struct{
|
|
|
|
messageType int
|
|
|
|
messageType int
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var clientList = make(map[string]*vistor)
|
|
|
|
var clientList = make(map[string]*vistor)
|
|
|
|
var kefuList = make(map[string]*websocket.Conn)
|
|
|
|
var kefuList = make(map[string][]*websocket.Conn)
|
|
|
|
var message = make(chan *Message)
|
|
|
|
var message = make(chan *Message)
|
|
|
|
|
|
|
|
|
|
|
|
type TypeMessage struct {
|
|
|
|
type TypeMessage struct {
|
|
|
@ -78,9 +78,11 @@ func NewChatServer(c *gin.Context){
|
|
|
|
Data: userInfo,
|
|
|
|
Data: userInfo,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
str, _ := json.Marshal(msg)
|
|
|
|
str, _ := json.Marshal(msg)
|
|
|
|
kefuConn,ok:=kefuList[visitor.to_id]
|
|
|
|
kefuConns:=kefuList[visitor.to_id]
|
|
|
|
if ok && kefuConn!=nil{
|
|
|
|
if kefuConns!=nil{
|
|
|
|
kefuConn.WriteMessage(websocket.TextMessage,str)
|
|
|
|
for _,kefuConn:=range kefuConns{
|
|
|
|
|
|
|
|
kefuConn.WriteMessage(websocket.TextMessage,str)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -130,10 +132,22 @@ func sendPingToClient() {
|
|
|
|
models.UpdateVisitorStatus(uid,0)
|
|
|
|
models.UpdateVisitorStatus(uid,0)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for kefuId, kfConn := range kefuList {
|
|
|
|
for kefuId, kfConns := range kefuList {
|
|
|
|
err:=kfConn.WriteMessage(websocket.TextMessage,str)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
var newkfConns =make([]*websocket.Conn,0)
|
|
|
|
|
|
|
|
for _,kefuConn:=range kfConns{
|
|
|
|
|
|
|
|
if(kefuConn==nil){
|
|
|
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
err:=kefuConn.WriteMessage(websocket.TextMessage,str)
|
|
|
|
|
|
|
|
if err == nil {
|
|
|
|
|
|
|
|
newkfConns=append(newkfConns,kefuConn)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if newkfConns == nil {
|
|
|
|
delete(kefuList, kefuId)
|
|
|
|
delete(kefuList, kefuId)
|
|
|
|
|
|
|
|
}else{
|
|
|
|
|
|
|
|
kefuList[kefuId]=newkfConns
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
time.Sleep(15 * time.Second)
|
|
|
|
time.Sleep(15 * time.Second)
|
|
|
@ -162,7 +176,8 @@ func sendPingOnlineUsers() {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sort.Strings(visitorIds)
|
|
|
|
sort.Strings(visitorIds)
|
|
|
|
|
|
|
|
|
|
|
|
for kefuId, kfConn := range kefuList {
|
|
|
|
for kefuId, kfConns := range kefuList {
|
|
|
|
|
|
|
|
|
|
|
|
result := make([]map[string]string, 0)
|
|
|
|
result := make([]map[string]string, 0)
|
|
|
|
for _,visitorId:=range visitorIds{
|
|
|
|
for _,visitorId:=range visitorIds{
|
|
|
|
user:=clientList[visitorId]
|
|
|
|
user:=clientList[visitorId]
|
|
|
@ -179,9 +194,17 @@ func sendPingOnlineUsers() {
|
|
|
|
Data: result,
|
|
|
|
Data: result,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
str, _ := json.Marshal(msg)
|
|
|
|
str, _ := json.Marshal(msg)
|
|
|
|
err:=kfConn.WriteMessage(websocket.TextMessage,str)
|
|
|
|
var newkfConns =make([]*websocket.Conn,0)
|
|
|
|
if err != nil {
|
|
|
|
for _,kefuConn:=range kfConns{
|
|
|
|
|
|
|
|
err:=kefuConn.WriteMessage(websocket.TextMessage,str)
|
|
|
|
|
|
|
|
if err == nil {
|
|
|
|
|
|
|
|
newkfConns=append(newkfConns,kefuConn)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(newkfConns) == 0 {
|
|
|
|
delete(kefuList, kefuId)
|
|
|
|
delete(kefuList, kefuId)
|
|
|
|
|
|
|
|
}else{
|
|
|
|
|
|
|
|
kefuList[kefuId]=newkfConns
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -225,15 +248,24 @@ func singleBroadcaster(){
|
|
|
|
Data: userInfo,
|
|
|
|
Data: userInfo,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
str, _ := json.Marshal(msg)
|
|
|
|
str, _ := json.Marshal(msg)
|
|
|
|
kefuConn,ok:=kefuList[user.to_id]
|
|
|
|
kefuConns:=kefuList[user.to_id]
|
|
|
|
if ok && kefuConn!=nil{
|
|
|
|
if kefuConns!=nil{
|
|
|
|
kefuConn.WriteMessage(websocket.TextMessage,str)
|
|
|
|
for k,kefuConn:=range kefuConns{
|
|
|
|
|
|
|
|
log.Println(k,"xxxxxxxx")
|
|
|
|
|
|
|
|
kefuConn.WriteMessage(websocket.TextMessage,str)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//客服上线
|
|
|
|
//客服上线
|
|
|
|
case "kfOnline":
|
|
|
|
case "kfOnline":
|
|
|
|
json.Unmarshal(msgData, &clientMsg)
|
|
|
|
json.Unmarshal(msgData, &clientMsg)
|
|
|
|
//客服id对应的连接
|
|
|
|
//客服id对应的连接
|
|
|
|
kefuList[clientMsg.Id] = conn
|
|
|
|
var newKefuConns =[]*websocket.Conn{conn}
|
|
|
|
|
|
|
|
kefuConns:=kefuList[clientMsg.Id]
|
|
|
|
|
|
|
|
if kefuConns!=nil{
|
|
|
|
|
|
|
|
newKefuConns=append(newKefuConns,kefuConns...)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
log.Println(newKefuConns)
|
|
|
|
|
|
|
|
kefuList[clientMsg.Id] = newKefuConns
|
|
|
|
//发送给客户
|
|
|
|
//发送给客户
|
|
|
|
if len(clientList) == 0 {
|
|
|
|
if len(clientList) == 0 {
|
|
|
|
continue
|
|
|
|
continue
|
|
|
@ -242,7 +274,6 @@ func singleBroadcaster(){
|
|
|
|
//客服接手
|
|
|
|
//客服接手
|
|
|
|
case "kfConnect":
|
|
|
|
case "kfConnect":
|
|
|
|
json.Unmarshal(msgData, &clientMsg)
|
|
|
|
json.Unmarshal(msgData, &clientMsg)
|
|
|
|
kefuList[clientMsg.Id] = conn
|
|
|
|
|
|
|
|
visitor,ok := clientList[clientMsg.ToId]
|
|
|
|
visitor,ok := clientList[clientMsg.ToId]
|
|
|
|
if visitor==nil||!ok{
|
|
|
|
if visitor==nil||!ok{
|
|
|
|
continue
|
|
|
|
continue
|
|
|
@ -270,12 +301,19 @@ func singleBroadcaster(){
|
|
|
|
}
|
|
|
|
}
|
|
|
|
str, _ := json.Marshal(msg)
|
|
|
|
str, _ := json.Marshal(msg)
|
|
|
|
conn.WriteMessage(websocket.TextMessage,str)
|
|
|
|
conn.WriteMessage(websocket.TextMessage,str)
|
|
|
|
|
|
|
|
//kefuConns,ok := kefuList[clientMsg.Id]
|
|
|
|
|
|
|
|
//if kefuConns==nil||!ok{
|
|
|
|
|
|
|
|
// continue
|
|
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
//for _,kefuConn:=range kefuConns{
|
|
|
|
|
|
|
|
// kefuConn.WriteMessage(websocket.TextMessage,str)
|
|
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
case "chatMessage":
|
|
|
|
case "chatMessage":
|
|
|
|
json.Unmarshal(msgData, &clientMsg)
|
|
|
|
json.Unmarshal(msgData, &clientMsg)
|
|
|
|
models.CreateMessage(clientMsg.ToId,clientMsg.Id,clientMsg.Content,"visitor")
|
|
|
|
models.CreateMessage(clientMsg.ToId,clientMsg.Id,clientMsg.Content,"visitor")
|
|
|
|
conn,ok := kefuList[clientMsg.ToId]
|
|
|
|
kefuConns,ok := kefuList[clientMsg.ToId]
|
|
|
|
if conn==nil||!ok{
|
|
|
|
if kefuConns==nil||!ok{
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
msg := TypeMessage{
|
|
|
|
msg := TypeMessage{
|
|
|
@ -290,7 +328,9 @@ func singleBroadcaster(){
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
str, _ := json.Marshal(msg)
|
|
|
|
str, _ := json.Marshal(msg)
|
|
|
|
conn.WriteMessage(websocket.TextMessage,str)
|
|
|
|
for _,kefuConn:=range kefuConns{
|
|
|
|
|
|
|
|
kefuConn.WriteMessage(websocket.TextMessage,str)
|
|
|
|
|
|
|
|
}
|
|
|
|
//心跳
|
|
|
|
//心跳
|
|
|
|
case "ping":
|
|
|
|
case "ping":
|
|
|
|
msg := TypeMessage{
|
|
|
|
msg := TypeMessage{
|
|
|
|