IMAContactManager+Group.m 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. //
  2. // IMAContactManager+Group.m
  3. // TIMChat
  4. //
  5. // Created by AlexiChen on 16/3/2.
  6. // Copyright © 2016年 AlexiChen. All rights reserved.
  7. //
  8. #import "IMAContactManager+Group.h"
  9. @implementation IMAContactManager (Group)
  10. - (void)createGroupList:(NSArray *)array
  11. {
  12. if (array.count)
  13. {
  14. NSMutableArray *gidarray = [NSMutableArray array];
  15. for (TIMGroupInfo *group in array)
  16. {
  17. [gidarray addObject:[group group]];
  18. }
  19. // 同步群基本信息
  20. __weak IMAContactManager *ws = self;
  21. [[TIMGroupManager sharedInstance] getGroupInfo:gidarray succ:^(NSArray *array) {
  22. [ws asyncDetailGroupInfo:array];
  23. } fail:^(int code, NSString *err) {
  24. DebugLog(@"Fail:-->code=%d,msg=%@,fun=%s", code, err,__func__);
  25. [[BGHUDHelper sharedInstance] tipMessage:IMALocalizedError(code, err)];
  26. }];
  27. }
  28. }
  29. - (void)asyncDetailGroupInfo:(NSArray *)array
  30. {
  31. if (!_groupList)
  32. {
  33. _groupList = [[CLSafeMutableArray alloc] init];
  34. }
  35. for (TIMGroupInfo *group in array)
  36. {
  37. IMAGroup *sg = [[IMAGroup alloc] initWithInfo:group];
  38. [_groupList addObject:sg];
  39. }
  40. // [[IMAPlatform sharedInstance].conversationMgr asyncConversationList];
  41. }
  42. // 群列表
  43. - (void)asyncGroupList
  44. {
  45. __weak IMAContactManager *ws = self;
  46. [[TIMGroupManager sharedInstance] getGroupList:^(NSArray *array) {
  47. [ws createGroupList:array];
  48. } fail:^(int code, NSString *err) {
  49. DebugLog(@"Fail:-->code=%d,msg=%@,fun=%s", code, err,__func__);
  50. [[BGHUDHelper sharedInstance] tipMessage:IMALocalizedError(code, err)];
  51. DebugLog(@"code = %d, err = %@", code, err);
  52. }];
  53. }
  54. - (void)syncGroupList
  55. {
  56. NSArray *array = [[TIMGroupManager sharedInstance] getGroupInfo:nil];
  57. [self asyncDetailGroupInfo:array];
  58. }
  59. - (TIMGroupInfo *)syncGetGroupInfo:(NSString *)groupId
  60. {
  61. NSArray *infos = [[TIMGroupManager sharedInstance] getGroupInfo:@[groupId]];
  62. if (infos.count > 0)
  63. {
  64. return infos[0];
  65. }
  66. return nil;
  67. }
  68. - (void)createBlackList:(NSArray *)array
  69. {
  70. if (array.count)
  71. {
  72. NSMutableArray *ba = [NSMutableArray array];
  73. for (NSString *userid in array)
  74. {
  75. IMAUser *user = [[IMAUser alloc] initWith:userid];
  76. [ba addObject:user];
  77. }
  78. if (!_blackList)
  79. {
  80. _blackList = [[CLSafeMutableArray alloc] init];
  81. }
  82. [_blackList addObjectsFromArray:ba];
  83. }
  84. }
  85. // 黑名单
  86. - (void)asyncBlackList
  87. {
  88. __weak IMAContactManager *ws = self;
  89. [[TIMFriendshipManager sharedInstance] getBlackList:^(NSArray *array) {
  90. [ws createBlackList:array];
  91. } fail:^(int code, NSString *err) {
  92. DebugLog(@"Fail:-->code=%d,msg=%@,fun=%s", code, err,__func__);
  93. [[BGHUDHelper sharedInstance] tipMessage:IMALocalizedError(code, err)];
  94. DebugLog(@"code = %d, err = %@", code, err);
  95. }];
  96. }
  97. // 获取公开群
  98. - (NSMutableDictionary *)publicGroups
  99. {
  100. NSMutableArray *myOwn = [NSMutableArray array];
  101. NSMutableArray *myMgr = [NSMutableArray array];
  102. NSMutableArray *myBelongTo = [NSMutableArray array];
  103. for (NSInteger i = 0; i < _groupList.count; i++)
  104. {
  105. IMAGroup *group = [_groupList objectAtIndex:i];
  106. if ([group isPublicGroup])
  107. {
  108. if ([group isCreatedByMe])
  109. {
  110. [myOwn addObject:group];
  111. }
  112. else if ([group isManagedByMe])
  113. {
  114. [myMgr addObject:group];
  115. }
  116. else
  117. {
  118. [myBelongTo addObject:group];
  119. }
  120. }
  121. }
  122. NSMutableDictionary *dic = [NSMutableDictionary dictionary];
  123. if (myOwn.count > 0)
  124. {
  125. [dic setObject:myOwn forKey:ASLocalizedString(@"我创建的群")];
  126. }
  127. if (myMgr.count > 0)
  128. {
  129. [dic setObject:myMgr forKey:ASLocalizedString(@"我管理的群")];
  130. }
  131. if (myBelongTo.count > 0)
  132. {
  133. [dic setObject:myBelongTo forKey:ASLocalizedString(@"我加入的群")];
  134. }
  135. return dic;
  136. }
  137. // 获取聊天室
  138. - (NSMutableArray *)chatRooms
  139. {
  140. NSMutableArray *array = [NSMutableArray array];
  141. for (NSInteger i = 0; i < _groupList.count; i++)
  142. {
  143. IMAGroup *group = [_groupList objectAtIndex:i];
  144. if ([group isChatRoom])
  145. {
  146. [array addObject:group];
  147. }
  148. }
  149. return array;
  150. }
  151. // 获取讨论组
  152. - (NSMutableArray *)chatGroup
  153. {
  154. NSMutableArray *array = [NSMutableArray array];
  155. for (NSInteger i = 0; i < _groupList.count; i++)
  156. {
  157. IMAGroup *group = [_groupList objectAtIndex:i];
  158. if ([group isChatGroup])
  159. {
  160. [array addObject:group];
  161. }
  162. }
  163. return array;
  164. }
  165. // 30 字节长度
  166. #define kMaxGroupNameLength 30
  167. - (BOOL)checkGroupParams:(NSString *)name members:(NSArray *)array
  168. {
  169. if ([name isContainsEmoji])
  170. {
  171. [BGHUDHelper alert:ASLocalizedString(@"群名称不能包含表情")];
  172. return NO;
  173. }
  174. if (array.count == 0)
  175. {
  176. [BGHUDHelper alert:ASLocalizedString(@"未选择加入群组的好友")];
  177. return NO;
  178. }
  179. return YES;
  180. }
  181. - (void)asyncGroupInfo:(NSString *)groupId onCreateSucc:(void (^)(IMAGroup *group))succ fail:(TIMFail)fail
  182. {
  183. // 同步群信息
  184. // 添加成功
  185. [[TIMGroupManager sharedInstance] getGroupInfo:@[groupId] succ:^(NSArray *array) {
  186. if (array.count)
  187. {
  188. // 只会返回一个信息
  189. TIMGroupInfo *groupInfo = array[0];
  190. IMAGroup *sg = [[IMAGroup alloc] initWithInfo:groupInfo];
  191. [self.groupList addObject:sg];
  192. if (succ)
  193. {
  194. succ(sg);
  195. }
  196. }
  197. } fail:^(int code, NSString *err) {
  198. DebugLog(@"Fail:-->code=%d,msg=%@,fun=%s", code, err,__func__);
  199. [[BGHUDHelper sharedInstance] tipMessage:IMALocalizedError(code, err)];
  200. if (fail)
  201. {
  202. fail(code, err);
  203. }
  204. }];
  205. }
  206. typedef void (^IMACreateCompletion)(IMAGroup *group);
  207. typedef void (^CreateGroupOperation)(NSString *groupName, NSArray *memids, IMACreateCompletion succ, TIMFail fail);
  208. - (void)onWillCreateGroupWith:(NSString *)name members:(NSArray *)array operation:(CreateGroupOperation)op succ:(void (^)(IMAGroup *group))succ fail:(TIMFail)fail
  209. {
  210. if (![self checkGroupParams:name members:array])
  211. {
  212. return;
  213. }
  214. size_t length = strlen([name UTF8String]);
  215. if( length > kMaxGroupNameLength)
  216. {
  217. name = [name cutBeyondTextInLength:kMaxGroupNameLength];
  218. }
  219. NSMutableArray *mems = [NSMutableArray array];
  220. for (IMAUser *user in array)
  221. {
  222. TIMCreateGroupMemberInfo *mem = [[TIMCreateGroupMemberInfo alloc] init];
  223. mem.member = [user userId];
  224. mem.role = TIM_GROUP_MEMBER_ROLE_MEMBER;
  225. [mems addObject:mem];
  226. }
  227. if (op)
  228. {
  229. op(name, mems, succ, fail);
  230. }
  231. }
  232. - (void)asyncCreateChatGroupWith:(NSString *)name members:(NSArray *)array succ:(void (^)(IMAGroup *group))succ fail:(TIMFail)fail
  233. {
  234. // __weak IMAContactManager *ws = self;
  235. [self onWillCreateGroupWith:name members:array operation:^(NSString *groupName, NSArray *memids, IMACreateCompletion succ, TIMFail fail) {
  236. TIMCreateGroupInfo *cgi = [[TIMCreateGroupInfo alloc] init];
  237. cgi.group = nil;
  238. cgi.groupName = name;
  239. cgi.groupType = @"Private";
  240. cgi.maxMemberNum = 0;
  241. cgi.membersInfo = memids;
  242. [[TIMGroupManager sharedInstance] createGroup:cgi succ:^(NSString *groupId) {
  243. TIMGroupInfo *tgi = [TIMGroupInfo instanceFrom:cgi];
  244. tgi.group = groupId;
  245. tgi.owner = [[IMAPlatform sharedInstance].host userId];
  246. IMAGroup *g = [[IMAGroup alloc] initWithInfo:tgi];
  247. if (succ)
  248. {
  249. succ(g);
  250. }
  251. } fail:^(int code, NSString *err) {
  252. DebugLog(@"Fail:-->code=%d,msg=%@,fun=%s", code, err,__func__);
  253. [[BGHUDHelper sharedInstance] tipMessage:IMALocalizedError(code, err)];
  254. if (fail)
  255. {
  256. fail(code, err);
  257. }
  258. }];
  259. } succ:succ fail:fail];
  260. }
  261. - (void)asyncCreatePublicGroupWith:(NSString *)name members:(NSArray *)array succ:(void (^)(IMAGroup *group))succ fail:(TIMFail)fail
  262. {
  263. // __weak IMAContactManager *ws = self;
  264. [self onWillCreateGroupWith:name members:array operation:^(NSString *groupName, NSArray *memids, IMACreateCompletion succ, TIMFail fail) {
  265. TIMCreateGroupInfo *cgi = [[TIMCreateGroupInfo alloc] init];
  266. cgi.group = nil;
  267. cgi.groupName = name;
  268. cgi.groupType = @"Public";
  269. cgi.addOpt = TIM_GROUP_ADD_ANY;
  270. cgi.maxMemberNum = 0;
  271. cgi.membersInfo = memids;
  272. [[TIMGroupManager sharedInstance] createGroup:cgi succ:^(NSString *groupId) {
  273. //注:这里成功回调时,不能调用getGroupInfo,因为群信息还没有同步下来,必须是在onGroupAdd回调之后才能回去到详细的群信息
  274. TIMGroupInfo *tgi = [TIMGroupInfo instanceFrom:cgi];
  275. tgi.group = groupId;
  276. tgi.owner = [[IMAPlatform sharedInstance].host userId];
  277. IMAGroup *g = [[IMAGroup alloc] initWithInfo:tgi];
  278. if (succ)
  279. {
  280. succ(g);
  281. }
  282. } fail:^(int code, NSString *err) {
  283. DebugLog(@"Fail:-->code=%d,msg=%@,fun=%s", code, err,__func__);
  284. [[BGHUDHelper sharedInstance] tipMessage:IMALocalizedError(code, err)];
  285. if (fail)
  286. {
  287. fail(code, err);
  288. }
  289. }];
  290. } succ:succ fail:fail];
  291. }
  292. - (void)asyncCreateChatRoomWith:(NSString *)name members:(NSArray *)array succ:(void (^)(IMAGroup *group))succ fail:(TIMFail)fail
  293. {
  294. // __weak IMAContactManager *ws = self;
  295. [self onWillCreateGroupWith:name members:array operation:^(NSString *groupName, NSArray *memids, IMACreateCompletion succ, TIMFail fail) {
  296. TIMCreateGroupInfo *cgi = [[TIMCreateGroupInfo alloc] init];
  297. cgi.group = nil;
  298. cgi.groupName = name;
  299. cgi.groupType = @"ChatRoom";
  300. cgi.addOpt = TIM_GROUP_ADD_ANY;
  301. cgi.maxMemberNum = 0;
  302. cgi.membersInfo = memids;
  303. [[TIMGroupManager sharedInstance] createGroup:cgi succ:^(NSString *groupId) {
  304. TIMGroupInfo *tgi = [TIMGroupInfo instanceFrom:cgi];
  305. tgi.group = groupId;
  306. tgi.owner = [[IMAPlatform sharedInstance].host userId];
  307. IMAGroup *g = [[IMAGroup alloc] initWithInfo:tgi];
  308. if (succ)
  309. {
  310. succ(g);
  311. }
  312. } fail:^(int code, NSString *err) {
  313. DebugLog(@"Fail:-->code=%d,msg=%@,fun=%s", code, err,__func__);
  314. [[BGHUDHelper sharedInstance] tipMessage:IMALocalizedError(code, err)];
  315. if (fail)
  316. {
  317. fail(code, err);
  318. }
  319. }];
  320. } succ:succ fail:fail];
  321. }
  322. - (void)asyncGetGroupPendencyList:(TIMGetGroupPendencyListSucc)succ fail:(TIMFail)fail
  323. {
  324. TIMGroupPendencyOption *opt = [[TIMGroupPendencyOption alloc] init];
  325. opt.timestamp = 0;
  326. opt.numPerPage = 100;
  327. [[TIMGroupManager sharedInstance] getPendencyFromServer:opt succ:^(TIMGroupPendencyMeta *meta, NSArray *pendencies) {
  328. if (succ)
  329. {
  330. succ(meta, pendencies);
  331. }
  332. } fail:^(int code, NSString *msg) {
  333. [[BGHUDHelper sharedInstance] tipMessage:IMALocalizedError(code, msg)];
  334. if (fail)
  335. {
  336. fail(code, msg);
  337. }
  338. }];
  339. }
  340. - (void)asyncGroupPendencyReport:(uint64_t)timestamp succ:(TIMSucc)succ fail:(TIMFail)fail
  341. {
  342. [[TIMGroupManager sharedInstance] pendencyReport:timestamp succ:^{
  343. if (succ)
  344. {
  345. succ();
  346. }
  347. } fail:^(int code, NSString *msg) {
  348. DebugLog(@"group pendency report fail (code = %d, msg = %@)",code, msg);
  349. [[BGHUDHelper sharedInstance] tipMessage:IMALocalizedError(code, msg)];
  350. if (fail)
  351. {
  352. fail(code, msg);
  353. }
  354. }];
  355. }
  356. - (void)asyncAcceptAddGroup:(NSString*)msg pendencyItem:(TIMGroupPendencyItem *)item succ:(TIMSucc)succ fail:(TIMFail)fail
  357. {
  358. if (!item)
  359. {
  360. return;
  361. }
  362. [item accept:msg succ:^{
  363. if (succ)
  364. {
  365. succ();
  366. }
  367. } fail:^(int code, NSString *msg) {
  368. NSString *errInfo = [NSString stringWithFormat:@"accept fail code = %d,msg = %@", code, msg];
  369. DebugLog(@"%@", errInfo);
  370. [[BGHUDHelper sharedInstance] tipMessage:IMALocalizedError(code, msg)];
  371. if (fail)
  372. {
  373. fail(code, msg);
  374. }
  375. }];
  376. }
  377. - (void)asyncRefuseAddGroup:(NSString*)msg pendencyItem:(TIMGroupPendencyItem *)item succ:(TIMSucc)succ fail:(TIMFail)fail
  378. {
  379. if (!item)
  380. {
  381. return;
  382. }
  383. [item refuse:msg succ:^{
  384. if (succ)
  385. {
  386. succ();
  387. }
  388. } fail:^(int code, NSString *msg) {
  389. NSString *errInfo = [NSString stringWithFormat:@"refuse fail code = %d,msg = %@", code, msg];
  390. DebugLog(@"%@", errInfo);
  391. [[BGHUDHelper sharedInstance] tipMessage:IMALocalizedError(code, msg)];
  392. if (fail)
  393. {
  394. fail(code, msg);
  395. }
  396. }];
  397. }
  398. @end