|
|
|
@ -55,6 +55,9 @@ func NewKefuServer(c *gin.Context) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
func AddKefuToList(kefu *User) {
|
|
|
|
func AddKefuToList(kefu *User) {
|
|
|
|
|
|
|
|
Mux.Lock()
|
|
|
|
|
|
|
|
defer Mux.Unlock()
|
|
|
|
|
|
|
|
|
|
|
|
oldUser, ok := KefuList[kefu.Id]
|
|
|
|
oldUser, ok := KefuList[kefu.Id]
|
|
|
|
if oldUser != nil || ok {
|
|
|
|
if oldUser != nil || ok {
|
|
|
|
msg := TypeMessage{
|
|
|
|
msg := TypeMessage{
|
|
|
|
@ -69,21 +72,27 @@ func AddKefuToList(kefu *User) {
|
|
|
|
KefuList[kefu.Id] = kefu
|
|
|
|
KefuList[kefu.Id] = kefu
|
|
|
|
|
|
|
|
|
|
|
|
// 广播客服上线状态给所有该客服的访客
|
|
|
|
// 广播客服上线状态给所有该客服的访客
|
|
|
|
BroadcastKefuOnlineStatus(kefu.Id, true)
|
|
|
|
broadcastKefuOnlineStatusLocked(kefu.Id, true)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func RemoveKefuFromList(kefuId string) {
|
|
|
|
func RemoveKefuFromList(kefuId string) {
|
|
|
|
|
|
|
|
Mux.Lock()
|
|
|
|
|
|
|
|
defer Mux.Unlock()
|
|
|
|
|
|
|
|
|
|
|
|
_, ok := KefuList[kefuId]
|
|
|
|
_, ok := KefuList[kefuId]
|
|
|
|
if ok {
|
|
|
|
if ok {
|
|
|
|
delete(KefuList, kefuId)
|
|
|
|
delete(KefuList, kefuId)
|
|
|
|
// 广播客服离线状态给所有该客服的访客
|
|
|
|
// 广播客服离线状态给所有该客服的访客
|
|
|
|
BroadcastKefuOnlineStatus(kefuId, false)
|
|
|
|
broadcastKefuOnlineStatusLocked(kefuId, false)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 给指定客服发消息
|
|
|
|
// 给指定客服发消息
|
|
|
|
func OneKefuMessage(toId string, str []byte) {
|
|
|
|
func OneKefuMessage(toId string, str []byte) {
|
|
|
|
|
|
|
|
Mux.RLock()
|
|
|
|
kefu, ok := KefuList[toId]
|
|
|
|
kefu, ok := KefuList[toId]
|
|
|
|
|
|
|
|
Mux.RUnlock()
|
|
|
|
|
|
|
|
|
|
|
|
if ok {
|
|
|
|
if ok {
|
|
|
|
log.Println("OneKefuMessage lock")
|
|
|
|
log.Println("OneKefuMessage lock")
|
|
|
|
kefu.Mux.Lock()
|
|
|
|
kefu.Mux.Lock()
|
|
|
|
@ -93,6 +102,27 @@ func OneKefuMessage(toId string, str []byte) {
|
|
|
|
tools.Logger().Println("send_kefu_message", error, string(str))
|
|
|
|
tools.Logger().Println("send_kefu_message", error, string(str))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 内部函数:在持有锁的情况下广播客服状态
|
|
|
|
|
|
|
|
func broadcastKefuOnlineStatusLocked(kefuId string, isOnline bool) {
|
|
|
|
|
|
|
|
kefuInfo := models.FindUser(kefuId)
|
|
|
|
|
|
|
|
msg := TypeMessage{
|
|
|
|
|
|
|
|
Type: "kefu_status_change",
|
|
|
|
|
|
|
|
Data: map[string]interface{}{
|
|
|
|
|
|
|
|
"kefu_id": kefuId,
|
|
|
|
|
|
|
|
"is_online": isOnline,
|
|
|
|
|
|
|
|
"nickname": kefuInfo.Nickname,
|
|
|
|
|
|
|
|
"avator": kefuInfo.Avator,
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
str, _ := json.Marshal(msg)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for _, visitor := range ClientList {
|
|
|
|
|
|
|
|
if visitor.To_id == kefuId && visitor.Conn != nil {
|
|
|
|
|
|
|
|
visitor.Conn.WriteMessage(websocket.TextMessage, str)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
func KefuMessage(visitorId, content string, kefuInfo models.User) {
|
|
|
|
func KefuMessage(visitorId, content string, kefuInfo models.User) {
|
|
|
|
msg := TypeMessage{
|
|
|
|
msg := TypeMessage{
|
|
|
|
Type: "message",
|
|
|
|
Type: "message",
|
|
|
|
@ -120,11 +150,25 @@ func SendPingToKefuClient() {
|
|
|
|
// 收集需要删除的客服ID
|
|
|
|
// 收集需要删除的客服ID
|
|
|
|
var toRemove []string
|
|
|
|
var toRemove []string
|
|
|
|
|
|
|
|
|
|
|
|
for kefuId, kefu := range KefuList {
|
|
|
|
Mux.RLock()
|
|
|
|
if kefu == nil {
|
|
|
|
// 先遍历获取所有需要检查的客服ID
|
|
|
|
|
|
|
|
var kefuIds []string
|
|
|
|
|
|
|
|
for kefuId := range KefuList {
|
|
|
|
|
|
|
|
kefuIds = append(kefuIds, kefuId)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Mux.RUnlock()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 遍历检查每个客服连接(遍历过程中不持有锁,避免死锁)
|
|
|
|
|
|
|
|
for _, kefuId := range kefuIds {
|
|
|
|
|
|
|
|
Mux.RLock()
|
|
|
|
|
|
|
|
kefu, ok := KefuList[kefuId]
|
|
|
|
|
|
|
|
Mux.RUnlock()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if !ok || kefu == nil {
|
|
|
|
toRemove = append(toRemove, kefuId)
|
|
|
|
toRemove = append(toRemove, kefuId)
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
kefu.Mux.Lock()
|
|
|
|
kefu.Mux.Lock()
|
|
|
|
err := kefu.Conn.WriteMessage(websocket.TextMessage, str)
|
|
|
|
err := kefu.Conn.WriteMessage(websocket.TextMessage, str)
|
|
|
|
kefu.Mux.Unlock()
|
|
|
|
kefu.Mux.Unlock()
|
|
|
|
|