// // XPRoomPresenter.m // xplan-ios // // Created by 冯硕 on 2021/10/18. // #import "XPRoomPresenter.h" ///API #import "Api+Room.h" #import "Api+Gift.h" #import "UserInfoModel.h" #import "GuildSuperAdminInfoModel.h" ///Tool #import "AccountInfoStorage.h" #import "XPGiftStorage.h" #import "NSObject+MJExtension.h" ///Model #import "GiftInfoModel.h" #import "XPMessageRemoteExtModel.h" #import "RoomNewUserGreetModel.h" #import "XPRoomRecommendModel.h" #import "XPRedPacketModel.h" ///P #import "XPRoomProtocol.h" #import #import @implementation XPRoomPresenter - (void)initEnterRoom:(NSString *)roomUid user:(NSString *)uid { RACSubject* room = [RACSubject subject]; RACSubject* user = [RACSubject subject]; [[RACSignal combineLatest:@[room, user] reduce:^id(RoomInfoModel* room, UserInfoModel* user){ [[self getView] initEnterRoomSuccess:room user:user]; return nil; }] subscribeError:^(NSError * _Nullable error) { [[self getView] enterRoomFail:error.code]; }]; [Api getUserInfo:[self createHttpCompletion:^(BaseModel * _Nonnull data) { UserInfoModel * infoModel = [UserInfoModel modelWithJSON:data.data]; [user sendNext:infoModel]; [user sendCompleted]; } fail:^(NSInteger code, NSString * _Nullable msg) { [user sendError:nil]; } showLoading:NO errorToast:NO] uid:uid]; [Api getRoomInfo:[self createHttpCompletion:^(BaseModel * _Nonnull data) { RoomInfoModel * model = [RoomInfoModel modelWithJSON:data.data]; [room sendNext:model]; [room sendCompleted]; } fail:^(NSInteger code, NSString * _Nullable msg) { [user sendError:nil]; } showLoading:NO errorToast:NO] uid:roomUid intoUid:uid]; } - (void)enterNIMRoom:(NSString *)roomId user:(UserInfoModel *)userInfo { NIMChatroomEnterRequest *request = [[NIMChatroomEnterRequest alloc] init]; request.roomId = roomId; //设置ext XPMessageRemoteExtModel * extModel = [[XPMessageRemoteExtModel alloc] init]; extModel.defUser = userInfo.defUser; extModel.erbanNo = userInfo.erbanNo; extModel.carName = userInfo.carName; extModel.inRoomNameplatePic = userInfo.nameplatePic; extModel.inRoomNameplateWord = userInfo.nameplateWord; extModel.charmUrl = userInfo.userLevelVo.charmUrl; extModel.experLevelSeq = userInfo.userLevelVo.experLevelSeq; extModel.experUrl = userInfo.userLevelVo.experUrl; extModel.newUser = userInfo.newUser; extModel.vipIcon = userInfo.userVipInfoVO.vipIcon; extModel.fromUid = userInfo.fromUid; extModel.fromType = userInfo.fromType; extModel.fromNick = userInfo.fromNick; extModel.iosBubbleUrl = userInfo.iosBubbleUrl; extModel.androidBubbleUrl = userInfo.androidBubbleUrl; extModel.enterHide = userInfo.userVipInfoVO.enterHide; extModel.preventKick = userInfo.userVipInfoVO.preventKick; extModel.enterRoomEffects = userInfo.userVipInfoVO.enterRoomEffects; extModel.gender = userInfo.gender; extModel.fromSayHelloChannel = userInfo.fromSayHelloChannel; extModel.platformRole = userInfo.platformRole; NSMutableDictionary *ext = [NSMutableDictionary dictionaryWithObject:extModel.model2dictionary forKey:[NSString stringWithFormat:@"%ld", userInfo.uid]]; request.roomExt = [ext toJSONString]; [[NIMSDK sharedSDK].chatroomManager enterChatroom:request completion:^(NSError * _Nullable error, NIMChatroom * _Nullable chatroom, NIMChatroomMember * _Nullable me) { if (error) { [[self getView] enterRoomFail:error.code]; } else { [[self getView] enterRoomSuccess:chatroom]; } }]; } - (void)exitNIMRoom:(NSString *)roomId { [[NIMSDK sharedSDK].chatroomManager exitChatroom:roomId completion:nil]; } /// 开启用户自己的房间 /// @param title 房间标题 /// @param type 房间类型 /// @param roomPwd 房间密码 /// @param roomDesc 房间介绍 /// @param backPic 房间背景 /// @param mgId 小游戏的id - (void)openRoom:(NSString *)title type:(RoomType)type roomPwd:(NSString *)roomPwd roomDesc:(NSString *)roomDesc backPic:(NSString *)backPic mgId:(NSString *)mgId{ NSString * uid = [AccountInfoStorage instance].getUid; NSString * ticket = [AccountInfoStorage instance].getTicket; if (title.length <= 0) { title = @""; } if (roomPwd.length <= 0) { roomPwd = @""; } if (roomDesc.length <= 0) { roomDesc = @""; } if (backPic.length <= 0) { backPic = @""; } if (mgId.length <= 0) { mgId = @"0"; } [Api openRoom:[self createHttpCompletion:^(BaseModel * _Nonnull data) { RoomInfoModel * infoModel = [RoomInfoModel modelWithJSON:data.data]; [[self getView] openRoomSuccess:infoModel]; } fail:^(NSInteger code, NSString * _Nullable msg) { [[self getView] enterRoomFail:code]; } showLoading:NO] title:title type:type roomPwd:roomPwd roomDesc:roomDesc backPic:backPic uid:uid ticket:ticket mgId:mgId]; } ///福袋礼物爆出的礼物的bug ///进入房间的时候需要获取一次礼物信息 因为如果有人送礼物的话 如果是福袋礼物的话 爆出的礼物需要从礼物列表中获取 会导致公屏不显示那个礼物 /// 获取普通的礼物 /// @param roomUid 房主的uid 获取房间专属礼物 - (void)getNormalGiftList:(NSString *)roomUid { ///先不请求接口 从缓存中获取 [[XPGiftStorage shareStorage] getGiftDatasource:roomUid]; [Api requestNormalGiftList:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { NSArray *luckyBagGift = [GiftInfoModel modelsWithArray:data.data[@"luckyBagGift"]]; // 福袋礼物 NSArray *vipGift = [GiftInfoModel modelsWithArray:data.data[@"vipGift"]]; // 贵族礼物 NSArray *luckyPoolGift = [GiftInfoModel modelsWithArray:data.data[@"luckyPoolGift"]];// 福袋奖池礼物 NSArray *normalGift = [GiftInfoModel modelsWithArray:data.data[@"normalGift"]]; // 普通面板礼物 NSArray *weekStarGift = [GiftInfoModel modelsWithArray:data.data[@"weekStarGift"]]; // 周星礼物 NSArray *drawGift = [GiftInfoModel modelsWithArray:data.data[@"drawGift"]]; // 涂鸦礼物 NSArray *anchorGift = [GiftInfoModel modelsWithArray:data.data[@"singlePopularGift"]]; // 个播礼物 //TODO: luckyPoolGift 这个就是福袋礼物的所有的数据 只要保存这个就行了吧 以后需要改 NSMutableArray *info = [NSMutableArray array]; NSMutableArray *totalInfo = [NSMutableArray array]; [info addObjectsFromArray:luckyBagGift]; [info addObjectsFromArray:vipGift]; [info addObjectsFromArray:normalGift]; [info addObjectsFromArray:weekStarGift]; [info addObjectsFromArray:drawGift]; [totalInfo addObjectsFromArray:info]; [totalInfo addObjectsFromArray:luckyPoolGift]; ///把礼物信息保存一下 [[XPGiftStorage shareStorage] saveGiftDatasource:info roomUid:roomUid]; [[XPGiftStorage shareStorage] writeGiftToDirectory:totalInfo]; } roomUid:roomUid]; } /// 上报用户进房 /// @param roomUid 房间uid - (void)reportUserInterRoom:(NSString *)roomUid { if ([[AccountInfoStorage instance] getTicket].length < 1) { return; } [Api requestReportUserInterRoom:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { } uid:[[AccountInfoStorage instance] getUid] roomUid:roomUid ticket:[[AccountInfoStorage instance] getTicket]]; } /// 上报用户退房 /// @param roomUid 房间uid - (void)reportUserOutRoom:(NSString *)roomUid { if ([[AccountInfoStorage instance] getTicket].length < 1) { return; } [Api requestReportUserOutRoom:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { } uid:[[AccountInfoStorage instance] getUid] roomUid:roomUid ticket:[[AccountInfoStorage instance] getTicket]]; } /// 获取房间超管列表 /// @param roomUid 房间的uid - (void)getRoomSuperAdmin:(NSString *)roomUid { [Api getRoomSuperAdminList:[self createHttpCompletion:^(BaseModel * _Nonnull data) { NSArray * array = [GuildSuperAdminInfoModel modelsWithArray:data.data]; [[self getView] getRoomSuperAdminScuccess:array]; }] roomUid:roomUid]; } ///获取循环的推荐房间 /// @param roomUid 房间的uid - (void)getCycleAnchorRoomList:(NSString *)roomUid { [Api requestNextAnchorRoom:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { if (code == 200) { RoomInfoModel * infoModel = [RoomInfoModel modelWithJSON:data.data]; [[self getView] getNextAnchorRoomSuccess:infoModel]; } else { [[self getView] getNextAnchorRoomSuccess:nil]; } } roomUid:roomUid]; } - (void)getCurrentRoomInfo:(NSString *)roomUid { NSString * uid= [AccountInfoStorage instance].getUid; [Api getRoomInfo:[self createHttpCompletion:^(BaseModel * _Nonnull data) { RoomInfoModel * roomInfo = [RoomInfoModel modelWithDictionary:data.data]; [[self getView] getCurrentRoomInfoSuccess:roomInfo]; } fail:^(NSInteger code, NSString * _Nullable msg) { [[self getView] getCurrentRoomInfoSuccess:nil]; }] uid:roomUid intoUid:uid]; } ///获取房间红包 - (void)getRedPacket:(NSString *)roomUid { [Api requestRedPacket:[self createHttpCompletion:^(BaseModel * _Nonnull data) { NSArray *array = [XPRedPacketModel modelsWithArray:data.data]; [[self getView] getRedPacketSuccess:array]; }] uid:roomUid]; } @end