This commit is contained in:
+37
-12
@@ -82,24 +82,16 @@ func NewDeviceManager(srv *ServiceContext) *device.DeviceManager {
|
||||
}
|
||||
|
||||
manager.OnDeviceKicked = func(userID int64, deviceID, session string, operator device.Operator) {
|
||||
//管理员踢下线
|
||||
if operator == device.Admin {
|
||||
switch operator {
|
||||
case device.Admin:
|
||||
message := DeviceMessage{Method: DeviceKickedAdmin}
|
||||
_ = manager.SendToDevice(userID, deviceID, message.Json())
|
||||
//将登陆凭证从缓存中删除
|
||||
srv.Redis.Del(ctx, fmt.Sprintf("%v:%v", config.SessionIdKey, session))
|
||||
return
|
||||
}
|
||||
|
||||
//登陆设备超过限制踢下线
|
||||
if operator == device.MaxDevices {
|
||||
case device.MaxDevices:
|
||||
message := DeviceMessage{Method: DeviceKickedMax}
|
||||
_ = manager.SendToDevice(userID, deviceID, message.Json())
|
||||
//将登陆凭证从缓存中删除
|
||||
srv.Redis.Del(ctx, fmt.Sprintf("%v:%v", config.SessionIdKey, session))
|
||||
return
|
||||
}
|
||||
|
||||
cleanupDeviceSessionCache(ctx, srv, userID, deviceID, session)
|
||||
}
|
||||
|
||||
manager.OnMessage = func(userID int64, deviceID, session string, message string) {
|
||||
@@ -108,6 +100,39 @@ func NewDeviceManager(srv *ServiceContext) *device.DeviceManager {
|
||||
return manager
|
||||
}
|
||||
|
||||
func cleanupDeviceSessionCache(ctx context.Context, srv *ServiceContext, userID int64, deviceID, session string) {
|
||||
if session == "" && deviceID == "" {
|
||||
return
|
||||
}
|
||||
|
||||
pipe := srv.Redis.TxPipeline()
|
||||
|
||||
if session != "" {
|
||||
sessionKey := fmt.Sprintf("%v:%v", config.SessionIdKey, session)
|
||||
pipe.Del(ctx, sessionKey)
|
||||
|
||||
sessionDetailKey := fmt.Sprintf("%s:detail:%s", config.SessionIdKey, session)
|
||||
pipe.Del(ctx, sessionDetailKey)
|
||||
|
||||
sessionsKey := fmt.Sprintf("%s%v", config.UserSessionsKeyPrefix, userID)
|
||||
pipe.ZRem(ctx, sessionsKey, session)
|
||||
}
|
||||
|
||||
if deviceID != "" {
|
||||
deviceCacheKey := fmt.Sprintf("%v:%v", config.DeviceCacheKeyKey, deviceID)
|
||||
pipe.Del(ctx, deviceCacheKey)
|
||||
}
|
||||
|
||||
if _, err := pipe.Exec(ctx); err != nil {
|
||||
logger.Errorw("[DeviceManager] failed to clear kicked device cache",
|
||||
logger.Field("user_id", userID),
|
||||
logger.Field("device_id", deviceID),
|
||||
logger.Field("session", session),
|
||||
logger.Field("error", err.Error()),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
type DeviceMessage struct {
|
||||
Method DeviceMessageMethod `json:"method"`
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user