Files
yinmeng-ios/xplan-ios/Main/Room/View/XPMiniRoomView.m
2023-01-17 15:43:45 +08:00

899 lines
33 KiB
Objective-C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// XPMiniRoomView.m
// xplan-ios
//
// Created by 冯硕 on 2021/12/3.
//
#import "XPMiniRoomView.h"
///Third
#import <Masonry/Masonry.h>
#import <NIMSDK/NIMSDK.h>
///Tool
#import "XPMacro.h"
#import "ThemeColor.h"
#import "NetImageView.h"
#import "RtcManager.h"
#import "UIButton+EnlargeTouchArea.h"
#import "TTPopup.h"
#import "XCHudTool.h"
#import "XPRoomMiniManager.h"
#import "AccountInfoStorage.h"
#import "Api+ArrangeMic.h"
#import "Api+Room.h"
#import "XPCoreDataManager.h"
#import "NSArray+Safe.h"
#import "NSMutableDictionary+Saft.h"
///Model
#import "RoomInfoModel.h"
#import "MicroQueueModel.h"
#import "MicroStateModel.h"
#import "UserInfoModel.h"
#import "AttachmentModel.h"
#import "ArrangeMicModel.h"
#import "RoomFaceSendInfoModel.h"
#import "MicroInviteExtModel.h"
#import "Music+CoreDataClass.h"
#import "RoomPKChooseUserModel.h"
#import "RoomSailingPrizeModel.h"
///View
#import "XPRoomViewController.h"
#import "XPNoteView.h"
UIKIT_EXTERN NSString * kRoomBackMusicPlayMusicFinishKey;
UIKIT_EXTERN NSString * kRoomBackMusicAudioMixingVolumeKey;
UIKIT_EXTERN NSString * kRoomBackMusicCaptureVolumeKey;
UIKIT_EXTERN NSString * kRoomBackMusicPlayMusicOrderKey;
@interface XPMiniRoomView ()<NIMChatroomManagerDelegate, NIMChatManagerDelegate, NIMLoginManagerDelegate>
///底部的底图
@property (nonatomic,strong) UIImageView *backImageView;
///头像
@property (nonatomic,strong) NetImageView *avatarImageView;
///昵称
@property (nonatomic,strong) UILabel *nickLabel;
///id
@property (nonatomic,strong) UILabel *idLabel;
///关闭
@property (nonatomic,strong) UIButton *closeButton;
///音符
@property (nonatomic,strong) XPNoteView *noteView;
///房间最小化
@property (nonatomic,strong) RoomInfoModel *roomInfo;
///房间最小化的时候 传入的用户信息
@property (nonatomic,strong) UserInfoModel *userInfo;
///当前最小化的房间的uid 如果没有的话 为nil
@property (nonatomic,strong) NSString *currentRoomUid;
///房间的id
@property (nonatomic,strong) NSString *currentRoomId;
///麦序
@property (nonatomic, strong) NSMutableDictionary<NSString *, MicroQueueModel *> *micQueue;
///正在播放的音乐
@property (nonatomic,strong) Music *currentMusic;
///当前的下表
@property (nonatomic,assign) NSInteger currentIndex;
///数据库请求
@property (nonatomic,strong) NSFetchRequest *request;
@end
@implementation XPMiniRoomView
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[[NIMSDK sharedSDK].chatroomManager addDelegate:self];
[[NIMSDK sharedSDK].chatManager addDelegate:self];
[[NIMSDK sharedSDK].loginManager addDelegate:self];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(roomBackMusicPlayFinish:) name:kRoomBackMusicPlayMusicFinishKey object:nil];
[self initEvents];
[self initSubViews];
[self initSubViewConstraints];
}
return self;
}
#pragma mark - Public Method
- (void)configRoomMiniView:(RoomInfoModel *)roomInfo userInfo:(UserInfoModel *)userInfo micQueue:(NSMutableDictionary *)micQueue {
self.hidden = NO;
self.currentRoomUid = [NSString stringWithFormat:@"%ld", roomInfo.uid];
self.currentRoomId = [NSString stringWithFormat:@"%ld", roomInfo.roomId];
self.roomInfo = roomInfo;
self.userInfo = userInfo;
self.micQueue = micQueue;
[self startAvatarAnimation];
[self.noteView startAnimation];
}
- (void)hiddenRoomMiniView {
[self.avatarImageView.layer removeAllAnimations];
[self.noteView stopAnimation];
self.currentRoomUid = nil;
self.currentRoomId = nil;
self.roomInfo = nil;
self.userInfo = nil;
self.micQueue = nil;
self.hidden = YES;
}
#pragma mark - Private Method
- (void)initSubViews {
self.frame = CGRectMake(KScreenWidth - 140 * 1.2, KScreenHeight - kSafeAreaBottomHeight - 150, 140 * 1.2, 34 * 1.2);
[self addSubview:self.backImageView];
[self.backImageView addSubview:self.avatarImageView];
[self.backImageView addSubview:self.noteView];
[self.backImageView addSubview:self.nickLabel];
[self.backImageView addSubview:self.idLabel];
[self.backImageView addSubview:self.closeButton];
}
- (void)initSubViewConstraints {
[self.backImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self);
}];
[self.avatarImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.backImageView).offset(5);
make.top.bottom.mas_equalTo(self.backImageView).inset(5);
make.height.mas_equalTo(self.avatarImageView.mas_width);
}];
[self.nickLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.avatarImageView.mas_right).offset(5);
make.bottom.mas_equalTo(self.avatarImageView.mas_centerY).offset(-1.5);
}];
[self.idLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.nickLabel);
make.top.mas_equalTo(self.avatarImageView.mas_centerY).offset(1.5);
}];
[self.closeButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(15, 15));
make.centerY.mas_equalTo(self.backImageView);
make.right.mas_equalTo(self.backImageView).offset(-11);
}];
[self.noteView mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.mas_equalTo(self.avatarImageView);
make.height.mas_equalTo(12);
make.width.mas_equalTo(12);
}];
}
- (void)initEvents {
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(roomMiniTag:)];
pan.delaysTouchesBegan = YES;
[self addGestureRecognizer:pan];
UITapGestureRecognizer *enterRoomTag = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(enterRomRecognizer:)];
[self addGestureRecognizer:enterRoomTag];
}
- (void)startAvatarAnimation {
CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 ];
rotationAnimation.duration = 3;
rotationAnimation.cumulative = YES;
rotationAnimation.repeatCount = MAXFLOAT;
rotationAnimation.removedOnCompletion = NO;
[self.avatarImageView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
}
- (void)cancelRoomArrangeMic {
///退出排麦
if (self.roomInfo.roomModeType == RoomModeType_Open_Micro_Mode || self.roomInfo.roomModeType == RoomModeType_Open_Blind) {
NSString * roomUid = [NSString stringWithFormat:@"%ld", self.roomInfo.uid];
NSString * uid = [AccountInfoStorage instance].getUid;
[Api getRoomArrangeMicList:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
if (code == 200) {
ArrangeMicModel * arrangeMicModel= [ArrangeMicModel modelWithJSON:data.data];
if (arrangeMicModel.myPos.intValue > 0) {
__block NSString * grouptype = @"0";
if (self.roomInfo.roomModeType == RoomModeType_Open_Blind) {
[arrangeMicModel.queue enumerateObjectsUsingBlock:^(ArrangeMicUserModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj.uid.integerValue == [AccountInfoStorage instance].getUid.integerValue) {
grouptype = [NSString stringWithFormat:@"%ld", obj.groupType];
*stop = YES;
}
}];
}
[Api cancelArrangeMic:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {} roomUid:roomUid operUid:uid groupType:grouptype];
}
}
} roomUid:roomUid operUid:uid page:@"1" pageSize:@"50"];
}else if(self.roomInfo.roomModeType == RoomModeType_Open_PK_Mode) {
NSString * roomUid = [NSString stringWithFormat:@"%ld", self.roomInfo.uid];
NSString * uid = [AccountInfoStorage instance].getUid;
[Api getRoomPKUserList:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
if (code == 200) {
ArrangeMicModel * arrangeMicModel= [ArrangeMicModel modelWithJSON:data.data];
if (arrangeMicModel.myPos.intValue > 0) {
__block NSString * grouptype = @"0";
[arrangeMicModel.queue enumerateObjectsUsingBlock:^(ArrangeMicUserModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj.uid.integerValue == [AccountInfoStorage instance].getUid.integerValue) {
grouptype = [NSString stringWithFormat:@"%ld", obj.groupType];
*stop = YES;
}
}];
[Api cancelRoomPKArrangeMic:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
} roomUid:roomUid operUid:uid groupType:grouptype];
}
}
} roomUid:roomUid operUid:uid page:@"1" pageSize:@"50"];
}
}
///自定义消息 是否可以加到 公屏 需要自己维护
- (BOOL)isCanDisplayMessage:(NIMMessage *)message {
NIMCustomObject *obj = (NIMCustomObject *)message.messageObject;
if (obj.attachment != nil && [obj.attachment isKindOfClass:[AttachmentModel class]]) {
AttachmentModel *attachment = (AttachmentModel *)obj.attachment;
if (attachment.first == CustomMessageType_Face && attachment.second == Custom_Message_Sub_Face_Send) {
if ([attachment.data[@"data"] isKindOfClass:[NSArray class]]) {
NSArray * array = [RoomFaceSendInfoModel modelsWithArray:attachment.data[@"data"]];
for (int i = 0; i< array.count; i++) {
RoomFaceSendInfoModel * sendInfo = [array safeObjectAtIndex1:i];
if (sendInfo.resultIndexes.count <=0) {
return NO;
}
}
}
}else if (attachment.first == CustomMessageType_Room_PK && attachment.second == Custom_Message_Sub_Room_PK_Manager_Up_Mic) {
if (attachment.data && [attachment.data allKeys].count > 0) {
for (NSDictionary * dic in [attachment.data allValues]) {
RoomPKChooseUserModel * userModel = [RoomPKChooseUserModel modelWithDictionary:dic];
if (userModel.groupType == GroupType_Red || userModel.groupType == GroupType_Blue) {
return YES;
}
}
}
return NO;
} else if(attachment.first == CustomMessageType_Room_Sailing && (attachment.second == Custom_Message_Sub_Sailing_AllRoom_Notify || attachment.second == Custom_Message_Sub_Sailing_InRoom_NeedAllMicSend)) {
RoomSailingPrizeModel * prizeModel = [RoomSailingPrizeModel modelWithDictionary:attachment.data];
if (self.userInfo.userLevelVo.experLevelSeq > prizeModel.userLevelLimit) {
return YES;
}
}
return [[[self supportMessageDic] objectForKey:@(attachment.first)] containsObject:@(attachment.second)];
}
return NO;
}
- (NSDictionary *)supportMessageDic {
return @{
@(CustomMessageType_AllMicroSend):
[NSSet setWithObjects:
@(Custom_Message_Sub_AllMicroSend),
@(Custom_Message_Sub_AllMicroLuckySend),
@(Custom_Message_Sub_AllBatchSend),
@(Custom_Message_Sub_AllBatchMicroLuckySend),
nil],
@(CustomMessageType_Gift):
[NSSet setWithObjects:
@(Custom_Message_Sub_Gift_Send),
@(Custom_Message_Sub_Gift_LuckySend),
nil],
@(CustomMessageType_Room_Tip):
[NSSet setWithObjects:
@(Custom_Message_Sub_Room_Tip_ShareRoom),
@(Custom_Message_Sub_Room_Tip_Attention_Owner),
nil],
@(CustomMessageType_Kick_User):
[NSSet setWithObjects:
@(Custom_Message_Sub_Kick_BeKicked),
@(Custom_Message_Sub_Kick_BlackList),
nil],
@(CustomMessageType_Queue):
[NSSet setWithObjects:
@(Custom_Message_Sub_Queue_Kick),
nil],
@(CustomMessageType_Candy_Tree):
[NSSet setWithObjects:
@(Custom_Message_Sub_Candy_Tree_Me),
@(Custom_Message_Sub_Candy_Tree_InRoom),
@(Custom_Message_Sub_Candy_Tree_AllRoom),
@(Custom_Message_Sub_Candy_Tree_AllRoom_Notify),
@(Custom_Message_Sub_Candy_Tree_InRoom_NeedAllMicSend),
nil],
@(CustomMessageType_Arrange_Mic):
[NSSet setWithObjects:
@(Custom_Message_Sub_Arrange_Mic_Mode_Open),
@(Custom_Message_Sub_Arrange_Mic_Mode_Close),
@(Custom_Message_Sub_Arrange_Mic_Free_Mic_Open),
@(Custom_Message_Sub_Arrange_Mic_Free_Mic_Close),
nil],
@(CustomMessageType_Update_RoomInfo):
[NSSet setWithObjects:
@(Custom_Message_Sub_Update_RoomInfo_MessageState),
@(Custom_Message_Sub_Update_RoomInfo_AnimateEffect),
nil],
@(CustomMessageType_Collection_Room):
[NSSet setWithObjects:
@(Custom_Message_Sub_Collect_Room_Tips),
nil],
@(CustomMessageType_RoomPlay_Dating):
[NSSet setWithObjects:
@(Custom_Message_Sub_Room_Play_Dating_Pick_Heart),
@(Custom_Message_Sub_Room_Play_Dating_Result_Mutual),
@(Custom_Message_Sub_Room_Play_Dating_Result_Not_Mutual),
nil],
@(CustomMessageType_Noble_VIP):
[NSSet setWithObjects:
@(Custom_Message_Sub_Room_Open_Noble_VIP),
@(Custom_Message_Sub_Room_Noble_LevelUp),
@(Custom_Message_Sub_AllRoom_Noble_LevelUp_Suspend),
nil],
@(CustomMessageType_Face):
[NSSet setWithObjects:
@(Custom_Message_Sub_Face_Send),
nil],
@(CustomMessageType_Anchor_FansTeam):
[NSSet setWithObjects:
@(Custom_Message_Sub_FansTeam_Open_Success),
@(Custom_Message_Sub_FansTeam_Open_Fail),
@(Custom_Message_Sub_FansTeam_Join_Success),
@(Custom_Message_Sub_FansTeam_Out_Success),
nil],
@(CustomMessageType_Hall_Super_Admin):
[NSSet setWithObjects:
@(Custom_Message_Sub_Hall_Super_Admin_Kick_Manager_Out_Room),
nil],
@(CustomMessageType_Tarot):
[NSSet setWithObjects:
@(Custom_Message_Sub_Tarot),
nil],
@(CustomMessageType_Room_PK):
[NSSet setWithObjects:
@(Custom_Message_Sub_Room_PK_Manager_Up_Mic),
@(Custom_Message_Sub_Room_PK_Mode_Close),
@(Custom_Message_Sub_Room_PK_Result),
@(Custom_Message_Sub_Room_PK_Mode_Open),
@(Custom_Message_Sub_Room_PK_Start),
@(Custom_Message_Sub_Room_PK_Re_Start),
nil],
@(CustomMessageType_LuckyBag):
[NSSet setWithObjects:
@(Custom_Message_Sub_Room_Gift_LuckBag_Server),
nil],
@(CustomMessageType_Gift_Compound):
[NSSet setWithObjects:@(Custom_Message_Sub_Gift_Compound),
nil],
@(CustomMessageType_Room_Sailing):
[NSSet setWithObjects:
@(Custom_Message_Sub_Sailing_Me),
@(Custom_Message_Sub_Sailing_InRoom),
@(Custom_Message_Sub_Sailing_AllRoom),
@(Custom_Message_Sub_Sailing_AllRoom_Notify),
@(Custom_Message_Sub_Sailing_InRoom_NeedAllMicSend),
nil],
};
}
#pragma mark - NIMChatroomManagerDelegate
- (void)chatroomBeKicked:(NIMChatroomBeKickedResult *)result {
///如果不是最小化的是 没必要监听
if ([XPRoomMiniManager shareManager].getRoomInfo == nil) return;
if (result.reason == 2) {
[XCHUDTool showErrorWithMessage:@"您被管理员踢出直播间"];
} else if (result.reason == 5) {
[XCHUDTool showErrorWithMessage:@"您已被管理员拉黑"];
}
[[XPRoomMiniManager shareManager] configRoomInfo:nil];
[[XPRoomMiniManager shareManager] configUserInfo:nil];
[[XPRoomMiniManager shareManager] configCurrentMusic:nil isPlaying:NO];
[[XPRoomMiniManager shareManager] resetLocalMessage];
[[RtcManager instance] exitRoom];
[self cancelRoomArrangeMic];
[self hiddenRoomMiniView];
}
#pragma mark - NIMLoginManagerDelegate
- (void)onKickout:(NIMLoginKickoutResult *)result {
///如果不是最小化的是 没必要监听
if ([XPRoomMiniManager shareManager].getRoomInfo == nil) return;
[[XPRoomMiniManager shareManager] configRoomInfo:nil];
[[XPRoomMiniManager shareManager] configUserInfo:nil];
[[XPRoomMiniManager shareManager] configCurrentMusic:nil isPlaying:NO];
[[XPRoomMiniManager shareManager] resetLocalMessage];
[[RtcManager instance] exitRoom];
[self hiddenRoomMiniView];
}
#pragma mark - NIMChatManagerDelegate
- (void)onRecvMessages:(NSArray<NIMMessage *> *)messages {
///如果不是最小化的是 没必要监听
if ([XPRoomMiniManager shareManager].getRoomInfo == nil) return;
for (NIMMessage * message in messages) {
// 非房间内消息不处理
if (message.session.sessionType != NIMSessionTypeChatroom) {
continue;
}
// 非本房间不处理
if (![message.session.sessionId isEqualToString:[NSString stringWithFormat:@"%ld", self.roomInfo.roomId]]) {
continue;
}
if (message.messageType == NIMMessageTypeNotification) {
NIMNotificationObject *notiMsg = (NIMNotificationObject *)message.messageObject;
NIMChatroomNotificationContent *content = (NIMChatroomNotificationContent *)notiMsg.content;
[self handleNIMNotificationMessage:content];
[self handleNIMNotificationSaveMessage:message];
} else if (message.messageType == NIMMessageTypeCustom) {
NIMCustomObject *obj = (NIMCustomObject *)message.messageObject;
if (obj.attachment != nil && [obj.attachment isKindOfClass:[AttachmentModel class]]) {
[self handleNIMCustomMessage:obj.attachment];
if ([self isCanDisplayMessage:message]) {
[[XPRoomMiniManager shareManager] saveRoomMessage:message];
}
}
}else if(message.messageType == NIMMessageTypeText) {
[self handleNIMTextMessage:message];
} else if(message.messageType == NIMMessageTypeTip) {
[self handleNIMTextMessage:message];
}
}
}
- (void)handleNIMNotificationMessage:(NIMChatroomNotificationContent *)content {
BOOL microQueueChanged = NO;
switch (content.eventType) {
case NIMChatroomEventTypeInfoUpdated: // 麦序状态更新
{
NSDictionary *data = [content.notifyExt toJSONObject];
int type = [data[@"type"] intValue];
NSArray* microStates;
switch (type) {
case 2:
microStates = @[[MicroStateModel modelWithJSON:data[@"micInfo"]]];
break;
case 3:
microStates = [MicroStateModel modelsWithArray:data[@"micInfo"]];
break;
}
if (microStates && microStates.count > 0) {
for (MicroStateModel *microState in microStates) {
MicroQueueModel *micSequence = [self.micQueue objectForKey:[NSString stringWithFormat:@"%d", microState.position]];
micSequence.microState = microState;
}
microQueueChanged = YES;
}
NSMutableDictionary *lastRoomInfoDic = [NSMutableDictionary dictionaryWithDictionary:[self.roomInfo model2dictionary]];
[lastRoomInfoDic addEntriesFromDictionary: ((NSString *)data[@"roomInfo"]).toJSONObject];
RoomInfoModel *newRoomInfo = [RoomInfoModel modelWithJSON:lastRoomInfoDic];
//TODO: 从小游戏房间切换到普通房间的话 mgid不会被清除掉
if (newRoomInfo.type != RoomType_MiniGame) {
newRoomInfo.mgId = 0;
}
if (newRoomInfo.roomModeType == RoomModeType_Open_Blind && self.roomInfo.roomModeType != RoomModeType_Open_Blind) {
///普通房 切换为相亲房
newRoomInfo.datingState = RoomDatingStateChangeType_Open;
} else if(newRoomInfo.roomModeType != RoomModeType_Open_Blind && self.roomInfo.roomModeType == RoomModeType_Open_Blind) {
///关闭了相亲房
newRoomInfo.datingState = RoomDatingStateChangeType_Close;
} else {
newRoomInfo.datingState = RoomDatingStateChangeType_Normal;
}
self.roomInfo = newRoomInfo;
}
break;
case NIMChatroomEventTypeQueueChange: // 麦序上下麦
{
NSDictionary* data = (NSDictionary *)content.ext;
NSString* position = [data objectForKey:NIMChatroomEventInfoQueueChangeItemKey];
UserInfoModel* userInfo = [UserInfoModel modelWithJSON:[data objectForKey:NIMChatroomEventInfoQueueChangeItemValueKey]];
NSInteger changeType = [data[NIMChatroomEventInfoQueueChangeTypeKey] integerValue];
// 先清除该用户旧的麦位
for (MicroQueueModel *sequence in self.micQueue.allValues) {
if (userInfo.uid == sequence.userInfo.uid) {
sequence.userInfo = nil;
}
}
if (changeType == 1) { // 上麦
MicroQueueModel *sequence = [self.micQueue objectForKey:position];
sequence.userInfo = userInfo;
}
microQueueChanged = YES;
}
break;
case NIMChatroomEventTypeExit:
case NIMChatroomEventTypeKicked:
{
for (NIMChatroomNotificationMember *member in content.targets) {
for (MicroQueueModel *sequence in self.micQueue.allValues) {
if (member.userId.integerValue == sequence.userInfo.uid) {
sequence.userInfo = nil;
microQueueChanged = YES;
}
}
}
}
break;
default:
break;
}
if (microQueueChanged) {
[self microQueueUpdated];
}
}
- (void)microQueueUpdated {
BOOL selfNeedBroadcast = NO;
for (int i = 0; i < self.micQueue.allKeys.count; i++) {
MicroQueueModel * model = [self.micQueue objectForKey:[NSString stringWithFormat:@"%d", i]];
if (model.userInfo.uid == [AccountInfoStorage instance].getUid.integerValue) {
selfNeedBroadcast = model.microState.micState == MicroMicStateType_Open;
}
}
if (self.roomInfo.type == RoomType_Anchor && [[AccountInfoStorage instance].getUid isEqualToString:[NSString stringWithFormat:@"%ld", self.roomInfo.uid]]) {
selfNeedBroadcast = YES;///个播房房主默认角色为主播
}
[[RtcManager instance] broadcast:selfNeedBroadcast];
}
- (void)handleNIMCustomMessage:(AttachmentModel *)attachment {
if(attachment.first == CustomMessageType_Queue && attachment.second == Custom_Message_Sub_Queue_Invite) {
NSDictionary *dic = attachment.data;
MicroInviteExtModel *inviteModel = [MicroInviteExtModel modelWithDictionary:dic];
if (inviteModel.uid.integerValue == self.userInfo.uid) {
NSString *position = inviteModel.micPosition;
MicroQueueModel *micro = [self.micQueue objectForKey:position];
if (!micro || micro.userInfo) return; // 当前麦位有人,什么都不做。
RoomInfoModel* roomInfo = self.roomInfo;
NSString* roomId = [NSString stringWithFormat:@"%ld", roomInfo.roomId];
UserInfoModel* userInfo = self.userInfo;
NIMChatroomQueueUpdateRequest *request = [[NIMChatroomQueueUpdateRequest alloc]init];
request.key = position;
request.value = [[self configUpdateChatRoomQueueExt:userInfo] toJSONString];
request.roomId = roomId;
request.transient = YES;
[[NIMSDK sharedSDK].chatroomManager updateChatroomQueueObject:request completion:^(NSError * _Nullable error) {
if (error) return;
[self cancelRoomArrangeMic];
[RtcManager instance].localMuted = YES;
TTAlertConfig *config = [[TTAlertConfig alloc] init];
config.title = @"房主或管理员拉你上麦";
config.message = @"你已被房主或管理员拉上麦,但并未开启麦克风。如需要说话,请打开麦克风。";
[TTPopup alertWithConfig:config confirmHandler:^{
} cancelHandler:^{
}];
}];
}
} else if (attachment.first == CustomMessageType_Update_RoomInfo && attachment.second == Custom_Message_Sub_Update_RoomInfo_MessageState) {
[[XPRoomMiniManager shareManager] resetLocalMessage];
}
}
#pragma mark - 最小化 公屏的显示问题
///添加信息
- (void)addRoomMessage:(NIMMessage *)message {
if (self.roomInfo.isCloseScreen) {
NIMCustomObject *obj = (NIMCustomObject *)message.messageObject;
if (obj.attachment != nil && [obj.attachment isKindOfClass:[AttachmentModel class]]) {
AttachmentModel *attachment = (AttachmentModel *)obj.attachment;
if (attachment.first == CustomMessageType_Update_RoomInfo && attachment.second == Custom_Message_Sub_Update_RoomInfo_MessageState){
[[XPRoomMiniManager shareManager] saveRoomMessage:message];
}
}
} else {
[[XPRoomMiniManager shareManager] saveRoomMessage:message];
}
}
- (void)handleNIMNotificationSaveMessage:(NIMMessage *)message {
NIMNotificationObject *notiMsg = (NIMNotificationObject *)message.messageObject;
NIMChatroomNotificationContent *content = (NIMChatroomNotificationContent *)notiMsg.content;
RoomInfoModel * roomInfo = self.roomInfo;
if (content.eventType == NIMChatroomEventTypeEnter) {
if (roomInfo.isCloseScreen) {
AttachmentModel *attachement = [[AttachmentModel alloc]init];
attachement.first = CustomMessageType_Update_RoomInfo;
attachement.second = Custom_Message_Sub_Update_RoomInfo_MessageState;
attachement.data = @{@"roomInfo":self.roomInfo.model2dictionary};
NIMMessage *message = [[NIMMessage alloc]init];
NIMCustomObject *object = [[NIMCustomObject alloc] init];
object.attachment = attachement;
message.messageObject = object;
[self addRoomMessage:message];
return;
} else {
[self addRoomMessage:message];
NIMChatroomNotificationMember *member = content.targets[0];
if (member.userId.integerValue == [AccountInfoStorage instance].getUid.integerValue) {
if (!roomInfo.hasAnimationEffect) {
[self roomInfoNoGiftAnimationMessage:message];
}
}
}
} else if(content.eventType == NIMChatroomEventTypeInfoUpdated) {
if (roomInfo.isCloseScreen) {return;}
if (roomInfo.datingState == RoomDatingStateChangeType_Open) {
[self addRoomMessage:message];
}
}
}
- (void)handleNIMTextMessage:(NIMMessage *)message {
[self addRoomMessage:message];
}
- (void)roomInfoNoGiftAnimationMessage:(NIMMessage *)message {
AttachmentModel *attachement = [[AttachmentModel alloc]init];
attachement.first = CustomMessageType_Update_RoomInfo;
attachement.second = Custom_Message_Sub_Update_RoomInfo_AnimateEffect;
NIMMessage *tempMessage = [[NIMMessage alloc]init];
NIMCustomObject *customObject = [[NIMCustomObject alloc]init];
customObject.attachment = attachement;
tempMessage.messageObject = customObject;
[self addRoomMessage:tempMessage];
}
- (NSDictionary *)configUpdateChatRoomQueueExt:(UserInfoModel *)userInfo {
NSMutableDictionary * dic = [NSMutableDictionary dictionary];
[dic safeSetObject:@(userInfo.gender) forKey:@"gender"];
[dic safeSetObject:userInfo.avatar forKey:@"avatar"];
[dic safeSetObject:@(userInfo.uid) forKey:@"uid"];
[dic safeSetObject:userInfo.nick forKey:@"nick"];
NSString * headWearUrl = userInfo.headwearEffect.length > 0 ? userInfo.headwearEffect : userInfo.headwearPic;
if (headWearUrl.length > 0) {
[dic safeSetObject:headWearUrl forKey:@"headWearUrl"];
}
if (userInfo.micCircle.length) {
[dic safeSetObject:userInfo.micCircle forKey:@"micCircle"];
}
if (userInfo.micNickColor.length) {
[dic safeSetObject:userInfo.micNickColor forKey:@"micNickColor"];
}
[dic safeSetObject:@(userInfo.userVipInfoVO.enterHide) forKey:@"enterHide"];
[dic safeSetObject:@(userInfo.userVipInfoVO.preventKick) forKey:@"preventKick"];
return dic;
}
#pragma mark - Event Response
- (void)closeButtonAction:(UIButton *)sender {
[[NIMSDK sharedSDK].chatroomManager exitChatroom:self.currentRoomId completion:nil];
[self reportOutRoom];
[[RtcManager instance] exitRoom];
[[XPRoomMiniManager shareManager] configRoomInfo:nil];
[[XPRoomMiniManager shareManager] configUserInfo:nil];
[[XPRoomMiniManager shareManager] configCurrentMusic:nil isPlaying:NO];
[[XPRoomMiniManager shareManager] resetLocalMessage];
[self hiddenRoomMiniView];
}
- (void)reportOutRoom {
if ([[AccountInfoStorage instance] getTicket].length < 1) {
return;
}
[Api requestReportUserOutRoom:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
} uid:[[AccountInfoStorage instance] getUid] roomUid:self.currentRoomUid ticket:[[AccountInfoStorage instance] getTicket]];
}
- (void)enterRomRecognizer:(UITapGestureRecognizer *)tap {
if (self.currentRoomUid > 0 && self.controller) {
[XPRoomViewController openMiniRoom:self.currentRoomUid viewController:self.controller];
}
}
- (void)roomMiniTag:(UIPanGestureRecognizer*)p {
UIWindow *appWindow = [UIApplication sharedApplication].delegate.window;
CGPoint panPoint = [p locationInView:appWindow];
if (p.state == UIGestureRecognizerStateBegan) {
self.alpha = 1;
} else if(p.state == UIGestureRecognizerStateChanged) {
self.center = CGPointMake(panPoint.x, panPoint.y);
} else if(p.state == UIGestureRecognizerStateEnded
|| p.state == UIGestureRecognizerStateCancelled) {
self.alpha = 1;
CGFloat touchWidth = self.frame.size.width;
CGFloat touchHeight = self.frame.size.height;
CGFloat screenWidth = [[UIScreen mainScreen] bounds].size.width;
CGFloat screenHeight = [[UIScreen mainScreen] bounds].size.height;
// fabs 是取绝对值的意思
CGFloat left = fabs(panPoint.x);
CGFloat right = fabs(screenWidth - left);
CGFloat top = fabs(panPoint.y);
CGFloat bottom = fabs(screenHeight - top);
CGFloat minSpace = 0;
minSpace = MIN(MIN(MIN(top, left), bottom), right);
CGPoint newCenter;
CGFloat targetY = 0;
//校正Y
if (panPoint.y < 15 + touchHeight / 2.0) {
targetY = 15 + touchHeight / 2.0;
}else if (panPoint.y > (screenHeight - touchHeight / 2.0 - 15)) {
targetY = screenHeight - touchHeight / 2.0 - 15;
}else{
targetY = panPoint.y;
}
if (minSpace == left) {
newCenter = CGPointMake(15+touchWidth/2.0, targetY);
}else if (minSpace == right) {
newCenter = CGPointMake(screenWidth - touchWidth/2.0 - 15, targetY);
}else if (minSpace == top) {
newCenter = CGPointMake(panPoint.x, touchWidth / 3);
}else {
newCenter = CGPointMake(panPoint.x, screenHeight - touchWidth / 3);
}
[UIView animateWithDuration:0.25 animations:^{
if (newCenter.y + self.frame.size.height / 2 > KScreenHeight - kSafeAreaBottomHeight - 44) {
self.center = CGPointMake(newCenter.x, KScreenHeight - self.frame.size.height / 2 - kSafeAreaBottomHeight - 44);
}else {
self.center = newCenter;
}
}];
}
}
#pragma mark - 背景音乐的播放
- (void)roomBackMusicPlayFinish:(NSNotification *)notification {
NSString * filePath = [notification object];
Music * currentMusic = [XPRoomMiniManager shareManager].getCurrentMusic;
if (filePath && currentMusic) {
self.currentMusic = currentMusic;
NSArray<Music *> * array = [[XPCoreDataManager shareInstance].managedObjectContext executeFetchRequest:self.request error:nil];
__block NSInteger currentIndex = 0;
[array enumerateObjectsUsingBlock:^(Music * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj.musicName isEqualToString:currentMusic.musicId]) {
currentIndex = idx;
*stop = YES;
}
}];
self.currentIndex = currentIndex;
NSInteger order = [[NSUserDefaults standardUserDefaults] integerForKey:kRoomBackMusicPlayMusicOrderKey];
if (order == 0) {
NSInteger index = self.currentIndex +1;
[self playNextMusic:index];
} else {
[self playNextMusic:currentIndex];
}
}
}
- (void)playNextMusic:(NSInteger)index {
NSArray * array = [[XPCoreDataManager shareInstance].managedObjectContext executeFetchRequest:self.request error:nil];
if (index >= array.count) {
index = 0;
if (self.currentMusic) {
[[RtcManager instance] changePlayState:BackMusicPlayState_Resume];
} else {
Music * music = [array safeObjectAtIndex1:index];
[self playCurrentMusic:music index:index];
}
} else {
Music * music = [array safeObjectAtIndex1:index];
[self playCurrentMusic:music index:index];
}
}
- (void)playCurrentMusic:(Music *)music index:(NSInteger)index {
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
int musicVolum = (int)[defaults integerForKey:kRoomBackMusicAudioMixingVolumeKey];
musicVolum = musicVolum > 0 ? musicVolum : 50;
int captureVolum = (int)[defaults integerForKey:kRoomBackMusicCaptureVolumeKey];
captureVolum = captureVolum > 0 ? captureVolum : 50;
self.currentMusic = music;
self.currentIndex = index;
NSString * documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
documentsPath = [NSString stringWithFormat:@"%@/music/",documentsPath];
NSString * musicPath;
if (music.musicName) {
musicPath = [documentsPath stringByAppendingString:music.musicName];
} else {
return;
}
[[RtcManager instance] playBackMusic:musicPath musicId:0 completion:^(NSString * filePath) {
NSInteger order = [[NSUserDefaults standardUserDefaults] integerForKey:kRoomBackMusicPlayMusicOrderKey];
if (order == 0) {
NSInteger index = self.currentIndex + 1;
[self playNextMusic:index];
} else {
[self playNextMusic:self.currentIndex];
}
}];
[[RtcManager instance] updateUserSound:captureVolum];
[[RtcManager instance] updateMusicSound:musicVolum];
}
#pragma mark - Getters And Setters
- (void)setRoomInfo:(RoomInfoModel *)roomInfo {
_roomInfo = roomInfo;
if (_roomInfo) {
self.avatarImageView.imageUrl = _roomInfo.avatar;
if (_roomInfo.title.length > 8) {
_roomInfo.title = [NSString stringWithFormat:@"%@…", [_roomInfo.title substringToIndex:8]];
}
self.nickLabel.text = _roomInfo.title;
self.idLabel.text = [NSString stringWithFormat:@"%@号:%ld", AppName,_roomInfo.erbanNo];
}
}
- (UIImageView *)backImageView {
if (!_backImageView) {
_backImageView = [[UIImageView alloc] init];
_backImageView.userInteractionEnabled = YES;
_backImageView.image = [UIImage imageNamed:@"room_mini_background"];
}
return _backImageView;
}
- (NetImageView *)avatarImageView {
if (!_avatarImageView) {
NetImageConfig * config = [[NetImageConfig alloc] init];
config.imageType = ImageTypeUserIcon;
config.placeHolder = [UIImageConstant defaultAvatarPlaceholder];
_avatarImageView = [[NetImageView alloc] initWithConfig:config];
_avatarImageView.layer.masksToBounds = YES;
_avatarImageView.layer.cornerRadius = (34 * 1.2 - 10)/2;
_avatarImageView.userInteractionEnabled = YES;
}
return _avatarImageView;
}
- (UILabel *)nickLabel {
if (!_nickLabel) {
_nickLabel = [[UILabel alloc] init];
_nickLabel.font = [UIFont systemFontOfSize:12];
_nickLabel.textColor = [UIColor whiteColor];
_nickLabel.userInteractionEnabled = YES;
}
return _nickLabel;
}
- (UILabel *)idLabel {
if (!_idLabel) {
_idLabel = [[UILabel alloc] init];
_idLabel.font = [UIFont systemFontOfSize:10];
_idLabel.textColor = [UIColor whiteColor];
_idLabel.userInteractionEnabled = YES;
}
return _idLabel;
}
- (UIButton *)closeButton {
if (!_closeButton) {
_closeButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_closeButton setImage:[UIImage imageNamed:@"room_mini_close"] forState:UIControlStateNormal];
[_closeButton addTarget:self action:@selector(closeButtonAction:) forControlEvents:UIControlEventTouchUpInside];
[_closeButton setEnlargeEdgeWithTop:10 right:10 bottom:10 left:10];
}
return _closeButton;
}
- (XPNoteView *)noteView {
if (!_noteView) {
_noteView = [[XPNoteView alloc] init];
_noteView.userInteractionEnabled = YES;
_noteView.pillarColor = [UIColor colorWithWhite:1 alpha:0.6];
_noteView.pillarWidth = 2;
[_noteView startAnimation];
}
return _noteView;
}
- (NSFetchRequest *)request {
if (!_request) {
_request = [NSFetchRequest fetchRequestWithEntityName:@"Music"];
}
return _request;
}
@end