Files
peko-ios/YuMi/Modules/YMRoom/View/MenuContainerView/XPRoomMenuContainerView.m

918 lines
38 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.

//
// XPRoomBottomMenuView.m
// xplan-ios
//
// Created by 冯硕 on 2021/10/11.
//
#import "XPRoomMenuContainerView.h"
///Third
#import <Masonry/Masonry.h>
///Tool
#import "AccountInfoStorage.h"
#import "TTPopup.h"
#import "RtcManager.h"
#import "XCCurrentVCStackManager.h"
#import "UIImage+Utils.h"
///Model
#import "UserInfoModel.h"
#import "XPRoomMenuItem.h"
#import "MicroQueueModel.h"
#import "UserInfoModel.h"
#import "MicroStateModel.h"
#import "RoomInfoModel.h"
#import "AttachmentModel.h"
#import "GuildSuperAdminInfoModel.h"
///View
#import "XPWebViewController.h"
#import "XPRoomSendTextView.h"
#import "XPSendGiftView.h"
#import "SessionListViewController.h"
#import "XPRoomMoreMenuViewController.h"
#import "VIPCenterViewController.h"
#import "XPRoomFaceViewController.h"
#import "XPRoomHalfMessageView.h"
#import "XPRoomMessageBubbleView.h"
#import "MSRoomMenuGameVC.h"
#import "SVGA.h"
#import "XPRoomMiniManager.h"
#import "XPSkillCardPlayerManager.h"
UIKIT_EXTERN NSString * kRoomBackMusicCaptureVolumeKey;
@interface XPRoomMenuContainerView ()<XPRoomMessageBubbleViewDelegate>
///输入框
@property (nonatomic,strong) UIButton *inputButton;
@property (nonatomic,strong) UILabel *inputLabel;
///麦
@property (nonatomic,strong) UIButton *micButton;
@property (nonatomic,strong) UIButton *micButton_open;
@property (nonatomic,strong) UIButton *micButton_close_all;
@property (nonatomic,strong) UIButton *micButton_close_butMusic;
///声音
@property (nonatomic,strong) UIButton *voiceButton;
///表情
@property (nonatomic,strong) UIButton *faceButton;
///私聊
@property (nonatomic,strong) UIButton *messageButton;
///更多
@property (nonatomic,strong) UIButton *moreButton;
///礼物
@property (nonatomic,strong) UIButton *giftButton;
///排麦
@property (nonatomic,strong) UIButton *arrangeMicButton;
///输入框
@property (nonatomic,strong) XPRoomSendTextView *inputTextView;
@property (nonatomic,strong) XPRoomMessageBubbleView *miniMessageView;
///代理
@property (nonatomic,weak) id<RoomHostDelegate> delegate;
@property (nonatomic, strong) UIStackView *stackView;
@property (nonatomic, assign) NSInteger defaultVoiceVolume;
@property (nonatomic, assign) BOOL isDisplayMicStatusControl;
@property(nonatomic, assign) BOOL isOnMic;
@property(nonatomic, strong) UIButton *closeMicControlButton;
@end
@implementation XPRoomMenuContainerView
- (instancetype)initWithDelegate:(id<RoomHostDelegate>)delegate {
self = [super init];
if (self) {
self.clipsToBounds = NO;
self.defaultVoiceVolume = [[RtcManager instance] loadUserSound];
self.delegate = delegate;
[self initSubViews];
[self initSubViewConstraints];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showGiftView:) name:@"kShowGiftView" object:nil];
}
return self;
}
- (void)menuResignFirstResponder {
[self.inputTextView.editTextFiled resignFirstResponder];
}
-(void)showInputView:(NSString *)text{
[self menuButtonAction:self.inputButton];
[self.inputTextView showInputView:text];
}
#pragma mark - Response
- (void)menuButtonAction:(UIButton *)sender {
XPRoomMenuItemType type = sender.tag;
switch (type) {
case XPRoomMenuItemType_Input:
{
if (self.delegate.getRoomInfo.isCloseScreen){//} && self.delegate.getPublicScreenType == 0) {
[XNDJTDDLoadingTool showErrorWithMessage:YMLocalizedString(@"XPRoomMenuContainerView0")];
return;
}
if (self.delegate.getRoomInfo.type == RoomType_Anchor) {
self.inputTextView = [XPRoomSendTextView showTextView:self.superview.superview delegate:self.delegate atUid:nil atNick:nil];
} else {
self.inputTextView = [XPRoomSendTextView showTextView:self.superview delegate:self.delegate atUid:nil atNick:nil];
}
}
break;
case XPRoomMenuItemType_Mic: {
[self showMicControlMenu];
}
break;
case XPRoomMenuItemType_Voice: {
[RtcManager instance].remoteMuted = !self.voiceButton.isSelected;
self.voiceButton.selected = [RtcManager instance].isRemoteMuted;
}
break;
case XPRoomMenuItemType_Face: {
XPRoomFaceViewController * faceVC = [[XPRoomFaceViewController alloc] init];
faceVC.modalPresentationStyle = UIModalPresentationOverFullScreen;
faceVC.roomId = [NSString stringWithFormat:@"%ld", self.delegate.getRoomInfo.roomId];
[self.delegate.getCurrentNav presentViewController:faceVC animated:YES completion:nil];
}
break;
case XPRoomMenuItemType_Gift: {
NSString * roomUid = [NSString stringWithFormat:@"%ld", [self.delegate getRoomInfo].uid];
XPSendGiftView * giftView = [[XPSendGiftView alloc] initWithType:SendGiftType_Room uid:roomUid];
giftView.delegate = self.delegate;
giftView.freeModel = self.freeModel;
NSArray * giftUses = [self configGiftUsers:[self.delegate getMicroQueue]];
[giftView configGiftUsers:giftUses];
[self.delegate.getCurrentNav presentViewController:giftView animated:YES completion:nil];
}
break;
case XPRoomMenuItemType_Message:
{
UIViewController * controller = (UIViewController *)self.delegate;
XPRoomHalfMessageView *halfMessageView = [[XPRoomHalfMessageView alloc] initWithFrame:CGRectMake(0, KScreenHeight, KScreenWidth, KScreenHeight) controller:controller];
[controller.view addSubview:halfMessageView];
[UIView animateWithDuration:.35 animations:^{
CGRect rect = halfMessageView.frame;
rect.origin.y = 0;
halfMessageView.frame = rect;
}];
}
break;
case XPRoomMenuItemType_More: {
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"XP didTapForNewFunction"];
[self.moreButton setImage:[UIImage imageNamed:@"room_menu_more"] forState:UIControlStateNormal];
XPRoomMoreMenuViewController * moreMenuVC = [[XPRoomMoreMenuViewController alloc] initWithDelegate:self.delegate isUserOnMic:self.isOnMic];
[self.delegate.getCurrentNav presentViewController:moreMenuVC animated:YES completion:nil];
}
break;
case XPRoomMenuItemType_ArrangeMic:{
if (self.delegate.getRoomInfo.roomModeType == RoomModeType_Open_PK_Mode && self.delegate.isRoomPKPlaying) {
[XNDJTDDLoadingTool showErrorWithMessage:YMLocalizedString(@"XPRoomMenuContainerView1")];
return;
}
self.arrangeMicButton.selected = NO;
NIMChatroomMembersByIdsRequest *request = [[NIMChatroomMembersByIdsRequest alloc]init];
request.roomId = [NSString stringWithFormat:@"%ld", self.delegate.getRoomInfo.roomId];
request.userIds = @[[AccountInfoStorage instance].getUid];
[[NIMSDK sharedSDK].chatroomManager fetchChatroomMembersByIds:request completion:^(NSError * _Nullable error, NSArray<NIMChatroomMember *> * _Nullable members) {
NIMChatroomMember * member;
if (error == nil) {
member = members.firstObject;
}
RoomInfoModel * roomInfo = self.delegate.getRoomInfo;
XPArrangeMicInfoModel * info = [[XPArrangeMicInfoModel alloc] init];
info.roomUid = [NSString stringWithFormat:@"%ld", roomInfo.uid];
info.roomId = [NSString stringWithFormat:@"%ld", roomInfo.roomId];
info.nick = roomInfo.nick;
info.roomAvatar = roomInfo.avatar;
info.roomTitle = roomInfo.title;
info.micQueue = [self.delegate getMicroQueue];
info.isManager = (member.type == NIMChatroomMemberTypeCreator || member.type == NIMChatroomMemberTypeManager);
info.type = roomInfo.roomModeType == RoomModeType_Open_Blind ? ArrangeMicType_Dating : roomInfo.roomModeType == RoomModeType_Open_PK_Mode ? ArrangeMicType_Room_PK : ArrangeMicType_Normal;
info.roomType = roomInfo.type;
XPArrangeMicViewController * arrangeMicVC = [[XPArrangeMicViewController alloc] initWithInfo:info];
[self.delegate.getCurrentNav presentViewController:arrangeMicVC animated:YES completion:nil];
}];
}
break;
case XPRoomMenuItemType_Noble: {
// VIPCenterViewController * nobleVC = [[VIPCenterViewController alloc] initWithRoomUid:self.delegate.getRoomInfo.uid];
// [self.delegate.getCurrentNav pushViewController:nobleVC animated:YES];
XPWebViewController * webVC =[[XPWebViewController alloc] initWithRoomUID:@(self.delegate.getRoomInfo.uid).stringValue];
webVC.url = URLWithType(kVIP);
[self.delegate.getCurrentNav pushViewController:webVC animated:YES];
}
break;
case MSRoomMenuItemType_BAISHUN_GAME:
{
MSRoomMenuGameVC *vc = [[MSRoomMenuGameVC alloc]initWithDelegate:self.delegate roomMenuType:MSRoomMenuTypeLittleGame];
vc.modalPresentationStyle = UIModalPresentationOverFullScreen;
[self.delegate.getCurrentNav presentViewController:vc animated:YES completion:nil];
break;
}
case XPRoomMenuItemType_PK:
{
MSRoomMenuGameVC *vc = [[MSRoomMenuGameVC alloc] initWithDelegate:self.delegate roomMenuType:MSRoomMenuTypePK];
vc.modalPresentationStyle = UIModalPresentationOverFullScreen;
[self.delegate.getCurrentNav presentViewController:vc animated:YES completion:nil];
break;
}
default:
break;
}
}
- (void)showMicControlMenu {
if (self.isDisplayMicStatusControl) {
[self hideMicControlMenu];
return;
} else {
if (!self.closeMicControlButton.superview) {
[self.stackView insertSubview:self.closeMicControlButton atIndex:0];
[self.closeMicControlButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.stackView);
}];
}
self.isDisplayMicStatusControl = YES;
}
self.defaultVoiceVolume = [[RtcManager instance] loadUserSound] > 0 ? [[RtcManager instance] loadUserSound] : 50;
@kWeakify(self);
[self _micControlButton:self.micButton_open isShow:YES complete:^{
@kStrongify(self);
@kWeakify(self);
[self _micControlButton:self.micButton_close_all isShow:YES complete:^{
@kStrongify(self);
[self _micControlButton:self.micButton_close_butMusic isShow:YES complete:^{
if (self.updateHeight) {
self.updateHeight(KScreenWidth);
}
}];
}];
}];
}
- (void)hideMicControlMenu {
self.isDisplayMicStatusControl = NO;
[self.closeMicControlButton removeFromSuperview];
@kWeakify(self);
[self _micControlButton:self.micButton_close_butMusic isShow:NO complete:^{
@kStrongify(self);
@kWeakify(self);
[self _micControlButton:self.micButton_close_all isShow:NO complete:^{
@kStrongify(self);
[self _micControlButton:self.micButton_open isShow:NO complete:^{
if (self.updateHeight) {
self.updateHeight(52);
}
}];
}];
}];
}
- (void)_micControlButton:(UIButton *)button
isShow:(BOOL)isShow
complete:(void(^)(void))complete {
[UIView animateWithDuration:0.05 animations:^{
button.alpha = isShow ? 1 : 0;
} completion:^(BOOL finished) {
if (complete) {
complete();
}
}];
}
- (void)handleMicControl:(UIButton *)sender {
NSString *message = @"";
switch (sender.tag) {
case 1: {
message = YMLocalizedString(@"RoomMicState_0");
self.defaultVoiceVolume = [[RtcManager instance] loadUserSound];
[RtcManager instance].localMuted = NO;
[[RtcManager instance] updateUserSound:(int)self.defaultVoiceVolume];
for (MicroQueueModel *sequence in [self.delegate getMicroQueue].allValues) {
if ([AccountInfoStorage instance].getUid.integerValue == sequence.userInfo.uid) {
[[RtcManager instance] broadcast:YES];
}
}
}
break;
case 2: {
message = YMLocalizedString(@"RoomMicState_2");
[RtcManager instance].localMuted = YES;
}
break;
case 3: {
message = YMLocalizedString(@"RoomMicState_1");
[RtcManager instance].localMuted = NO;
[[RtcManager instance] updateUserSoundWithUserInMic:0];
}
break;
default:
break;
}
[self micButtonUpdate:sender.tag];
[self hideMicControlMenu];
[XNDJTDDLoadingTool showErrorWithMessage:message];
[[XPSkillCardPlayerManager shareInstance] setMicState:sender.tag];
}
- (void)micButtonUpdate:(NSInteger)type {
switch (type) {
case MICState_Open:
// 开麦
[self.micButton setImage:kImage(@"room_menu_mic_open") forState:UIControlStateNormal];
break;
case MICState_Close:
// 闭麦
[self.micButton setImage:kImage(@"room_menu_mic_close") forState:UIControlStateNormal];
break;
case MICState_Music:
// 人声降为 0
[self.micButton setImage:kImage(@"room_menu_mic_close_but_music") forState:UIControlStateNormal];
break;
default:
break;
}
}
- (void)recheckMicState {
if ([XPSkillCardPlayerManager shareInstance].micState == MICState_Music) {
[RtcManager instance].localMuted = NO;
[[RtcManager instance] updateUserSoundWithUserInMic:0];
[self micButtonUpdate:MICState_Music];
}
}
#pragma mark - notification
- (void)showGiftView:(NSNotification *)noti {
NSDictionary *dict = noti.object;
NSString *giftId = dict[@"giftId"];
NSString * roomUid = [NSString stringWithFormat:@"%ld", [self.delegate getRoomInfo].uid];
XPSendGiftView * giftView = [[XPSendGiftView alloc] initWithType:SendGiftType_Room uid:roomUid];
giftView.delegate = self.delegate;
NSArray * giftUses = [self configGiftUsers:[self.delegate getMicroQueue]];
[giftView configGiftUsers:giftUses];
giftView.selectGiftId = giftId;
[self.delegate.getCurrentNav presentViewController:giftView animated:YES completion:nil];
}
#pragma mark - Private Method
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
// 允许 subButton 响应点击事件
UIView *hitView = [super hitTest:point withEvent:event];
if (hitView == self) {
// 如果点击的是 parentView 的空白区域,返回 nil允许事件透传到下层
return nil;
}
// 否则返回点击的子视图(如 subButton
return hitView;
}
- (void)initSubViews {
[self setExclusiveTouch:YES];
[self addSubview:self.stackView];
[self.stackView mas_makeConstraints:^(MASConstraintMaker *make) {
make.bottom.mas_equalTo(self).offset(-kSafeAreaBottomHeight);
make.leading.mas_equalTo(self).offset(15);
make.trailing.mas_equalTo(self).offset(-15);
make.top.mas_equalTo(self);
}];
[self.stackView addArrangedSubview:self.inputButton];
// [self.stackView addArrangedSubview:self.faceButton];
[self.stackView addArrangedSubview:self.micButton];
[self.stackView addArrangedSubview:self.voiceButton];
[self.stackView addArrangedSubview:self.arrangeMicButton];
[self.stackView addArrangedSubview:self.messageButton];
[self.stackView addArrangedSubview:self.moreButton];
[self.stackView addArrangedSubview:self.giftButton];
[self.stackView addSubview:self.inputLabel];
[self.stackView addSubview:self.faceButton];
[self.stackView addSubview:self.micButton_open];
[self.stackView addSubview:self.micButton_close_all];
[self.stackView addSubview:self.micButton_close_butMusic];
[self.micButton_open mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.mas_equalTo(self.micButton);
make.bottom.mas_equalTo(self.micButton.mas_top).offset(-10);
make.size.mas_equalTo(self.micButton);
}];
[self.micButton_close_all mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.mas_equalTo(self.micButton);
make.bottom.mas_equalTo(self.micButton_open.mas_top).offset(-10);
make.size.mas_equalTo(self.micButton);
}];
[self.micButton_close_butMusic mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.mas_equalTo(self.micButton);
make.bottom.mas_equalTo(self.micButton_close_all.mas_top).offset(-10);
make.size.mas_equalTo(self.micButton);
}];
}
- (void)initSubViewConstraints {
[self.inputButton mas_makeConstraints:^(MASConstraintMaker *make) {
// make.size.mas_equalTo(CGSizeMake(110, 36));
make.width.mas_greaterThanOrEqualTo(50);
make.height.mas_equalTo(36);
}];
[self.faceButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.mas_equalTo(self.inputButton);
make.trailing.mas_equalTo(self.inputButton).offset(-4);
make.width.height.mas_equalTo(36);
}];
[self.inputLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.mas_equalTo(self.inputButton);
make.leading.mas_equalTo(self.inputButton).offset(8);
make.trailing.mas_equalTo(self.faceButton.mas_leading).offset(-4);
}];
[self.micButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.height.mas_equalTo(36);
}];
[self.voiceButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.height.mas_equalTo(36);
}];
[self.messageButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.height.mas_equalTo(36);
}];
[self.moreButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.height.mas_equalTo(36);
}];
[self.arrangeMicButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.height.mas_equalTo(36);
}];
[self.giftButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(46, 46));
}];
}
- (NSArray<XPGiftUserInfoModel *> *)configGiftUsers:(NSMutableDictionary<NSString *,MicroQueueModel *> *)queue {
NSMutableArray * array = [NSMutableArray array];
for (MicroQueueModel * microModel in queue.allValues) {
if (microModel.userInfo && microModel.userInfo.uid >0) {
UserInfoModel * userInfo = microModel.userInfo;
XPGiftUserInfoModel * userModel = [[XPGiftUserInfoModel alloc] init];
userModel.avatar = userInfo.avatar;
userModel.vipMic = userInfo.vipMic;
userModel.position = [NSString stringWithFormat:@"%d", microModel.microState.position];
userModel.uid = userInfo.uid;
if (self.delegate.getRoomInfo.type == RoomType_Anchor && microModel.microState.position == -1) {///个播房一直为离开模式,不需要添加房主位
continue;
}
[array addObject:userModel];
}
}
if (self.delegate.getRoomInfo.leaveMode) {
RoomInfoModel * roomInfo= self.delegate.getRoomInfo;
XPGiftUserInfoModel * userModel = [[XPGiftUserInfoModel alloc] init];
userModel.avatar = roomInfo.avatar;
userModel.position = @"-1";
userModel.uid = roomInfo.uid;
[array addObject:userModel];
} else if (self.delegate.getRoomInfo.type == RoomType_Anchor) {
RoomInfoModel * roomInfo= self.delegate.getRoomInfo;
BOOL hadContainerOwner = NO;
for (UserInfoModel *userModel in array) {
if (userModel.uid == roomInfo.uid) {
hadContainerOwner = YES;
break;
}
}
if (!hadContainerOwner) {
XPGiftUserInfoModel * userModel = [[XPGiftUserInfoModel alloc] init];
userModel.avatar = roomInfo.avatar;
userModel.position = @"-1";
userModel.uid = roomInfo.uid;
[array addObject:userModel];
}
}
return array;
}
- (MicroQueueModel *)findMySelfMicro:(NSMutableDictionary<NSString *,MicroQueueModel *> *)queue {
NSString * uid = [AccountInfoStorage instance].getUid;
for (MicroQueueModel * microModel in queue.allValues) {
if (microModel.userInfo && microModel.userInfo.uid == uid.integerValue) {
return microModel;
}
}
return nil;
}
- (void)updateMoreRedDotState {
RoomInfoModel * roomInfo = self.delegate.getRoomInfo;
if (roomInfo.uid == [[AccountInfoStorage instance].getUid integerValue] && // 房主
roomInfo.isPermitRoom != PermitRoomType_License && // 普通
(roomInfo.type != RoomType_Anchor && roomInfo.type != RoomType_MiniGame)) { // 非個播 / 非小遊戲
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"XP didTapForNewFunction"]) {
[self.moreButton setImage:[UIImage imageNamed:@"room_menu_more"] forState:UIControlStateNormal];
} else {
[self.moreButton setImage:[UIImage imageNamed:@"room_menu_more_red"] forState:UIControlStateNormal];
}
} else {
[self.moreButton setImage:[UIImage imageNamed:@"room_menu_more"] forState:UIControlStateNormal];
}
}
#pragma mark - RoomGuestDelegate
- (void)onMicroQueueUpdate:(NSMutableDictionary<NSString *,MicroQueueModel *> *)queue {
MicroQueueModel *model = [self findMySelfMicro:queue];
if (model) {
self.isOnMic = YES;
self.micButton.hidden = NO;
if ([RtcManager instance].isLocalMuted) {
[self micButtonUpdate:2];
} else {
[self micButtonUpdate:1];
}
if (model.microState.micState == MicroMicStateType_Open) {
self.micButton.enabled = YES;
[self recheckMicState];
} else {
[[RtcManager instance] setLocalMuted:YES];
[self micButtonUpdate:MICState_None];
self.micButton.enabled = NO;
}
self.micButton.enabled = model.microState.micState == MicroMicStateType_Open;
self.faceButton.hidden = NO;
} else {
self.isOnMic = NO;
self.micButton.hidden = YES;
self.faceButton.hidden = YES;
[self hideMicControlMenu];
}
[self updateMoreRedDotState];
}
- (void)onRoomEntered {
NSInteger unreadCount = [[NIMSDK sharedSDK].conversationManager allUnreadCount];
self.messageButton.selected = unreadCount > 0;
[[RtcManager instance] setLocalMuted:YES];
[self onRoomUpdate];
}
- (void)onRoomMiniEntered {
NSInteger unreadCount = [[NIMSDK sharedSDK].conversationManager allUnreadCount];
self.messageButton.selected = unreadCount > 0;
[self onRoomUpdate];
}
- (void)superAdminLayout {
[self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
[self.stackView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
[self addSubview:self.stackView];
[self.stackView mas_makeConstraints:^(MASConstraintMaker *make) {
make.bottom.mas_equalTo(self).offset(-kSafeAreaBottomHeight);
make.centerX.mas_equalTo(self);
make.top.mas_equalTo(self);
}];
self.stackView.distribution = UIStackViewDistributionFillEqually;
self.stackView.alignment = UIStackViewAlignmentCenter;
[self.stackView addArrangedSubview:self.voiceButton];
[self.stackView addArrangedSubview:self.messageButton];
[self.stackView addArrangedSubview:self.moreButton];
}
- (void)onRoomUpdate {
RoomInfoModel *roomInfo = self.delegate.getRoomInfo;
UserInfoModel *userInfo = self.delegate.getUserInfo;
if (userInfo.platformRole == 1) {
[self superAdminLayout];
return;
}
self.arrangeMicButton.hidden = roomInfo.roomModeType != RoomModeType_Open_Micro_Mode;
if (roomInfo.roomModeType == RoomModeType_Open_Blind || roomInfo.roomModeType == RoomModeType_Open_PK_Mode || roomInfo.roomModeType == RoomModeType_Open_Micro_Mode) {
NIMChatroomMembersByIdsRequest *request = [[NIMChatroomMembersByIdsRequest alloc]init];
request.roomId = [NSString stringWithFormat:@"%ld", roomInfo.roomId];
if([AccountInfoStorage instance].getUid != nil){
request.userIds = @[[AccountInfoStorage instance].getUid];
}
@kWeakify(self);
[[NIMSDK sharedSDK].chatroomManager fetchChatroomMembersByIds:request completion:^(NSError * _Nullable error, NSArray<NIMChatroomMember *> * _Nullable members) {
@kStrongify(self);
if (error == nil) {
NIMChatroomMember * member = members.firstObject;
if (member.type == NIMChatroomMemberTypeCreator || member.type == NIMChatroomMemberTypeManager) {
self.arrangeMicButton.hidden = NO;
return;
}
}
self.arrangeMicButton.hidden = YES;
}];
}
[self updateMoreRedDotState];
}
- (void)handleNIMCustomMessage:(NIMMessage *)message {
NIMCustomObject *obj = (NIMCustomObject *)message.messageObject;
if (obj.attachment != nil && [obj.attachment isKindOfClass:[AttachmentModel class]]) {
AttachmentModel *attachment = (AttachmentModel *)obj.attachment;
switch (attachment.first) {
case CustomMessageType_Arrange_Mic: {
if (attachment.first == CustomMessageType_Room_PK) {
if (attachment.second == Custom_Message_Sub_Arrange_Mic_Non_Empty || attachment.second == Custom_Message_Sub_Arrange_Mic_Empty || attachment.second == Custom_Message_Sub_Room_PK_Empty || attachment.second == Custom_Message_Sub_Room_PK_Non_Empty) {
NIMChatroomMembersByIdsRequest *request = [[NIMChatroomMembersByIdsRequest alloc]init];
request.roomId = [NSString stringWithFormat:@"%ld", self.delegate.getRoomInfo.roomId];
request.userIds = @[[AccountInfoStorage instance].getUid];
@kWeakify(self);
[[NIMSDK sharedSDK].chatroomManager fetchChatroomMembersByIds:request completion:^(NSError * _Nullable error, NSArray<NIMChatroomMember *> * _Nullable members) {
@kStrongify(self);
NIMChatroomMember * member;
if (error == nil) {
member = members.firstObject;
}
if (member.type == NIMChatroomMemberTypeCreator || member.type == NIMChatroomMemberTypeManager) {
self.arrangeMicButton.selected = (attachment.second == Custom_Message_Sub_Arrange_Mic_Non_Empty || attachment.second == Custom_Message_Sub_Room_PK_Non_Empty);
};
}];
}
}
}
break;
default:
break;
}
}
[self updateMoreRedDotState];
}
- (void)handleNIMNotificationMessage:(NIMMessage *)message {
NIMNotificationObject *notiMsg = (NIMNotificationObject *)message.messageObject;
NIMChatroomNotificationContent *content = (NIMChatroomNotificationContent *)notiMsg.content;
switch (content.eventType) {
case NIMChatroomEventTypeAddManager:
{
if (self.delegate.getRoomInfo.roomModeType == RoomModeType_Open_Blind || self.delegate.getRoomInfo.roomModeType == RoomModeType_Open_PK_Mode) {
for (NIMChatroomNotificationMember * member in content.targets) {
if (member.userId.intValue == [AccountInfoStorage instance].getUid.integerValue) {
self.arrangeMicButton.hidden = NO;
break;
}
}
}
}
break;
case NIMChatroomEventTypeRemoveManager:
{
if (self.delegate.getRoomInfo.roomModeType == RoomModeType_Open_Blind || self.delegate.getRoomInfo.roomModeType == RoomModeType_Open_PK_Mode) {
for (NIMChatroomNotificationMember * member in content.targets) {
if (member.userId.intValue == [AccountInfoStorage instance].getUid.integerValue) {
self.arrangeMicButton.hidden = YES;
break;
}
}
}
}
break;
default:
break;
}
}
- (void)addNIMRecentSession:(NIMRecentSession *)session {
if (!self.miniMessageView.superview) {
[self.superview insertSubview:self.miniMessageView aboveSubview:self];
[self.miniMessageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.mas_equalTo(self.messageButton);
make.bottom.mas_equalTo(self.messageButton.mas_top).offset(-2);
make.size.mas_equalTo(CGSizeMake(87, 55));
}];
}
[self.miniMessageView addRecentSession:session];
NSInteger unreadCount = [[NIMSDK sharedSDK].conversationManager allUnreadCount];
self.messageButton.selected = unreadCount > 0;
}
- (void)removeNIMRecentSession:(NIMRecentSession *)session {
NSInteger unreadCount = [[NIMSDK sharedSDK].conversationManager allUnreadCount];
self.messageButton.selected = unreadCount > 0;
}
#pragma mark - XPRoomMessageBubbleViewDelegate
- (void)xPRoomMessageBubbleView:(XPRoomMessageBubbleView *)view didSelectSession:(NIMRecentSession *)session {
UIViewController * controller = (UIViewController *)self.delegate;
XPRoomHalfMessageView *halfMessageView = [[XPRoomHalfMessageView alloc] initWithFrame:CGRectMake(0, KScreenHeight, KScreenWidth, KScreenHeight) controller:controller];
halfMessageView.chatUserId = session.session.sessionId;
[controller.view addSubview:halfMessageView];
[UIView animateWithDuration:.35 animations:^{
CGRect rect = halfMessageView.frame;
rect.origin.y = 0;
halfMessageView.frame = rect;
}];
}
#pragma mark - Getters And Setters
- (UIButton *)inputButton {
if (!_inputButton) {
_inputButton = [UIButton buttonWithType:UIButtonTypeCustom];
// [_inputButton setTitle:YMLocalizedString(@"XPRoomMenuContainerView2") forState:UIControlStateNormal];
// [_inputButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
// _inputButton.titleLabel.font = [UIFont systemFontOfSize:13 weight:UIFontWeightMedium];
// _inputButton.titleLabel.numberOfLines = 2;
_inputButton.layer.masksToBounds = YES;
_inputButton.layer.cornerRadius = 18;
if (isMSRTL()) {
_inputButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;
} else {
_inputButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
}
// 设置标题的边距
_inputButton.titleEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);
_inputButton.backgroundColor = [UIColor colorWithWhite:0 alpha:0.4];
_inputButton.tag = XPRoomMenuItemType_Input;
[_inputButton addTarget:self action:@selector(menuButtonAction:) forControlEvents:UIControlEventTouchUpInside];
}
return _inputButton;
}
- (UILabel *)inputLabel {
if (!_inputLabel) {
_inputLabel = [UILabel labelInitWithText:YMLocalizedString(@"XPRoomMenuContainerView2")
font:kFontMedium(13)
textColor:[UIColor whiteColor]];
_inputLabel.adjustsFontSizeToFitWidth = YES;
_inputLabel.minimumScaleFactor = 0.7;
_inputLabel.numberOfLines = 2;
}
return _inputLabel;
}
- (UIButton *)micButton {
if (!_micButton) {
_micButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_micButton setImage:[UIImage imageNamed:@"room_menu_mic_open"] forState:UIControlStateNormal];
_micButton.tag = XPRoomMenuItemType_Mic;
[_micButton addTarget:self action:@selector(menuButtonAction:) forControlEvents:UIControlEventTouchUpInside];
_micButton.hidden = YES;
}
return _micButton;
}
- (UIButton *)micButton_open {
if (!_micButton_open) {
_micButton_open = [UIButton buttonWithType:UIButtonTypeCustom];
[_micButton_open setImage:[UIImage imageNamed:@"room_menu_mic_open"] forState:UIControlStateNormal];
_micButton_open.tag = 1;
[_micButton_open addTarget:self action:@selector(handleMicControl:) forControlEvents:UIControlEventTouchUpInside];
_micButton_open.alpha = 0;
}
return _micButton_open;
}
- (UIButton *)micButton_close_all {
if (!_micButton_close_all) {
_micButton_close_all = [UIButton buttonWithType:UIButtonTypeCustom];
[_micButton_close_all setImage:[UIImage imageNamed:@"room_menu_mic_close"] forState:UIControlStateNormal];
_micButton_close_all.tag = 2;
[_micButton_close_all addTarget:self action:@selector(handleMicControl:) forControlEvents:UIControlEventTouchUpInside];
_micButton_close_all.alpha = 0;
}
return _micButton_close_all;
}
- (UIButton *)micButton_close_butMusic {
if (!_micButton_close_butMusic) {
_micButton_close_butMusic = [UIButton buttonWithType:UIButtonTypeCustom];
[_micButton_close_butMusic setImage:[UIImage imageNamed:@"room_menu_mic_close_but_music"] forState:UIControlStateNormal];
_micButton_close_butMusic.tag = 3;
[_micButton_close_butMusic addTarget:self action:@selector(handleMicControl:) forControlEvents:UIControlEventTouchUpInside];
_micButton_close_butMusic.alpha = 0;
}
return _micButton_close_butMusic;
}
- (UIButton *)voiceButton {
if (!_voiceButton) {
_voiceButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_voiceButton setImage:[UIImage imageNamed:@"room_menu_voice_open"] forState:UIControlStateNormal];
[_voiceButton setImage:[UIImage imageNamed:@"room_menu_voice_close"] forState:UIControlStateSelected];
_voiceButton.tag = XPRoomMenuItemType_Voice;
[_voiceButton addTarget:self action:@selector(menuButtonAction:) forControlEvents:UIControlEventTouchUpInside];
}
return _voiceButton;
}
- (UIButton *)faceButton {
if (!_faceButton) {
_faceButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_faceButton setImage:[UIImage imageNamed:@"room_menu_face"] forState:UIControlStateNormal];
[_faceButton setImage:[UIImage imageNamed:@"room_menu_face"] forState:UIControlStateSelected];
_faceButton.tag = XPRoomMenuItemType_Face;
[_faceButton addTarget:self action:@selector(menuButtonAction:) forControlEvents:UIControlEventTouchUpInside];
_faceButton.hidden = YES;
}
return _faceButton;
}
- (UIButton *)messageButton {
if (!_messageButton) {
_messageButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_messageButton setImage:[UIImage imageNamed:@"room_menu_message"] forState:UIControlStateNormal];
[_messageButton setImage:[UIImage imageNamed:@"room_menu_new_message"] forState:UIControlStateSelected];
_messageButton.tag = XPRoomMenuItemType_Message;
[_messageButton addTarget:self action:@selector(menuButtonAction:) forControlEvents:UIControlEventTouchUpInside];
}
return _messageButton;
}
- (UIButton *)moreButton {
if (!_moreButton) {
_moreButton = [UIButton buttonWithType:UIButtonTypeCustom];
_moreButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
_moreButton.tag = XPRoomMenuItemType_More;
[_moreButton setImage:[UIImage imageNamed:@"room_menu_more"] forState:UIControlStateNormal];
[_moreButton addTarget:self action:@selector(menuButtonAction:) forControlEvents:UIControlEventTouchUpInside];
}
return _moreButton;
}
- (UIButton *)giftButton {
if (!_giftButton) {
_giftButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_giftButton setImage:kImage(@"big_gift_button") forState:UIControlStateNormal];
_giftButton.tag = XPRoomMenuItemType_Gift;
[_giftButton addTarget:self action:@selector(menuButtonAction:) forControlEvents:UIControlEventTouchUpInside];
}
return _giftButton;
}
- (UIStackView *)stackView {
if (!_stackView) {
_stackView = [[UIStackView alloc] init];
_stackView.spacing = 9;
_stackView.clipsToBounds = NO;
_stackView.alignment = UIStackViewAlignmentBottom;
_stackView.userInteractionEnabled = YES;
}
return _stackView;
}
- (UIButton *)arrangeMicButton {
if (!_arrangeMicButton) {
_arrangeMicButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_arrangeMicButton setImage:kImage(@"room_menu_arrange_mic") forState:UIControlStateNormal];
[_arrangeMicButton setImage:kImage(@"room_menu_arrange_mic_new") forState:UIControlStateSelected];
_arrangeMicButton.tag = XPRoomMenuItemType_ArrangeMic;
[_arrangeMicButton addTarget:self action:@selector(menuButtonAction:) forControlEvents:UIControlEventTouchUpInside];
_arrangeMicButton.hidden = YES;
}
return _arrangeMicButton;
}
- (XPRoomMessageBubbleView *)miniMessageView {
if (!_miniMessageView) {
_miniMessageView = [[XPRoomMessageBubbleView alloc] init];
_miniMessageView.delegate = self;
}
return _miniMessageView;
}
- (UIButton *)closeMicControlButton {
if (!_closeMicControlButton) {
_closeMicControlButton = [UIButton buttonWithType:UIButtonTypeCustom];
// _closeMicControlButton.backgroundColor = [UIColor colorWithWhite:1 alpha:0.5];
[_closeMicControlButton addTarget:self action:@selector(hideMicControlMenu) forControlEvents:UIControlEventTouchUpInside];
}
return _closeMicControlButton;
}
@end