// // SessionViewController.m // xplan-ios // // Created by zu on 2021/11/28. // #import "SessionViewController.h" #import #import #import #import ///Tool #import "XCCurrentVCStackManager.h" #import "NIMMessageMaker.h" #import "XPMacro.h" #import "UITableView+NIMScrollToBottom.h" #import "ThemeColor.h" #import "NSArray+Safe.h" #import "ClientConfig.h" #import "Api.h" #import "Api+Mine.h" ///Model #import "RoomInfoModel.h" #import "UserInfoModel.h" #import "MessageMenuModel.h" #import "SessionRiskCache.h" #import "UserGameInfoVo.h" #import "AttachmentModel.h" #import "WalletInfoModel.h" ///View #import "XPSessionMessageHeadView.h" #import "XPMineUserInfoViewController.h" #import "XPRoomViewController.h" #import "RoomHostDelegate.h" #import "SessionToolbarView.h" #import "MessageCell.h" #import "SessionChatLimitView.h" #import "XPSendGiftView.h" #import "SessionNavView.h" #import "SessionInfoViewController.h" #import "SessionRiskView.h" #import "XPMineGameOrderDetailsView.h" ///P #import "MessagePresenter.h" #import "MessageProtocol.h" #import "XPSessionMessageGameCell.h" #import "XPSessionMessageGamePageControl.h" #import "XPMinePlaceOrderView.h" #import "XPSessionMessageGameInfoView.h" #import "XPMineNewRechargeViewController.h" @interface SessionViewController () @property (nonatomic, strong) NIMSession * session; @property (nonatomic, strong) NSMutableArray * messages; ///导航栏 @property (nonatomic,strong) SessionNavView *sessionNavView; @property (nonatomic, strong) UITableView * sessionTableView; ///跟随进房卡片 @property (nonatomic, assign) BOOL isShowfollowInRoomView; @property (nonatomic, strong) UserInfoModel *userInfo; ///输入框 @property (nonatomic,strong) SessionToolbarView *toolbarView; ///最后的一条消息 @property (nonatomic,strong) NIMMessage *lastMessage; ///私聊风险提示 @property (nonatomic,strong) SessionRiskView *riskAlertView; ///游戏点单轮播 @property(nonatomic,strong) UICollectionView *collectionView; @property(nonatomic,strong) XPSessionMessageGamePageControl *pageControl; @property (nonatomic, strong) UIStackView *stackView; ///余额 @property(nonatomic, copy)NSString *diamonds; @property(nonatomic,strong) NSMutableArray *gameArray; @end @implementation SessionViewController - (BOOL)isHiddenNavBar { return YES; } - (void)dealloc { [[NIMSDK sharedSDK].chatManager removeDelegate:self]; [[NIMSDK sharedSDK].conversationManager removeDelegate:self]; [[NIMSDK sharedSDK].mediaManager removeDelegate:self]; [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (MessagePresenter *)createPresenter { return [[MessagePresenter alloc] init]; } - (instancetype)initWithSession:(NIMSession *)session { self = [super init]; if (self) { _session = session; } return self; } - (void)viewDidLoad { [super viewDidLoad]; [self initViews]; [self initLayout]; [IQKeyboardManager sharedManager].enable = NO; [IQKeyboardManager sharedManager].enableAutoToolbar = NO; [self initHeaderAndFooterRrfresh]; [[NIMSDK sharedSDK].chatManager addDelegate:self]; [[NIMSDK sharedSDK].conversationManager addDelegate:self]; [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(getAttentionUserNotification) name:@"kAttentionUserNotification" object:nil]; } -(void)getAttentionUserNotification{ [self.presenter getChatLimitReceiverUid:self.session.sessionId]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.presenter getFansLike:self.session.sessionId]; self.sessionNavView.userId = self.session.sessionId; } - (void)initHeaderAndFooterRrfresh { MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(headerRefresh)]; header.stateLabel.font = [UIFont systemFontOfSize:10.0]; header.lastUpdatedTimeLabel.font = [UIFont systemFontOfSize:10.0]; header.stateLabel.textColor = [ThemeColor secondTextColor]; header.lastUpdatedTimeLabel.textColor = [ThemeColor secondTextColor]; self.sessionTableView.mj_header = header; [self headerRefresh]; [self initData]; } - (void)headerRefresh { if (self.messages.count > 0) { [[[NIMSDK sharedSDK] conversationManager] messagesInSession:self.session message:self.messages.firstObject limit:20 completion:^(NSError * _Nullable error, NSArray * _Nullable messages) { [self.sessionTableView.mj_header endRefreshing]; if (error == nil && messages.count > 0) { for (int i = ((int)messages.count -1); i > 0; i--) { NIMMessage * message = [messages safeObjectAtIndex1:i]; [self.messages insertObject:message atIndex:0]; } } [self.sessionTableView reloadData]; }]; } else { [[[NIMSDK sharedSDK] conversationManager] messagesInSession:self.session message:nil limit:20 completion:^(NSError * _Nullable error, NSArray * _Nullable messages) { [self.sessionTableView.mj_header endRefreshing]; if (error == nil) { [self.messages addObjectsFromArray:messages]; } [self.sessionTableView reloadData]; [self.sessionTableView nim_scrollToBottom:NO]; }]; } } - (UINavigationController *)getKeyWindowNav { if ([XCCurrentVCStackManager shareManager].getCurrentVC) { return [XCCurrentVCStackManager shareManager].getCurrentVC.navigationController; } return self.navigationController; } #pragma mark - Private Method - (void)initViews { self.sessionNavView.isInRoom = self.openType == SessionListOpenTypeRoom; [self.view addSubview:self.sessionNavView]; [self.view addSubview:self.stackView]; [self.stackView addArrangedSubview:self.riskAlertView]; [self.view addSubview:self.sessionTableView]; [self.view addSubview:self.toolbarView]; if (self.openType != SessionListOpenTypeRoom) { [self.stackView addArrangedSubview:self.collectionView]; [self.stackView addArrangedSubview:self.pageControl]; } } - (void)initLayout { [self.sessionNavView mas_makeConstraints:^(MASConstraintMaker *make) { make.height.mas_equalTo(self.openType == SessionListOpenTypeRoom ? 44 : kNavigationHeight); make.left.top.right.mas_equalTo(self.view); }]; [self.stackView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.equalTo(self.view); make.top.equalTo(self.self.sessionNavView.mas_bottom); }]; [self.riskAlertView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.mas_equalTo(self.view); make.height.mas_equalTo(20); }]; [self.sessionTableView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.mas_equalTo(self.view); make.top.mas_equalTo(self.stackView.mas_bottom).mas_offset(10); make.bottom.mas_equalTo(self.toolbarView.mas_top); }]; [self.toolbarView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.mas_equalTo(self.view); make.bottom.mas_equalTo(self.view); }]; if (self.openType != SessionListOpenTypeRoom) { [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.mas_equalTo(self.view); make.height.mas_equalTo(kGetScaleWidth(76)); }]; [self.pageControl mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.mas_equalTo(self.view); make.height.mas_equalTo(kGetScaleWidth(4)); }]; } } - (void)viewDidLayoutSubviews{ if (self.openType == SessionListOpenTypeRoom) { self.view.frame = CGRectMake(0, 0, KScreenWidth, kHalfScreenHeight); } } - (void)initData { NIMUser * user = [[NIMSDK sharedSDK].userManager userInfo:self.session.sessionId]; if (user) { self.sessionNavView.title = user.userInfo.nickName; } else { self.sessionNavView.title = @"加载中……"; } [[NIMSDK sharedSDK].conversationManager markAllMessagesReadInSession:self.session]; [self.presenter getChatLimitReceiverUid:self.session.sessionId]; [self.presenter getUserInfo:self.session.sessionId]; self.sessionNavView.userId = self.session.sessionId; [self getUserWallet]; } -(void)getUserWallet{ [Api getUserWalletInfo:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { if(code == 200){ WalletInfoModel * model = [WalletInfoModel modelWithDictionary:data.data]; self.diamonds = model.diamonds; } } uid:[AccountInfoStorage instance].getUid ticket:[AccountInfoStorage instance].getTicket]; } - (BOOL)isExistMessages:(NIMMessage *)message{ BOOL isExist = NO; NIMMessage * model; for (NIMMessage *item in self.messages.reverseObjectEnumerator.allObjects) { if ([item isKindOfClass:[NIMMessage class]] && [item.messageId isEqual:message.messageId]) { model = item; isExist = YES; break; } } if (model) { model = message; } return isExist; } - (BOOL)showChatRiskView:(UserInfoModel *)userInfo { if (userInfo.banAccount) { return YES; } NSString * cacheUid = [[SessionRiskCache shareCache] getCloseChatRiskAlert:self.session.sessionId]; if (cacheUid && [cacheUid isEqualToString:self.session.sessionId]) { return NO; } if ([[NIMSDK sharedSDK].userManager isMyFriend:self.session.sessionId] && !userInfo.banAccount) { return NO; } if ([[ClientConfig shareConfig].configInfo.officialMsgUids containsObject:self.session.sessionId] || [[ClientConfig shareConfig].configInfo.officialAccountUids containsObject:self.session.sessionId]) { return NO; } return YES; } #pragma mark - MessageProtocol -(void)getGamePartnerInfoList:(NSArray *)list{ NSMutableArray *gameTextArray = [NSMutableArray array]; for (UserGameInfoVo *gameInfo in list) { [gameTextArray addObject:gameInfo.gameName]; NSMutableArray *tagList = [NSMutableArray array]; for (UserGameTagInfo *tagInfo in gameInfo.tags) { if([tagInfo.tagName isEqualToString:@"段位"]){ gameInfo.tier = tagInfo.tagVal; }else{ [tagList addObject:tagInfo]; } } gameInfo.tags = tagList; } self.gameArray = [NSMutableArray arrayWithArray:list]; if(self.isShowfollowInRoomView == YES && list.count == 0){ UserGameInfoVo *gameModel = [UserGameInfoVo new]; gameModel.gameName = @"跟随房间"; [self.gameArray addObject:gameModel]; [gameTextArray addObject:gameModel.gameName]; self.collectionView.hidden = NO; [self.collectionView reloadData]; return; } if(gameTextArray.count > 0){ self.collectionView.hidden = NO; self.pageControl.hidden = NO; self.pageControl.pageList = gameTextArray; self.pageControl.curPage = 0; [self.collectionView reloadData]; } } - (void)onGetLimitChat:(ChatLimitModel *)chatLimit { BOOL chatDisabled ; if(chatLimit.model == 2){ chatDisabled = !chatLimit.chat; }else{ chatDisabled = !chatLimit.chat && self.messages.count <= 0; } if (chatDisabled) { SessionChatLimitView *chatLimitView = [[SessionChatLimitView alloc] initWithChatLimit:chatLimit]; self.sessionTableView.tableHeaderView = chatLimitView; } else { self.sessionTableView.tableHeaderView = nil; } self.toolbarView.model = chatLimit.model; self.toolbarView.sendDisabled = chatDisabled; } ///获取用户信息成功 - (void)onGetSessionUserInfoSuccess:(UserInfoModel *)userInfo { _userInfo = userInfo; [self.presenter getGamePartnerInfoListWithUid:@(_userInfo.uid).stringValue]; if (userInfo.nick.length > 0) { self.sessionNavView.title = userInfo.nick; } if (userInfo.roomUid && self.openType != SessionListOpenTypeRoom) { self.isShowfollowInRoomView = YES; self.sessionNavView.isShowLive = YES; if ([self showChatRiskView:userInfo]) { self.riskAlertView.warning = userInfo.banAccount ? @" 温馨提醒:当前对方账号存在异常,请谨慎来往!" : @"温馨提示:对方和您非好友关系,请注意隐私安全!"; self.riskAlertView.hidden = NO; } } else { if ([self showChatRiskView:userInfo]) { self.riskAlertView.warning = userInfo.banAccount ? @" 温馨提醒:当前对方账号存在异常,请谨慎来往!" : @"温馨提示:对方和您非好友关系,请注意隐私安全!"; self.riskAlertView.hidden = NO; } } } - (void)getFansLikeSuccess:(BOOL)isLike { if ([[ClientConfig shareConfig].configInfo.officialMsgUids containsObject:self.session.sessionId] || [[ClientConfig shareConfig].configInfo.officialAccountUids containsObject:self.session.sessionId]) { self.sessionNavView.isLike = YES; } else { self.sessionNavView.isLike = isLike; } } - (void)attentionUserSuccess:(NSString *)uid { if ([uid isEqualToString:self.session.sessionId]) { self.sessionNavView.isLike = YES; } } #pragma mark - MessageCellDelegate - (void)updateMessageSuccess:(NIMMessage *)message { if ([message.session.sessionId isEqualToString:self.session.sessionId]) { [self.sessionTableView reloadData]; } } - (void)didTapAvatar:(NSString *)uid { //过滤官方账号 if ([[ClientConfig shareConfig].configInfo.officialMsgUids containsObject:self.session.sessionId] || [[ClientConfig shareConfig].configInfo.officialAccountUids containsObject:self.session.sessionId]) { return; } if (uid.length > 0) { XPMineUserInfoViewController * infoVC = [[XPMineUserInfoViewController alloc] init]; infoVC.uid = uid.integerValue; [[self getKeyWindowNav] pushViewController:infoVC animated:YES]; } } #pragma mark - UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ return self.gameArray.count; } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{ return CGSizeMake(KScreenWidth, kGetScaleWidth(76));; } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section{ UserGameInfoVo *gameInfo = [self.gameArray safeObjectAtIndex1:0]; if([gameInfo.gameName isEqualToString:@"跟随房间"]){ return CGSizeMake(0, 0); } return CGSizeMake(kGetScaleWidth(102), kGetScaleWidth(76)); } -(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { UICollectionReusableView *reusableView = nil; UserGameInfoVo *gameInfo = [self.gameArray safeObjectAtIndex1:indexPath.row]; if([gameInfo.gameName isEqualToString:@"跟随房间"]){ return reusableView; } if (kind ==UICollectionElementKindSectionFooter){ XPSessionMessageGameInfoView *footerV = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:NSStringFromClass([XPSessionMessageGameInfoView class]) forIndexPath:indexPath]; footerV.headUrl = self.userInfo.avatar; footerV.delegate = self; reusableView = footerV; } return reusableView; } -(__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ XPSessionMessageGameCell *myCell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([XPSessionMessageGameCell class]) forIndexPath:indexPath]; UserGameInfoVo *gameInfo = [self.gameArray safeObjectAtIndex1:indexPath.row]; if([gameInfo.gameName isEqualToString:@"跟随房间"]){ myCell.userInfo = self.userInfo; }else{ myCell.gameInfo = gameInfo; } myCell.delegate = self; return myCell; } -(void)scrollViewDidScroll:(UIScrollView *)scrollView{ if(self.collectionView == scrollView){ CGFloat width = KScreenWidth - kGetScaleWidth(16); int x = (int)(scrollView.contentOffset.x / width); if(x < self.gameArray.count){ self.pageControl.curPage = x; } } } #pragma mark - XPSessionMessageGameInfoView - (void)clicTokMineUserInfo{ XPMineUserInfoViewController * infoVC = [[XPMineUserInfoViewController alloc] init]; infoVC.uid = self.userInfo.uid; [self.getKeyWindowNav pushViewController:infoVC animated:YES]; } #pragma mark - SessionNavViewDelegate - (void)sessionNavView:(SessionNavView *)view didClickLike:(UIButton *)sender { [self.presenter attentionUser:self.session.sessionId]; } - (void)sessionNavView:(SessionNavView *)view didClickBack:(UIButton *)sender { if (self.openType == SessionListOpenTypeRoom) { CATransition *transition = [CATransition animation]; transition.duration = 0.3f; transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; transition.type = kCATransitionPush; transition.subtype = kCATransitionFromLeft; [self.view.superview.layer addAnimation:transition forKey:nil]; [self removeFromParentViewController]; [self.view removeFromSuperview]; return; } [self.navigationController popViewControllerAnimated:YES]; } - (void)sessionNavView:(SessionNavView *)view didClickReport:(UIButton *)sender { SessionInfoViewController * reportVC = [[SessionInfoViewController alloc] init]; reportVC.userId = self.session.sessionId; [self.getKeyWindowNav pushViewController:reportVC animated:YES]; } ///跟随房间 - (void)sessionNavView:(SessionNavView *)view didClickToRoom:(UIButton *)sender{ if(self.userInfo.uid > 0){ if (self.openType != SessionListOpenTypeRoom) { __block BOOL isSameRoom = NO; __block RoomInfoModel *roomModel; [self.getKeyWindowNav.viewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if ([obj isKindOfClass:[XPRoomViewController class]]) { XPRoomViewController * rooomVC = obj; [[self getKeyWindowNav] popToRootViewControllerAnimated:NO]; roomModel = rooomVC.getRoomInfo; if(rooomVC.getRoomInfo.uid == self.userInfo.uid) { isSameRoom = YES; } else { [rooomVC exitRoom]; } *stop = YES; } }]; if (!isSameRoom) { if (roomModel.type == RoomType_MiniGame) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [XPRoomViewController openRoom:@(self.userInfo.uid).stringValue fromNick:self.userInfo.nick fromType:UserEnterRoomFromType_Follow_User fromUid:[NSString stringWithFormat:@"%ld", self.userInfo.uid] viewController:[[XCCurrentVCStackManager shareManager] getCurrentVC]]; }); } else { [XPRoomViewController openRoom:@(self.userInfo.uid).stringValue fromNick:self.userInfo.nick fromType:UserEnterRoomFromType_Follow_User fromUid:[NSString stringWithFormat:@"%ld", self.userInfo.uid] viewController:self]; } } } } } #pragma mark - UITableViewDataSource - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.messages.count; } - (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath { NIMMessage * message = [self.messages safeObjectAtIndex1:indexPath.row]; NSString * identifier = [MessageCell cellContent:message]; ///从复用池中获取所需要的cell MessageCell * cell = [tableView dequeueReusableCellWithIdentifier:identifier]; if (!cell) { ///如果没有的话 根据identifier 注册一下 重新获取一下即可 [tableView registerClass:[MessageCell class] forCellReuseIdentifier:identifier]; ///如果注册过了 就不需要判断cell是否为空 cell = [tableView dequeueReusableCellWithIdentifier:identifier]; } cell.delegate = self; [cell renderWithMessage:[self.messages safeObjectAtIndex1:indexPath.row]]; return cell; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NIMMessage *msg = [self.messages safeObjectAtIndex1:indexPath.row]; return [MessageCell measureHeight:msg]; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ NIMMessage * message = [self.messages safeObjectAtIndex1:indexPath.row]; NIMCustomObject *obj = (NIMCustomObject *)message.messageObject; AttachmentModel * attachment = obj.attachment; if(attachment.first == CustomMessageType_Initiat_Invitation && attachment.second == Custom_Message_Sub_Initiat_Invitation_Initiating_User){ UserGameInfoVo *gameInfo = [UserGameInfoVo modelWithDictionary:attachment.data]; if([gameInfo.toUid isEqualToString:[AccountInfoStorage instance].getUid]){ return; } XPMineGameOrderDetailsView *orderView = [[XPMineGameOrderDetailsView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)]; orderView.gameInfo = gameInfo; orderView.isFormChat = YES; orderView.delegate = self; [self.view addSubview:orderView]; } } #pragma mark - XPMineGameOrderDetailsViewDelegate ///再次邀请 -(void)againinitiateInvitationWithGameInfo:(UserGameInfoVo *)gameInfo{ XPMinePlaceOrderView *orderVeiw = [[XPMinePlaceOrderView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)]; for (int i = 0; i < self.gameArray.count; i++) { UserGameInfoVo *model = self.gameArray[i]; if([model.gameId isEqualToString:gameInfo.gameId]){ orderVeiw.selectGameInfo = model; } } orderVeiw.inning = gameInfo.inning; orderVeiw.diamonds = self.diamonds; orderVeiw.gameList = self.gameArray; orderVeiw.delegate = self; [self.view addSubview:orderVeiw]; } - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { [self.toolbarView foldMenuView]; } #pragma mark - NIMChatManagerDelegate - (void)onRecvMessages:(NSArray *)messages { NIMMessage *message = messages.firstObject; NIMSession *session = message.session; if (![session isEqual:self.session] || !messages.count) { return; } for (NIMMessage *message in messages) { if (message.isDeleted) { continue; } [self.messages addObject:message]; } [self.sessionTableView reloadData]; [self.sessionTableView nim_scrollToBottom:YES]; [[NIMSDK sharedSDK].conversationManager markAllMessagesReadInSession:self.session]; } - (void)sendMessage:(NIMMessage *)message didCompleteWithError:(NSError *)error { if (message.session.sessionType != NIMSessionTypeP2P) { return; } if (![self isExistMessages:message]) { [self.messages addObject:message]; } if (message.yidunAntiSpamRes) { NSDictionary * spamRes = message.yidunAntiSpamRes.toJSONObject; NSDictionary * spamResExt = ((NSString *)spamRes[@"ext"]).toJSONObject; if ([spamResExt[@"antispam"][@"suggestion"] intValue] == 2) { NSDictionary * dic = @{@"suggestion": @"2"}; message.localExt = dic; [[NIMSDK sharedSDK].conversationManager updateMessage:message forSession:self.session completion:nil]; } } [self.sessionTableView reloadData]; [self.sessionTableView nim_scrollToBottom:YES]; } - (void)fetchMessageAttachment:(NIMMessage *)message didCompleteWithError:(NSError *)error { if (![message.session isEqual:self.session]) return; for (NIMMessage * msg in self.messages) { if ([msg.messageId isEqualToString:message.messageId]) { NSInteger index = [self.messages indexOfObject:msg]; [self.messages replaceObjectAtIndex:index withObject:message]; [self.sessionTableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; break; } } } #pragma mark - NIMConversationManagerDelegate - (void)messagesDeletedInSession:(NIMSession *)session { [self.messages removeAllObjects]; [self initData]; } #pragma mark - XPSessionMessageGameCellDelegate ///点击头像 - (void)xpSessionMessageGameCell:(XPSessionMessageGameCell *)cell onAvatarClick:(NSInteger)uid{ if ([[ClientConfig shareConfig].configInfo.officialMsgUids containsObject:self.session.sessionId] || [[ClientConfig shareConfig].configInfo.officialAccountUids containsObject:self.session.sessionId]) { return; } if (self.openType != SessionListOpenTypeRoom) { XPMineUserInfoViewController * infoVC = [[XPMineUserInfoViewController alloc] init]; infoVC.uid = uid; [self.getKeyWindowNav pushViewController:infoVC animated:YES]; } } ///跟随房间 - (void)xpSessionMessageGameCell:(XPSessionMessageGameCell *)cell onFollowInRoom:(NSString *)roomUid{ if (self.openType != SessionListOpenTypeRoom) { __block BOOL isSameRoom = NO; __block RoomInfoModel *roomModel; [self.getKeyWindowNav.viewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if ([obj isKindOfClass:[XPRoomViewController class]]) { XPRoomViewController * rooomVC = obj; [[self getKeyWindowNav] popToRootViewControllerAnimated:NO]; roomModel = rooomVC.getRoomInfo; if(rooomVC.getRoomInfo.uid == [roomUid integerValue]) { isSameRoom = YES; } else { [rooomVC exitRoom]; } *stop = YES; } }]; if (!isSameRoom) { if (roomModel.type == RoomType_MiniGame) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [XPRoomViewController openRoom:roomUid fromNick:self.userInfo.nick fromType:UserEnterRoomFromType_Follow_User fromUid:[NSString stringWithFormat:@"%ld", self.userInfo.uid] viewController:[[XCCurrentVCStackManager shareManager] getCurrentVC]]; }); } else { [XPRoomViewController openRoom:roomUid fromNick:self.userInfo.nick fromType:UserEnterRoomFromType_Follow_User fromUid:[NSString stringWithFormat:@"%ld", self.userInfo.uid] viewController:self]; } } } } ///下单 - (void)xpSessionMessageGameCell:(XPSessionMessageGameCell *)cell onPlaceOrder:(NSString *)uid{ XPMinePlaceOrderView *orderVeiw = [[XPMinePlaceOrderView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)]; orderVeiw.diamonds = self.diamonds; orderVeiw.selectGameInfo = cell.gameInfo; orderVeiw.gameList = self.userInfo.userGamePartner; orderVeiw.delegate = self; [self.view addSubview:orderVeiw]; } - (void)xpSessionMessageGameCell:(XPSessionMessageGameCell *)cell chooseGame:(nonnull NSString *)uid{ XPMineUserInfoViewController * infoVC = [[XPMineUserInfoViewController alloc] initWithChooseGame]; infoVC.uid = self.userInfo.uid; [[self getKeyWindowNav] pushViewController:infoVC animated:YES]; } #pragma mark - XPMinePlaceOrderViewDelegate ///发起邀请 -(void)initiateInvitationWithGameInfo:(UserGameInfoVo *)gameInfo count:(NSString *)count{ [self showLoading]; [Api sendInitiateInvitationGame:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { [self hideHUD]; if(code == 200){ [self sendInitiateInvitationGameSuccess]; return; } [self showErrorToast:msg]; } gameId:gameInfo.gameId gameUid:gameInfo.uid inning:count uid:[AccountInfoStorage instance].getUid]; } ///充值 -(void)payHandleWithShowView:(BOOL)isShow{ if(isShow == YES){ TTAlertConfig *config = [[TTAlertConfig alloc] init]; config.title = @"提示"; config.actionStyle = TTAlertActionConfirmStyle; config.message = [NSString stringWithFormat:@"余额不足,请充值"]; TTAlertButtonConfig *confirmButtonConfig = [[TTAlertButtonConfig alloc]init]; confirmButtonConfig.title = @"去充值"; config.confirmButtonConfig = confirmButtonConfig; confirmButtonConfig.titleColor = UIColorFromRGB(0x2B2D33); confirmButtonConfig.backgroundColor = UIColorFromRGB(0xFFDA24); confirmButtonConfig.font = [UIFont systemFontOfSize:14 weight:UIFontWeightMedium]; confirmButtonConfig.cornerRadius = 38/2; [TTPopup alertWithConfig:config confirmHandler:^{ XPMineNewRechargeViewController *payVC = [[XPMineNewRechargeViewController alloc]init]; [self.navigationController pushViewController:payVC animated:YES]; } cancelHandler:^{ }]; return; } XPMineNewRechargeViewController *payVC = [[XPMineNewRechargeViewController alloc]init]; [self.navigationController pushViewController:payVC animated:YES]; } -(void)sendInitiateInvitationGameSuccess{ [self showSuccessToast:@"邀请成功"]; [[NSNotificationCenter defaultCenter]postNotificationName:@"kGameOrderListRefreshData" object:nil]; } - (void)didFailRetry:(NIMMessage *)message { if (message.isReceivedMsg) { [[NIMSDK sharedSDK].chatManager fetchMessageAttachment:message error:nil]; } else { [[NIMSDK sharedSDK].chatManager resendMessage:message error:nil]; } } #pragma mark - MessageToolbarViewDelegate - (void)keyboardWillChangeFrame:(CGRect)rect { CGFloat heightFromBottom = rect.size.height; heightFromBottom = MAX(0.0, heightFromBottom); [self.toolbarView mas_updateConstraints:^(MASConstraintMaker *make) { make.bottom.mas_equalTo(self.view).offset(-heightFromBottom); }]; [self.sessionTableView nim_scrollToBottom:NO]; } - (void)sendTextMessage:(NSString *)text { NIMMessage *message = [NIMMessageMaker msgWithText:text]; [[[NIMSDK sharedSDK] chatManager] sendMessage:message toSession:self.session error:nil]; } - (void)didSelectMenuItem:(MessageMenuModel *)info { UIWindow * currentWindow; for (int i = 0; i < [UIApplication sharedApplication].windows.count; i++) { UIWindow * window = [[UIApplication sharedApplication].windows safeObjectAtIndex1:i]; if(window.tag == 1000) { currentWindow = window; break; } } if (currentWindow) { currentWindow.windowLevel = -1; } switch (info.type) { case MessageMenuType_Photo: { TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithMaxImagesCount:1 delegate:self]; imagePickerVc.modalPresentationStyle = UIModalPresentationOverFullScreen; imagePickerVc.allowPickingVideo = NO; imagePickerVc.allowTakeVideo = NO; imagePickerVc.naviBgColor = [ThemeColor appCellBackgroundColor]; imagePickerVc.naviTitleColor = [ThemeColor mainTextColor]; imagePickerVc.barItemTextColor = [ThemeColor mainTextColor]; [self presentViewController:imagePickerVc animated:YES completion:nil]; } break; case MessageMenuType_Gift: { XPSendGiftView * giftView = [[XPSendGiftView alloc] initWithType:SendGiftType_User uid:nil]; XPGiftUserInfoModel * userModel = [[XPGiftUserInfoModel alloc] init]; userModel.avatar = self.userInfo.avatar; userModel.nick = self.userInfo.nick; userModel.uid = self.session.sessionId.integerValue; userModel.isSelect = YES; [giftView configGiftUsers:@[userModel]]; [self presentViewController:giftView animated:YES completion:nil]; } break; default: break; } } - (void)audioRecordCompletion:(NSString *)recordPath { NIMMessage *message = [NIMMessageMaker msgWithAudio:recordPath]; [[[NIMSDK sharedSDK] chatManager] sendMessage:message toSession:self.session error:nil]; } #pragma mark - TZImagePickerControllerDelegate - (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingPhotos:(NSArray *)photos sourceAssets:(NSArray *)assets isSelectOriginalPhoto:(BOOL)isSelectOriginalPhoto infos:(NSArray *)infos { [photos enumerateObjectsUsingBlock:^(UIImage * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if (obj) { // 构造出具体会话 NIMMessage * message = [NIMMessageMaker msgWithImage:obj]; // 发送消息 [[NIMSDK sharedSDK].chatManager sendMessage:message toSession:self.session error:nil]; } }]; } #pragma mark - SessionRiskViewDelegate - (void)sessionRiskViewCloseButtonClick:(SessionRiskView *)view { [[SessionRiskCache shareCache] saveCloseRisk:self.session.sessionId]; self.riskAlertView.hidden = YES; } #pragma mark - Getters And Setters - (NSArray *)messages { if (!_messages) { _messages = [[NSMutableArray alloc] init]; } return _messages; } #pragma mark - Event Response - (void)closeKeyBoard { [self.view endEditing:YES]; [self.toolbarView foldMenuView]; } - (UITableView *)sessionTableView { if (!_sessionTableView) { _sessionTableView = [[UITableView alloc] init]; _sessionTableView.delegate = self; _sessionTableView.dataSource = self; _sessionTableView.backgroundColor = UIColor.clearColor; _sessionTableView.separatorStyle = UITableViewCellSeparatorStyleNone; _sessionTableView.showsVerticalScrollIndicator = NO; // UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeKeyBoard)]; // [_sessionTableView addGestureRecognizer:tap]; } return _sessionTableView; } - (SessionToolbarView *)toolbarView { if (!_toolbarView) { _toolbarView = [[SessionToolbarView alloc] init]; _toolbarView.delegate = self; _toolbarView.sendDisabled = YES; } return _toolbarView; } - (SessionNavView *)sessionNavView { if (!_sessionNavView) { _sessionNavView = [[SessionNavView alloc] init]; _sessionNavView.delegate = self; } return _sessionNavView; } - (SessionRiskView *)riskAlertView { if (!_riskAlertView) { _riskAlertView = [[SessionRiskView alloc] init]; _riskAlertView.delegate = self; } return _riskAlertView; } - (UICollectionView *)collectionView{ if (!_collectionView) { UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; layout.minimumLineSpacing = 0; layout.minimumInteritemSpacing = 0; layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0); _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; _collectionView.dataSource = self; _collectionView.delegate = self; _collectionView.pagingEnabled = YES; _collectionView.hidden = YES; _collectionView.backgroundColor = [UIColor clearColor]; _collectionView.showsHorizontalScrollIndicator = NO; [_collectionView registerClass:[XPSessionMessageGameCell class] forCellWithReuseIdentifier:NSStringFromClass([XPSessionMessageGameCell class])]; [_collectionView registerClass:[XPSessionMessageGameInfoView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:NSStringFromClass([XPSessionMessageGameInfoView class])]; } return _collectionView; } - (XPSessionMessageGamePageControl *)pageControl{ if(!_pageControl){ _pageControl = [[XPSessionMessageGamePageControl alloc]initWithFrame:CGRectZero]; _pageControl.hidden = YES; } return _pageControl; } - (UIStackView *)stackView { if (!_stackView) { _stackView = [[UIStackView alloc] init]; _stackView.axis = UILayoutConstraintAxisVertical; _stackView.distribution = UIStackViewDistributionFill; _stackView.alignment = UIStackViewAlignmentFill; _stackView.spacing = kGetScaleWidth(8); } return _stackView; } @end