874 lines
36 KiB
Objective-C
874 lines
36 KiB
Objective-C
//
|
||
// 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 "StatisticsServiceHelper.h"
|
||
#import "XCCurrentVCStackManager.h"
|
||
#import "UIImage+Utils.h"
|
||
///Model
|
||
#import "XPRoomMenuItem.h"
|
||
#import "MicroQueueModel.h"
|
||
#import "UserInfoModel.h"
|
||
#import "MicroStateModel.h"
|
||
#import "RoomInfoModel.h"
|
||
#import "AttachmentModel.h"
|
||
#import "GuildSuperAdminInfoModel.h"
|
||
///View
|
||
#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) 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;
|
||
/// PK 入口
|
||
@property (nonatomic,strong) UIButton *pkButton;
|
||
///礼物
|
||
@property (nonatomic,strong) UIButton *giftButton;
|
||
///排麦
|
||
@property (nonatomic,strong) UIButton *arrangeMicButton;
|
||
|
||
///游戏、活动
|
||
@property(nonatomic,strong) UIButton *baiShunGameButton;
|
||
|
||
///输入框
|
||
@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;
|
||
|
||
@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];
|
||
[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;
|
||
XPArrangeMicViewController * arrangeMicVC = [[XPArrangeMicViewController alloc] initWithInfo:info];
|
||
[self.delegate.getCurrentNav presentViewController:arrangeMicVC animated:YES completion:nil];
|
||
}];
|
||
}
|
||
break;
|
||
case XPRoomMenuItemType_Noble: {
|
||
[StatisticsServiceHelper trackEventWithKey:StatisticsServiceEventvipEntranceRoomClick];
|
||
VIPCenterViewController * nobleVC = [[VIPCenterViewController alloc] initWithRoomUid:self.delegate.getRoomInfo.uid];
|
||
[self.delegate.getCurrentNav pushViewController:nobleVC 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 {
|
||
self.isDisplayMicStatusControl = YES;
|
||
}
|
||
self.defaultVoiceVolume = [[RtcManager instance] loadUserSound] > 0 ? [[RtcManager instance] loadUserSound] : 50;
|
||
|
||
if (self.updateHeight) {
|
||
self.updateHeight(180);
|
||
}
|
||
@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:nil];
|
||
}];
|
||
}];
|
||
}
|
||
|
||
- (void)hideMicControlMenu {
|
||
self.isDisplayMicStatusControl = NO;
|
||
|
||
if (self.updateHeight) {
|
||
self.updateHeight(52);
|
||
}
|
||
@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:nil];
|
||
}];
|
||
}];
|
||
}
|
||
|
||
- (void)_micControlButton:(UIButton *)button
|
||
isShow:(BOOL)isShow
|
||
complete:(void(^)(void))complete {
|
||
[UIView animateWithDuration:0.1 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.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.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));
|
||
}];
|
||
|
||
[self.faceButton mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.centerY.mas_equalTo(self.inputButton);
|
||
make.trailing.mas_equalTo(self.inputButton).offset(-7);
|
||
make.width.height.mas_equalTo(22);
|
||
}];
|
||
|
||
[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.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.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.micButton.hidden = YES;
|
||
self.faceButton.hidden = YES;
|
||
}
|
||
|
||
[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)onRoomUpdate {
|
||
RoomInfoModel * roomInfo = self.delegate.getRoomInfo;
|
||
|
||
// MARK: 房主 or 超管可以看到按钮
|
||
self.baiShunGameButton.hidden = YES;
|
||
self.pkButton.hidden = YES;
|
||
if ([AccountInfoStorage instance].getUid.integerValue == roomInfo.uid) {
|
||
self.baiShunGameButton.hidden = NO;
|
||
self.pkButton.hidden = roomInfo.type == RoomType_Anchor;
|
||
} else {
|
||
for (GuildSuperAdminInfoModel *managerInfo in self.delegate.getRoomSuperAdminList) {
|
||
if ([managerInfo.uid isEqualToString:[AccountInfoStorage instance].getUid]) {
|
||
self.baiShunGameButton.hidden = NO;
|
||
self.pkButton.hidden = NO;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
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;
|
||
if (attachment.first == CustomMessageType_Arrange_Mic || 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);
|
||
};
|
||
}];
|
||
}
|
||
}
|
||
}
|
||
|
||
[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;
|
||
}
|
||
|
||
- (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 *)pkButton {
|
||
if (!_pkButton) {
|
||
_pkButton = [UIButton buttonWithType:UIButtonTypeCustom];
|
||
_pkButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
|
||
_pkButton.tag = XPRoomMenuItemType_PK;
|
||
[_pkButton setImage:[UIImage imageNamed:@"ms_room_menu_game"] forState:UIControlStateNormal];
|
||
[_pkButton addTarget:self action:@selector(menuButtonAction:) forControlEvents:UIControlEventTouchUpInside];
|
||
}
|
||
return _pkButton;
|
||
}
|
||
|
||
|
||
- (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;
|
||
}
|
||
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 *)baiShunGameButton{
|
||
if(!_baiShunGameButton){
|
||
_baiShunGameButton = [UIButton new];
|
||
[_baiShunGameButton setImage:[UIImage imageNamed:@"room_menu_play"] forState:UIControlStateNormal];
|
||
[_baiShunGameButton setImage:[UIImage imageNamed:@"room_menu_play"] forState:UIControlStateSelected];
|
||
_baiShunGameButton.tag = MSRoomMenuItemType_BAISHUN_GAME;
|
||
[_baiShunGameButton addTarget:self action:@selector(menuButtonAction:) forControlEvents:UIControlEventTouchUpInside];
|
||
}
|
||
return _baiShunGameButton;
|
||
}
|
||
@end
|