Files
peko-ios/YuMi/Modules/YMRoom/View/MoreView/Manager/TurboModeStateManager.m

415 lines
16 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// TurboModeStateManager.m
// YuMi
//
// Created by Linus on 2025/1/13.
//
#import "TurboModeStateManager.h"
#import "../XPTurboModeConstants.h"
@interface TurboModeStateManager ()
@property (nonatomic, assign) BOOL globalTurboEnabled; // 全局 turbo 模式
@property (nonatomic, strong) NSMutableDictionary<NSString *, NSDictionary *> *roomSwitchStates; // 所有房间的开关状态
@property (nonatomic, copy) NSString *currentUserId; // 当前用户ID
@property (nonatomic, copy) NSString *currentRoomId;
@end
@implementation TurboModeStateManager
#pragma mark - Singleton
+ (instancetype)sharedManager {
static TurboModeStateManager *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[TurboModeStateManager alloc] init];
});
return instance;
}
- (instancetype)init {
if (self = [super init]) {
// 从全局缓存加载
self.globalTurboEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:@"TurboMode_Global"];
self.roomSwitchStates = [NSMutableDictionary dictionary];
self.currentUserId = nil;
}
return self;
}
#pragma mark - Public Methods
// 🔧 新增:启动 TurboModeStateManager在用户登录成功后调用
- (void)startupWithCurrentUser:(NSString *)userId {
if (!userId) return;
self.currentUserId = userId;
[self loadAllRoomSwitchStates];
NSLog(@"🎮 TurboModeStateManager: 已启动用户ID: %@", userId);
}
// 🔧 新增:加载所有房间的开关状态
- (void)loadAllRoomSwitchStates {
if (!self.currentUserId) return;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *prefix = [NSString stringWithFormat:@"Turbo_%@_", self.currentUserId];
// 遍历所有 UserDefaults 中的 key找到属于当前用户的房间开关状态
NSDictionary *allDefaults = [defaults dictionaryRepresentation];
for (NSString *key in allDefaults.allKeys) {
if ([key hasPrefix:prefix] && [key containsString:@"_Room_"]) {
// 提取房间ID
NSString *roomId = [self extractRoomIdFromKey:key];
if (roomId) {
[self loadSwitchStatesForRoom:roomId];
}
}
}
NSLog(@"🎮 TurboModeStateManager: 已加载 %lu 个房间的开关状态", (unsigned long)self.roomSwitchStates.count);
}
// 🔧 新增:更新礼物特效开关状态(通过 RoomInfo.hasAnimationEffect 更新)
- (void)updateGiftEffectsForRoom:(NSString *)roomId enabled:(BOOL)enabled {
if (!roomId) return;
[self ensureRoomSwitchStatesExist:roomId];
NSMutableDictionary *roomStates = [self.roomSwitchStates[roomId] mutableCopy];
roomStates[@"giftEffects"] = @(enabled);
self.roomSwitchStates[roomId] = roomStates;
NSLog(@"🎮 TurboModeStateManager: 房间 %@ 礼物特效开关更新为 %@", roomId, enabled ? @"开启" : @"关闭");
}
// 🔧 新增:获取礼物特效开关状态
- (BOOL)isGiftEffectsEnabledForRoom:(NSString *)roomId {
if (!roomId) return NO;
[self ensureRoomSwitchStatesExist:roomId];
return [self.roomSwitchStates[roomId][@"giftEffects"] boolValue];
}
// 🔧 新增:获取全局礼物屏幕开关状态
- (BOOL)isGlobalGiftScreenEnabledForRoom:(NSString *)roomId {
if (!roomId) return NO;
[self ensureRoomSwitchStatesExist:roomId];
return [self.roomSwitchStates[roomId][@"globalGiftScreen"] boolValue];
}
// 🔧 新增:获取全局游戏屏幕开关状态
- (BOOL)isGlobalGameScreenEnabledForRoom:(NSString *)roomId {
if (!roomId) return NO;
[self ensureRoomSwitchStatesExist:roomId];
return [self.roomSwitchStates[roomId][@"globalGameScreen"] boolValue];
}
// 🔧 新增获取CP麦位开关状态
- (BOOL)isCpMicEnabledForRoom:(NSString *)roomId {
if (!roomId) return NO;
[self ensureRoomSwitchStatesExist:roomId];
return [self.roomSwitchStates[roomId][@"cpMic"] boolValue];
}
// 🔧 新增:设置全局礼物屏幕开关
- (void)setGlobalGiftScreenEnabledForRoom:(NSString *)roomId enabled:(BOOL)enabled {
if (!roomId) return;
[self ensureRoomSwitchStatesExist:roomId];
NSMutableDictionary *roomStates = [self.roomSwitchStates[roomId] mutableCopy];
roomStates[@"globalGiftScreen"] = @(enabled);
self.roomSwitchStates[roomId] = roomStates;
// 持久化到 NSUserDefaults
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:kTurboGlobalGiftScreenEnabledKey(roomId)];
[[NSUserDefaults standardUserDefaults] synchronize];
// 发送通知
[[NSNotificationCenter defaultCenter] postNotificationName:kTurboGlobalGiftScreenEnabledChanged
object:nil
userInfo:@{@"on": @(enabled), @"roomId": roomId}];
NSLog(@"🎮 TurboModeStateManager: 房间 %@ 全局礼物屏幕开关设置为 %@", roomId, enabled ? @"开启" : @"关闭");
}
// 🔧 新增:设置全局游戏屏幕开关
- (void)setGlobalGameScreenEnabledForRoom:(NSString *)roomId enabled:(BOOL)enabled {
if (!roomId) return;
[self ensureRoomSwitchStatesExist:roomId];
NSMutableDictionary *roomStates = [self.roomSwitchStates[roomId] mutableCopy];
roomStates[@"globalGameScreen"] = @(enabled);
self.roomSwitchStates[roomId] = roomStates;
// 持久化到 NSUserDefaults
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:kTurboGlobalGameScreenEnabledKey(roomId)];
[[NSUserDefaults standardUserDefaults] synchronize];
// 发送通知
[[NSNotificationCenter defaultCenter] postNotificationName:kTurboGlobalGameScreenEnabledChanged
object:nil
userInfo:@{@"on": @(enabled), @"roomId": roomId}];
NSLog(@"🎮 TurboModeStateManager: 房间 %@ 全局游戏屏幕开关设置为 %@", roomId, enabled ? @"开启" : @"关闭");
}
// 🔧 新增设置CP麦位开关
- (void)setCpMicEnabledForRoom:(NSString *)roomId enabled:(BOOL)enabled {
if (!roomId) return;
[self ensureRoomSwitchStatesExist:roomId];
NSMutableDictionary *roomStates = [self.roomSwitchStates[roomId] mutableCopy];
roomStates[@"cpMic"] = @(enabled);
self.roomSwitchStates[roomId] = roomStates;
// 持久化到 NSUserDefaults
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:kTurboCpMicEnabledKey(roomId)];
[[NSUserDefaults standardUserDefaults] synchronize];
// 发送通知
[[NSNotificationCenter defaultCenter] postNotificationName:kTurboCpMicEnabledChanged
object:nil
userInfo:@{@"on": @(enabled), @"roomId": roomId}];
NSLog(@"🎮 TurboModeStateManager: 房间 %@ CP麦位开关设置为 %@", roomId, enabled ? @"开启" : @"关闭");
}
- (void)setTurboModeEnabled:(BOOL)enabled {
self.globalTurboEnabled = enabled;
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:@"TurboMode_Global"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"🎮 TurboModeStateManager: 全局 turbo mode 设置为 %@", enabled ? @"开启" : @"关闭");
// 发送状态变化通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"TurboModeStateChanged"
object:nil
userInfo:@{@"enabled": @(enabled)}];
}
- (BOOL)isTurboModeEnabled {
return self.globalTurboEnabled;
}
- (void)applyTurboModeToSwitchesForRoom:(NSString *)roomId {
if (!roomId) return;
BOOL turboModeEnabled = [self isTurboModeEnabled];
if (turboModeEnabled) {
// turbo mode = YES3个开关全部关闭
[self forceCloseAllSwitches:roomId];
NSLog(@"🎮 TurboModeStateManager: 应用 turbo mode房间 %@ 的3个开关全部关闭", roomId);
} else {
// turbo mode = NO按最新需求全部开关打开
[self forceOpenAllSwitches:roomId];
NSLog(@"🎮 TurboModeStateManager: turbo mode 关闭,房间 %@ 的3个开关全部打开", roomId);
}
}
- (NSDictionary<NSString *, NSNumber *> *)getSwitchStatesAfterTurboModeForRoom:(NSString *)roomId {
if (!roomId) return @{};
BOOL turboModeEnabled = [self isTurboModeEnabled];
if (turboModeEnabled) {
// turbo mode = YES4个开关全部关闭
return @{
@"giftEffects": @(NO),
@"globalGiftScreen": @(NO),
@"globalGameScreen": @(NO),
@"cpMic": @(NO)
};
} else {
// turbo mode = NO返回当前缓存的状态
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// 礼物特效:按需求不持久化,这里默认开启(面板或 RoomAnimationView 会基于 roomInfo 决定)
BOOL giftEffects = YES;
// 🔧 修复:使用与 RoomAnimationView 和 XPEffectPanelViewController 一致的逻辑
id giftScreenObj = [defaults objectForKey:kTurboGlobalGiftScreenEnabledKey(roomId)];
BOOL globalGiftScreen = (giftScreenObj != nil) ? [defaults boolForKey:kTurboGlobalGiftScreenEnabledKey(roomId)] : NO;
id gameScreenObj = [defaults objectForKey:kTurboGlobalGameScreenEnabledKey(roomId)];
BOOL globalGameScreen = (gameScreenObj != nil) ? [defaults boolForKey:kTurboGlobalGameScreenEnabledKey(roomId)] : NO;
id cpMicObj = [defaults objectForKey:kTurboCpMicEnabledKey(roomId)];
BOOL cpMic = (cpMicObj != nil) ? [defaults boolForKey:kTurboCpMicEnabledKey(roomId)] : NO;
return @{
@"giftEffects": @(giftEffects),
@"globalGiftScreen": @(globalGiftScreen),
@"globalGameScreen": @(globalGameScreen),
@"cpMic": @(cpMic)
};
}
}
- (void)resetTurboMode {
self.globalTurboEnabled = NO;
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"TurboMode_Global"];
[[NSUserDefaults standardUserDefaults] synchronize];
NSLog(@"🎮 TurboModeStateManager: 全局 turbo mode 状态已重置");
}
#pragma mark - Private Methods
- (void)forceCloseAllSwitches:(NSString *)roomId {
if (!roomId) return;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// 强制关闭礼物特效开关:不持久化,只发通知
// 强制关闭全局礼物屏幕开关
[defaults setBool:NO forKey:kTurboGlobalGiftScreenEnabledKey(roomId)];
// 强制关闭全局游戏屏幕开关
[defaults setBool:NO forKey:kTurboGlobalGameScreenEnabledKey(roomId)];
[defaults synchronize];
// 发送通知,让相关组件更新状态
[self sendSwitchStateChangeNotifications:roomId];
}
- (void)forceOpenAllSwitches:(NSString *)roomId {
if (!roomId) return;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// 礼物特效:不持久化,只发通知
// 全局礼物屏幕和全局游戏屏幕:打开并持久化
[defaults setBool:YES forKey:kTurboGlobalGiftScreenEnabledKey(roomId)];
[defaults setBool:YES forKey:kTurboGlobalGameScreenEnabledKey(roomId)];
[defaults synchronize];
// 通知三开关打开
[[NSNotificationCenter defaultCenter]
postNotificationName:kTurboGiftEffectsEnabledChanged
object:nil
userInfo:@{ @"on": @(YES), @"roomId": roomId }];
[[NSNotificationCenter defaultCenter]
postNotificationName:kTurboGlobalGiftScreenEnabledChanged
object:nil
userInfo:@{ @"on": @(YES), @"roomId": roomId }];
[[NSNotificationCenter defaultCenter]
postNotificationName:kTurboGlobalGameScreenEnabledChanged
object:nil
userInfo:@{ @"on": @(YES), @"roomId": roomId }];
}
- (void)sendSwitchStateChangeNotifications:(NSString *)roomId {
// 发送礼物特效开关状态变化通知
[[NSNotificationCenter defaultCenter]
postNotificationName:kTurboGiftEffectsEnabledChanged
object:nil
userInfo:@{@"on": @(NO), @"roomId": roomId}];
// 发送全局礼物屏幕开关状态变化通知
[[NSNotificationCenter defaultCenter]
postNotificationName:kTurboGlobalGiftScreenEnabledChanged
object:nil
userInfo:@{@"on": @(NO), @"roomId": roomId}];
// 发送全局游戏屏幕开关状态变化通知
[[NSNotificationCenter defaultCenter]
postNotificationName:kTurboGlobalGameScreenEnabledChanged
object:nil
userInfo:@{@"on": @(NO), @"roomId": roomId}];
}
- (void)loadTurboModeStatesFromCache {
// 不再按房间加载,已改为全局
}
// 🔧 新增:从 key 中提取房间ID
- (NSString *)extractRoomIdFromKey:(NSString *)key {
// key 格式: Turbo_UserId_Room_RoomId_GlobalGiftScreen
NSArray *components = [key componentsSeparatedByString:@"_"];
if (components.count >= 4) {
// 找到 "Room" 的位置
NSInteger roomIndex = -1;
for (NSInteger i = 0; i < components.count; i++) {
if ([components[i] isEqualToString:@"Room"]) {
roomIndex = i;
break;
}
}
if (roomIndex != -1 && roomIndex + 1 < components.count) {
return components[roomIndex + 1];
}
}
return nil;
}
// 🔧 新增:确保房间开关状态存在
- (void)ensureRoomSwitchStatesExist:(NSString *)roomId {
if (!roomId) return;
if (!self.roomSwitchStates[roomId]) {
[self loadSwitchStatesForRoom:roomId];
}
}
// 🔧 新增:加载指定房间的开关状态
- (void)loadSwitchStatesForRoom:(NSString *)roomId {
if (!roomId) return;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// 礼物特效:从房间信息获取,这里先设为默认值
BOOL giftEffects = YES;
// 其他三个开关:从 NSUserDefaults 读取
id giftScreenObj = [defaults objectForKey:kTurboGlobalGiftScreenEnabledKey(roomId)];
BOOL globalGiftScreen = (giftScreenObj != nil) ? [defaults boolForKey:kTurboGlobalGiftScreenEnabledKey(roomId)] : NO;
id gameScreenObj = [defaults objectForKey:kTurboGlobalGameScreenEnabledKey(roomId)];
BOOL globalGameScreen = (gameScreenObj != nil) ? [defaults boolForKey:kTurboGlobalGameScreenEnabledKey(roomId)] : NO;
id cpMicObj = [defaults objectForKey:kTurboCpMicEnabledKey(roomId)];
BOOL cpMic = (cpMicObj != nil) ? [defaults boolForKey:kTurboCpMicEnabledKey(roomId)] : NO;
self.roomSwitchStates[roomId] = @{
@"giftEffects": @(giftEffects),
@"globalGiftScreen": @(globalGiftScreen),
@"globalGameScreen": @(globalGameScreen),
@"cpMic": @(cpMic)
};
}
#pragma mark - 当前房间ID管理
// 🔧 新增设置当前房间ID进房成功后调用
- (void)setCurrentRoomId:(NSString *)roomId {
if (!roomId) return;
if ([roomId isEqualToString:_currentRoomId]) {
return;
}
_currentRoomId = roomId;
// 确保当前房间的开关状态存在
[self ensureRoomSwitchStatesExist:roomId];
// 发送通知告知其他组件房间ID已设置
[[NSNotificationCenter defaultCenter] postNotificationName:kTurboCurrentRoomIdSet
object:nil
userInfo:@{@"roomId": roomId}];
NSLog(@"🎮 TurboModeStateManager: 设置当前房间ID: %@", roomId);
}
// 🔧 新增获取当前房间ID
- (NSString *)loadCurrentRoomId {
return self.currentRoomId;
}
@end