// // NTESDataManager.m // NIM // // Created by amao on 8/13/15. // Copyright (c) 2015 Netease. All rights reserved. // #import "NTESDataManager.h" #import "NTESChatroomManager.h" #import "NTESCustomAttachmentDefines.h" @interface NTESDataRequest : NSObject @property (nonatomic,assign) NSInteger maxMergeCount; //最大合并数 - (void)requestUserIds:(NSArray *)userIds; @end @interface NTESDataManager() @property (nonatomic,strong) NTESDataRequest *request; @end @implementation NTESDataManager + (instancetype)sharedInstance{ static NTESDataManager *instance; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[NTESDataManager alloc] init]; }); return instance; } - (instancetype)init{ self = [super init]; if (self) { _defaultUserAvatar = [UIImage imageNamed:@"avatar_user"]; _defaultTeamAvatar = [UIImage imageNamed:@"avatar_team"]; _request = [[NTESDataRequest alloc] init]; _request.maxMergeCount = 20; [[NIMSDK sharedSDK].userManager addDelegate:self]; [[NIMSDK sharedSDK].teamManager addDelegate:self]; [[NIMSDK sharedSDK].loginManager addDelegate:self]; } return self; } - (void)dealloc { [[NIMSDK sharedSDK].userManager removeDelegate:self]; [[NIMSDK sharedSDK].teamManager removeDelegate:self]; [[NIMSDK sharedSDK].loginManager removeDelegate:self]; } - (NIMKitInfo *)infoByUser:(NSString *)userId inSession:(NIMSession *)session { BOOL needFetchInfo = NO; NIMSessionType sessionType = session.sessionType; NIMKitInfo *info = [[NIMKitInfo alloc] init]; info.infoId = userId; info.showName = userId; //默认值 switch (sessionType) { case NIMSessionTypeP2P: case NIMSessionTypeTeam: { NIMUser *user = [[NIMSDK sharedSDK].userManager userInfo:userId]; NIMUserInfo *userInfo = user.userInfo; NIMTeamMember *member = nil; if (sessionType == NIMSessionTypeTeam) { member = [[NIMSDK sharedSDK].teamManager teamMember:userId inTeam:session.sessionId]; } NSString *name = [self nickname:user memberInfo:member]; if (name) { info.showName = name; } info.avatarUrlString = userInfo.thumbAvatarUrl; info.avatarImage = self.defaultUserAvatar; if (userInfo == nil) { needFetchInfo = YES; } } break; case NIMSessionTypeChatroom: NSAssert(0, @"invalid type"); //聊天室的Info不会通过这个回调请求 break; default: NSAssert(0, @"invalid type"); break; } if (needFetchInfo) { [self.request requestUserIds:@[userId]]; } return info; } - (NIMKitInfo *)infoByTeam:(NSString *)teamId { NIMTeam *team = [[NIMSDK sharedSDK].teamManager teamById:teamId]; NIMKitInfo *info = [[NIMKitInfo alloc] init]; info.showName = team.teamName; info.infoId = teamId; info.avatarImage = self.defaultTeamAvatar; info.avatarUrlString = team.thumbAvatarUrl; return info; } - (NIMKitInfo *)infoByUser:(NSString *)userId withMessage:(NIMMessage *)message { if (message.session.sessionType == NIMSessionTypeChatroom) { NIMKitInfo *info = [[NIMKitInfo alloc] init]; info.infoId = userId; if ([userId isEqualToString:[NIMSDK sharedSDK].loginManager.currentAccount]) { NIMChatroomMember *member = [[NTESChatroomManager sharedInstance] myInfo:message.session.sessionId]; info.showName = member.roomNickname; info.avatarUrlString = member.roomAvatar; }else{ NIMMessageChatroomExtension *ext = [message.messageExt isKindOfClass:[NIMMessageChatroomExtension class]] ? (NIMMessageChatroomExtension *)message.messageExt : nil; info.showName = ext.roomNickname; info.avatarUrlString = ext.roomAvatar; } info.avatarImage = self.defaultUserAvatar; return info; } else { return [self infoByUser:userId inSession:message.session]; } } - (NSString *)tipMessage:(NIMMessage *)message { NSString *text = nil; NIMMessageType type = message.messageType; if (type == NIMMessageTypeCustom) { NIMCustomObject *object = (NIMCustomObject *)message.messageObject; id attachment = (id)object.attachment; if ([attachment respondsToSelector:@selector(formatedMessage)]) { text = [attachment formatedMessage]; } } return text; } //将个人信息和群组信息变化通知给 NIMKit 。 //如果您的应用不托管个人信息给云信,则需要您自行在上层监听个人信息变动,并将变动通知给 NIMKit。 #pragma mark - NIMUserManagerDelegate - (void)onFriendChanged:(NIMUser *)user { [[NIMKit sharedKit] notfiyUserInfoChanged:@[user.userId]]; } - (void)onUserInfoChanged:(NIMUser *)user { [[NIMKit sharedKit] notfiyUserInfoChanged:@[user.userId]]; } - (void)onBlackListChanged{ // [[NIMKit sharedKit] notifyUserBlackListChanged]; } - (void)onMuteListChanged { // [[NIMKit sharedKit] notifyUserMuteListChanged]; } #pragma mark - NIMTeamManagerDelegate - (void)onTeamAdded:(NIMTeam *)team { [[NIMKit sharedKit] notifyTeamInfoChanged:@[team.teamId]]; } - (void)onTeamUpdated:(NIMTeam *)team { [[NIMKit sharedKit] notifyTeamInfoChanged:@[team.teamId]]; } - (void)onTeamRemoved:(NIMTeam *)team { [[NIMKit sharedKit] notifyTeamInfoChanged:@[team.teamId]]; } - (void)onTeamMemberChanged:(NIMTeam *)team { [[NIMKit sharedKit] notifyTeamMemebersChanged:@[team.teamId]]; } #pragma mark - NIMLoginManagerDelegate - (void)onLogin:(NIMLoginStep)step { if (step == NIMLoginStepSyncOK) { [[NIMKit sharedKit] notifyTeamInfoChanged:nil]; [[NIMKit sharedKit] notifyTeamMemebersChanged:nil]; } } #pragma mark - nickname - (NSString *)nickname:(NIMUser *)user memberInfo:(NIMTeamMember *)memberInfo { NSString *name = nil; do{ if ([user.alias length]) { name = user.alias; break; } if (memberInfo && [memberInfo.nickname length]) { name = memberInfo.nickname; break; } if ([user.userInfo.nickName length]) { name = user.userInfo.nickName; break; } }while (0); return name; } @end @implementation NTESDataRequest{ NSMutableArray *_requstUserIdArray; //待请求池 BOOL _isRequesting; } - (instancetype)init{ self = [super init]; if (self) { _requstUserIdArray = [[NSMutableArray alloc] init]; } return self; } - (void)requestUserIds:(NSArray *)userIds { for (NSString *userId in userIds) { if (![_requstUserIdArray containsObject:userId]) { [_requstUserIdArray addObject:userId]; NSLog(@"should request info for userid %@",userId); } } [self request]; } - (void)request { static NSUInteger MaxBatchReuqestCount = 10; if (_isRequesting || [_requstUserIdArray count] == 0) { return; } _isRequesting = YES; NSArray *userIds = [_requstUserIdArray count] > MaxBatchReuqestCount ? [_requstUserIdArray subarrayWithRange:NSMakeRange(0, MaxBatchReuqestCount)] : [_requstUserIdArray copy]; NSLog(@"request user ids %@",userIds); __weak typeof(self) weakSelf = self; [[NIMSDK sharedSDK].userManager fetchUserInfos:userIds completion:^(NSArray *users, NSError *error) { [weakSelf afterReuquest:userIds]; if (!error) { [[NIMKit sharedKit] notfiyUserInfoChanged:userIds]; } }]; } - (void)afterReuquest:(NSArray *)userIds { _isRequesting = NO; [_requstUserIdArray removeObjectsInArray:userIds]; [self request]; } @end