fix: ws模块订阅组改为记录客户端ID
This commit is contained in:
@@ -16,7 +16,7 @@ import (
|
|||||||
var (
|
var (
|
||||||
wsClients sync.Map // ws客户端 [clientId: client]
|
wsClients sync.Map // ws客户端 [clientId: client]
|
||||||
wsUsers sync.Map // ws用户对应的多个客户端id [uid:clientIds]
|
wsUsers sync.Map // ws用户对应的多个客户端id [uid:clientIds]
|
||||||
wsGroup sync.Map // ws组对应的多个用户id [groupID:uids]
|
wsGroup sync.Map // ws组对应的多个客户端id [groupId:clientIds]
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewWSImpl 实例化服务层 WSImpl 结构体
|
// NewWSImpl 实例化服务层 WSImpl 结构体
|
||||||
@@ -85,20 +85,10 @@ func (s *WSImpl) ClientCreate(uid string, groupIDs []string, conn *websocket.Con
|
|||||||
if uid != "" && len(groupIDs) > 0 {
|
if uid != "" && len(groupIDs) > 0 {
|
||||||
for _, groupID := range groupIDs {
|
for _, groupID := range groupIDs {
|
||||||
if v, ok := wsGroup.Load(groupID); ok {
|
if v, ok := wsGroup.Load(groupID); ok {
|
||||||
groupUIDs := v.(*[]string)
|
groupClientIds := v.(*[]string)
|
||||||
// 避免同组内相同用户
|
*groupClientIds = append(*groupClientIds, clientID)
|
||||||
hasUid := false
|
|
||||||
for _, uidv := range *groupUIDs {
|
|
||||||
if uidv == uid {
|
|
||||||
hasUid = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !hasUid {
|
|
||||||
*groupUIDs = append(*groupUIDs, uid)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
wsGroup.Store(groupID, &[]string{uid})
|
wsGroup.Store(groupID, &[]string{clientID})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -123,8 +113,8 @@ func (s *WSImpl) ClientClose(clientID string) {
|
|||||||
|
|
||||||
// 客户端断线时自动踢出Uid绑定列表
|
// 客户端断线时自动踢出Uid绑定列表
|
||||||
if client.BindUid != "" {
|
if client.BindUid != "" {
|
||||||
if clientIds, ok := wsUsers.Load(client.BindUid); ok {
|
if v, ok := wsUsers.Load(client.BindUid); ok {
|
||||||
uidClientIds := clientIds.(*[]string)
|
uidClientIds := v.(*[]string)
|
||||||
if len(*uidClientIds) > 0 {
|
if len(*uidClientIds) > 0 {
|
||||||
tempClientIds := make([]string, 0, len(*uidClientIds))
|
tempClientIds := make([]string, 0, len(*uidClientIds))
|
||||||
for _, v := range *uidClientIds {
|
for _, v := range *uidClientIds {
|
||||||
@@ -138,22 +128,21 @@ func (s *WSImpl) ClientClose(clientID string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 客户端断线时自动踢出已加入的组
|
// 客户端断线时自动踢出已加入的组
|
||||||
if client.BindUid != "" && len(client.SubGroup) > 0 {
|
if len(client.SubGroup) > 0 {
|
||||||
for _, groupID := range client.SubGroup {
|
for _, groupID := range client.SubGroup {
|
||||||
uids, ok := wsGroup.Load(groupID)
|
v, ok := wsGroup.Load(groupID)
|
||||||
if !ok {
|
if !ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
groupClientIds := v.(*[]string)
|
||||||
groupUIDs := uids.(*[]string)
|
if len(*groupClientIds) > 0 {
|
||||||
if len(*groupUIDs) > 0 {
|
tempClientIds := make([]string, 0, len(*groupClientIds))
|
||||||
tempUIDs := make([]string, 0, len(*groupUIDs))
|
for _, v := range *groupClientIds {
|
||||||
for _, v := range *groupUIDs {
|
if v != client.ID {
|
||||||
if v != client.BindUid {
|
tempClientIds = append(tempClientIds, v)
|
||||||
tempUIDs = append(tempUIDs, v)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*groupUIDs = tempUIDs
|
*groupClientIds = tempClientIds
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user