修复订阅
Build docker and publish / build (20.15.1) (push) Failing after 8m2s

This commit is contained in:
2026-03-04 23:08:46 -08:00
parent 4349a7ea2f
commit 70c0483ca9
6 changed files with 230 additions and 30 deletions
+37 -12
View File
@@ -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"`
}