308 lines
8.4 KiB
Objective-C
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
|