55 lines
1.6 KiB
Go
55 lines
1.6 KiB
Go
package server
|
||
|
||
import (
|
||
"fmt"
|
||
"game/common/proto/pb"
|
||
"strings"
|
||
"sync"
|
||
)
|
||
|
||
var userServiceMgr userServiceManager
|
||
|
||
/*
|
||
记录玩家访问过的节点信息,玩家下线后清除相关信息,比如玩家在某个玩法服里掉线,重连后要回到该房间,应由对应的服务节点主动将玩家拉回房间
|
||
*/
|
||
type userServiceManager struct {
|
||
inService sync.Map // key:userId+service_type_id value:service_name
|
||
}
|
||
|
||
func (m *userServiceManager) makeKey(userId int64, typeId pb.ServiceTypeId) string {
|
||
return fmt.Sprintf("%s_%d", userId, typeId)
|
||
}
|
||
|
||
func (m *userServiceManager) Add(userId int64, typeId pb.ServiceTypeId, serviceName string) {
|
||
k := m.makeKey(userId, typeId)
|
||
m.inService.Store(k, serviceName)
|
||
}
|
||
|
||
// 玩家下线,清除他呆过的所有服务节点信息
|
||
func (m *userServiceManager) CleanUser(userId int64) {
|
||
var del []string
|
||
m.inService.Range(func(k, v interface{}) bool {
|
||
userServiceType := k.(string)
|
||
if strings.Contains(userServiceType, fmt.Sprintf("%d", userId)) {
|
||
del = append(del, userServiceType)
|
||
}
|
||
return true
|
||
})
|
||
for _, k := range del {
|
||
m.inService.Delete(k)
|
||
}
|
||
}
|
||
|
||
// todo:要考虑到旧服务可能已关闭,这里要访问etcd中是否有该服务节点,最好采用订阅机制,让etcd变动时清除对应服务节点
|
||
func (m *userServiceManager) FindServiceName(userId int64, typeId pb.ServiceTypeId) (serviceName string, ok bool) {
|
||
var v any
|
||
if v, ok = m.inService.Load(m.makeKey(userId, typeId)); ok {
|
||
serviceName = v.(string)
|
||
}
|
||
return
|
||
}
|
||
|
||
func (m *userServiceManager) Del(userId int64, typeId pb.ServiceTypeId) {
|
||
m.inService.Delete(m.makeKey(userId, typeId))
|
||
}
|