ifish/Ifish/controllers/IfishTabControllers/消息/IfishIMFiles/Sessions/Util/NTESDataManager.m

308 lines
8.4 KiB
Objective-C

//
// 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()<NIMUserManagerDelegate,NIMTeamManagerDelegate,NIMLoginManagerDelegate>
@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<NTESCustomAttachmentInfo> attachment = (id<NTESCustomAttachmentInfo>)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