PageRenderTime 56ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/TeamTalk/IOSDuoduo/Module/Messages/DDMessageModule.m

https://gitlab.com/lisit1003/TTiOSClient
Objective C | 453 lines | 368 code | 59 blank | 26 comment | 34 complexity | 7beae142eaf6e07b576d97df10c9df17 MD5 | raw file
  1. //
  2. // DDMessageModule.m
  3. // IOSDuoduo
  4. //
  5. // Created by 独嘉 on 14-5-27.
  6. // Copyright (c) 2014年 dujia. All rights reserved.
  7. //
  8. #import "DDMessageModule.h"
  9. #import "DDDatabaseUtil.h"
  10. #import "DDReceiveMessageAPI.h"
  11. #import "DDGetUnreadMessageUsersAPI.h"
  12. #import "DDGetUserUnreadMessagesAPI.h"
  13. #import "DDAFClient.h"
  14. #import "DDSessionEntity.h"
  15. #import "RuntimeStatus.h"
  16. #import "DDGroupMsgReadACKAPI.h"
  17. #import "DDSendMessageReadACKAPI.h"
  18. #import "DDUserModule.h"
  19. #import "DDUnreadMessageGroupAPI.h"
  20. #import "DDReceiveMessageACKAPI.h"
  21. #import "AnalysisImage.h"
  22. #import "DDGroupsUnreadMessageAPI.h"
  23. #import "RecentUsersViewController.h"
  24. #define DDMessage_ID_Key @"DDMessage_ID_Key"
  25. @interface DDMessageModule(PrivateAPI)
  26. - (void)p_registerReceiveMessageAPI;
  27. - (void)p_saveReceivedMessage:(DDMessageEntity*)message;
  28. - (void)n_receiveLoginSuccessNotification:(NSNotification*)notification;
  29. - (void)n_receiveUserLogoutNotification:(NSNotification*)notification;
  30. - (NSArray*)p_spliteMessage:(DDMessageEntity*)message;
  31. @end
  32. @implementation DDMessageModule
  33. {
  34. NSMutableDictionary* _unreadMessages;
  35. }
  36. + (instancetype)shareInstance
  37. {
  38. static DDMessageModule* g_messageModule;
  39. static dispatch_once_t onceToken;
  40. dispatch_once(&onceToken, ^{
  41. g_messageModule = [[DDMessageModule alloc] init];
  42. });
  43. return g_messageModule;
  44. }
  45. - (id)init
  46. {
  47. self = [super init];
  48. if (self)
  49. {
  50. //注册收到消息API
  51. _unreadMessages = [[NSMutableDictionary alloc] init];
  52. [self p_registerReceiveMessageAPI];
  53. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(n_receiveLoginSuccessNotification:) name:DDNotificationUserLoginSuccess object:nil];
  54. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(n_receiveLoginSuccessNotification:) name:DDNotificationUserReloginSuccess object:nil];
  55. }
  56. return self;
  57. }
  58. - (void)dealloc
  59. {
  60. [[NSNotificationCenter defaultCenter] removeObserver:self];
  61. }
  62. + (NSString *)getMessageID
  63. {
  64. NSString *uuid = [[NSUUID UUID] UUIDString];
  65. return uuid;
  66. }
  67. - ( void)getLastMessageForSessionID:(NSString*)sessionID block:(GetLastestMessageCompletion)block {
  68. NSArray *unReadMessage =[self getUnreadMessageBySessionID:sessionID];
  69. if([unReadMessage count]!=0)
  70. {
  71. block([unReadMessage lastObject]);
  72. }else
  73. {
  74. [[DDDatabaseUtil instance] getLastestMessageForSessionID:sessionID completion:^(DDMessageEntity *message, NSError *error) {
  75. block(message);
  76. }];
  77. }
  78. }
  79. - (void)addUnreadMessage:(DDMessageEntity*)message
  80. {
  81. if (!message)
  82. {
  83. return;
  84. }
  85. if([message.sessionId isEqualToString:@"1szei2"])
  86. {
  87. return;
  88. }
  89. //senderId 即 sessionId
  90. if (![message isGroupMessage]) {
  91. if ([[_unreadMessages allKeys] containsObject:message.sessionId])
  92. {
  93. NSMutableArray* unreadMessage = _unreadMessages[message.sessionId];
  94. [unreadMessage addObject:message];
  95. }
  96. else
  97. {
  98. NSMutableArray* unreadMessages = [[NSMutableArray alloc] init];
  99. [unreadMessages addObject:message];
  100. [_unreadMessages setObject:unreadMessages forKey:message.sessionId];
  101. }
  102. }else
  103. {
  104. if ([[_unreadMessages allKeys] containsObject:message.sessionId])
  105. {
  106. NSMutableArray* unreadMessage = _unreadMessages[message.sessionId];
  107. [unreadMessage addObject:message];
  108. }
  109. else
  110. {
  111. NSMutableArray* unreadMessages = [[NSMutableArray alloc] init];
  112. [unreadMessages addObject:message];
  113. [_unreadMessages setObject:unreadMessages forKey:message.sessionId];
  114. }
  115. }
  116. }
  117. - (void)clearUnreadMessagesForSessionID:(NSString*)sessionID
  118. {
  119. NSMutableArray* unreadMessages = _unreadMessages[sessionID];
  120. if (unreadMessages)
  121. {
  122. [unreadMessages enumerateObjectsUsingBlock:^(DDMessageEntity* messageEntity, NSUInteger idx, BOOL *stop) {
  123. [[DDDatabaseUtil instance]insertMessages:@[messageEntity] success:^{
  124. if (![messageEntity isGroupMessage])
  125. {
  126. DDSendMessageReadACKAPI* readACKAPI = [[DDSendMessageReadACKAPI alloc] init];
  127. [readACKAPI requestWithObject:messageEntity.sessionId Completion:^(id response, NSError *error) {
  128. }];
  129. }
  130. else
  131. {
  132. DDLog(@"read group ack");
  133. DDGroupMsgReadACKAPI* readACK = [[DDGroupMsgReadACKAPI alloc] init];
  134. [readACK requestWithObject:messageEntity.sessionId Completion:nil];
  135. }
  136. } failure:^(NSString *errorDescripe) {
  137. NSLog(@"消息插入DB失败");
  138. }];
  139. }];
  140. }
  141. [unreadMessages removeAllObjects];
  142. [self setApplicationUnreadMsgCount];
  143. }
  144. - (NSUInteger)getUnreadMessageCountForSessionID:(NSString*)sessionID
  145. {
  146. if ([sessionID isEqualToString:TheRuntime.userID]) {
  147. return 0;
  148. }
  149. NSMutableArray* unreadMessages = _unreadMessages[sessionID];
  150. return [unreadMessages count];
  151. }
  152. -(NSArray *)getUnreadMessageBySessionID:(NSString *)sessionID
  153. {
  154. return _unreadMessages[sessionID];
  155. }
  156. - (NSUInteger)getUnreadMessgeCount
  157. {
  158. __block NSUInteger count = 0;
  159. [_unreadMessages enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
  160. count += [obj count];
  161. }];
  162. return count;
  163. }
  164. -(void)removeFromUnreadMessageButNotSendRead:(NSString*)sessionID
  165. {
  166. NSMutableArray* messages = _unreadMessages[sessionID];
  167. DDLog(@" remove message %d--->,%@ id is ",[messages count],sessionID);
  168. if ([messages count]> 0)
  169. {
  170. [_unreadMessages removeObjectForKey:sessionID];
  171. }
  172. }
  173. - (NSArray*)popAllUnreadMessagesForSessionID:(NSString*)sessionID
  174. {
  175. NSMutableArray* messages = _unreadMessages[sessionID];
  176. if ([messages count]> 0)
  177. {
  178. [[DDDatabaseUtil instance] insertMessages:messages success:^{
  179. DDMessageEntity* message = messages[0];
  180. if (![message isGroupMessage])
  181. {
  182. DDSendMessageReadACKAPI* readACKAPI = [[DDSendMessageReadACKAPI alloc] init];
  183. [readACKAPI requestWithObject:message.sessionId Completion:^(id response, NSError *error) {
  184. }];
  185. }
  186. else
  187. {
  188. DDLog(@"read group ack");
  189. DDGroupMsgReadACKAPI* readACK = [[DDGroupMsgReadACKAPI alloc] init];
  190. [readACK requestWithObject:message.sessionId Completion:nil];
  191. }
  192. } failure:^(NSString *errorDescripe) {
  193. NSLog(@"消息插入DB失败");
  194. }];
  195. [_unreadMessages removeObjectForKey:sessionID];
  196. return messages;
  197. }
  198. else
  199. {
  200. return nil;
  201. }
  202. }
  203. #pragma mark - privateAPI
  204. - (void)p_registerReceiveMessageAPI
  205. {
  206. DDReceiveMessageAPI* receiveMessageAPI = [[DDReceiveMessageAPI alloc] init];
  207. [receiveMessageAPI registerAPIInAPIScheduleReceiveData:^(DDMessageEntity* object, NSError *error) {
  208. object.state=DDmessageSendSuccess;
  209. DDReceiveMessageACKAPI *rmack = [[DDReceiveMessageACKAPI alloc] init];
  210. [rmack requestWithObject:@[object.senderId,@(object.seqNo)] Completion:^(id response, NSError *error) {
  211. }];
  212. NSArray* messages = [self p_spliteMessage:object];
  213. [messages enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
  214. [self p_saveReceivedMessage:obj];
  215. }];
  216. }];
  217. }
  218. - (void)p_saveReceivedMessage:(DDMessageEntity*)messageEntity
  219. {
  220. DDSessionEntity* session = [[DDSessionEntity alloc] initWithSessionID:messageEntity.sessionId type:messageEntity.msgType];
  221. [session updateUpdateTime:messageEntity.msgTime];
  222. if (messageEntity)
  223. {
  224. [AnalysisImage analysisImage:messageEntity Block:^(NSMutableArray *array) {
  225. [array enumerateObjectsUsingBlock:^(DDMessageEntity *obj, NSUInteger idx, BOOL *stop) {
  226. obj.state = DDmessageSendSuccess;
  227. if (![TheRuntime isInShielding:messageEntity.sessionId]) {
  228. [self addUnreadMessage:obj];
  229. }
  230. [DDNotificationHelp postNotification:DDNotificationReceiveMessage userInfo:nil object:messageEntity];
  231. }];
  232. }];
  233. }
  234. }
  235. - (void)n_receiveLoginSuccessNotification:(NSNotification*)notification
  236. {
  237. _unreadMessages = [[NSMutableDictionary alloc] init];
  238. DDGetUnreadMessageUsersAPI* getUnreadMessageUsersAPI = [[DDGetUnreadMessageUsersAPI alloc] init];
  239. [getUnreadMessageUsersAPI requestWithObject:nil Completion:^(id response, NSError *error) {
  240. if(error) {
  241. DDLog("message#get unread message user count response,%@",error);
  242. return;
  243. }
  244. NSArray* usersArray = (NSArray*)response;
  245. [usersArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
  246. NSString* userID = (NSString*)obj;
  247. DDGetUserUnreadMessagesAPI* getUserUnreadMessageAPI = [[DDGetUserUnreadMessagesAPI alloc] init];
  248. [getUserUnreadMessageAPI requestWithObject:userID Completion:^(id response, NSError *error) {
  249. if(error) {
  250. DDLog("message#get user unread message response,%@",error);
  251. return;
  252. }
  253. NSDictionary* dictionary = (NSDictionary*)response;
  254. NSArray* tempmessages = dictionary[@"msgArray"];
  255. for (int index = [tempmessages count] - 1; index >= 0; index --) {
  256. DDMessageEntity* message = tempmessages[index];
  257. message.state = DDmessageSendSuccess;
  258. if(![message.sessionId isEqualToString:@"1szei2"])
  259. {
  260. NSArray* temp = [self p_spliteMessage:message];
  261. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  262. [temp enumerateObjectsUsingBlock:^(DDMessageEntity *obj, NSUInteger idx, BOOL *stop) {
  263. //如果不是自己法的,插入未读
  264. // if (![message.sessionId isEqualToString:TheRuntime.user.objID]) {
  265. [self addUnreadMessage:obj];
  266. // }else
  267. // {
  268. // //否则直接存入数据库并发送已读ack
  269. // DDSendMessageReadACKAPI* readACKAPI = [[DDSendMessageReadACKAPI alloc] init];
  270. // [readACKAPI requestWithObject:TheRuntime.user.objID Completion:^(id response, NSError *error) {
  271. // }];
  272. // [[DDDatabaseUtil instance]insertMessages:@[obj] success:^{
  273. //
  274. // } failure:^(NSString *errorDescripe) {
  275. // NSLog(@"消息插入DB失败");
  276. // }];
  277. // }
  278. }];
  279. });
  280. }
  281. }
  282. if ([tempmessages count] > 0)
  283. {
  284. [DDNotificationHelp postNotification:DDNotificationUpdateUnReadMessage userInfo:nil object:[NSString stringWithFormat:@"user_%@",userID]];
  285. [[RecentUsersViewController shareInstance] setToolbarBadge];
  286. }
  287. }];
  288. }];
  289. }];
  290. DDUnreadMessageGroupAPI* getUnreadMessageGroupsAPI = [[DDUnreadMessageGroupAPI alloc] init];
  291. [getUnreadMessageGroupsAPI requestWithObject:nil Completion:^(id response, NSError *error) {
  292. NSArray* usersArray = (NSArray*)response;
  293. [usersArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
  294. NSString* groupID = (NSString*)obj;
  295. DDGroupsUnreadMessageAPI* getUserUnreadMessageAPI = [[DDGroupsUnreadMessageAPI alloc] init];
  296. [getUserUnreadMessageAPI requestWithObject:groupID Completion:^(id response, NSError *error) {
  297. NSDictionary* dic = (NSDictionary*)response;
  298. NSString* sessionID = dic[@"sessionId"];
  299. [self removeArrayMessage:sessionID];
  300. NSArray* tempmessages = dic[@"msgArray"];
  301. DDLog("message#get user unread message response,%d,%@",[tempmessages count],groupID);
  302. for (int index = [tempmessages count] - 1; index >= 0; index --) {
  303. DDMessageEntity* message = tempmessages[index];
  304. message.state = DDmessageSendSuccess;
  305. NSArray* temp = [self p_spliteMessage:message];
  306. [temp enumerateObjectsUsingBlock:^(DDMessageEntity *obj, NSUInteger idx, BOOL *stop) {
  307. //如果不是自己发的插入未读消息
  308. NSLog(@"%@----->",TheRuntime.user.objID);
  309. if (![message.sessionId isEqualToString:TheRuntime.user.objID]) {
  310. DDLog(@"read group ack");
  311. [self addUnreadMessage:obj];
  312. }else
  313. {
  314. //否则直接存入数据库并发送已读ack
  315. DDGroupMsgReadACKAPI* readACK = [[DDGroupMsgReadACKAPI alloc] init];
  316. [readACK requestWithObject:message.sessionId Completion:nil];
  317. [[DDDatabaseUtil instance]insertMessages:@[obj] success:^{
  318. } failure:^(NSString *errorDescripe) {
  319. NSLog(@"消息插入DB失败");
  320. }];
  321. }
  322. }];
  323. }
  324. if ([tempmessages count] > 0)
  325. {
  326. [DDNotificationHelp postNotification:DDNotificationUpdateUnReadMessage userInfo:nil object:[NSString stringWithFormat:@"group_%@",groupID]];
  327. [[RecentUsersViewController shareInstance] setToolbarBadge];
  328. }
  329. }];
  330. }];
  331. }];
  332. }
  333. -(void)removeArrayMessage:(NSString*)sessionId
  334. {
  335. if(!sessionId)
  336. return;
  337. [_unreadMessages removeObjectForKey:sessionId];
  338. [self setApplicationUnreadMsgCount];
  339. }
  340. - (void)n_receiveUserLogoutNotification:(NSNotification*)notification
  341. {
  342. _unreadMessages = nil;
  343. _unreadMessages = [[NSMutableDictionary alloc] init];
  344. }
  345. - (NSArray*)p_spliteMessage:(DDMessageEntity*)message
  346. {
  347. NSMutableArray* messageContentArray = [[NSMutableArray alloc] init];
  348. if (message.msgContentType == DDMessageTypeImage || (message.msgContentType == DDMessageTypeText && [message.msgContent rangeOfString:DD_MESSAGE_IMAGE_PREFIX].length > 0))
  349. {
  350. NSString* messageContent = [message msgContent];
  351. NSArray* tempMessageContent = [messageContent componentsSeparatedByString:DD_MESSAGE_IMAGE_PREFIX];
  352. [tempMessageContent enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
  353. NSString* content = (NSString*)obj;
  354. if ([content length] > 0)
  355. {
  356. NSRange suffixRange = [content rangeOfString:DD_MESSAGE_IMAGE_SUFFIX];
  357. if (suffixRange.length > 0)
  358. {
  359. //是图片,再拆分
  360. NSString* imageContent = [NSString stringWithFormat:@"%@%@",DD_MESSAGE_IMAGE_PREFIX,[content substringToIndex:suffixRange.location + suffixRange.length]];
  361. DDMessageEntity* messageEntity = [[DDMessageEntity alloc] initWithMsgID:[DDMessageModule getMessageID] msgType:message.msgType msgTime:message.msgTime sessionID:message.sessionId senderID:message.senderId msgContent:imageContent toUserID:message.toUserID];
  362. messageEntity.msgContentType = DDMessageTypeImage;
  363. messageEntity.state = DDmessageSendSuccess;
  364. [messageContentArray addObject:messageEntity];
  365. NSString* secondComponent = [content substringFromIndex:suffixRange.location + suffixRange.length];
  366. if (secondComponent.length > 0)
  367. {
  368. DDMessageEntity* secondmessageEntity = [[DDMessageEntity alloc] initWithMsgID:[DDMessageModule getMessageID] msgType:message.msgType msgTime:message.msgTime sessionID:message.sessionId senderID:message.senderId msgContent:secondComponent toUserID:message.toUserID];
  369. secondmessageEntity.msgContentType = DDMessageTypeText;
  370. secondmessageEntity.state = DDmessageSendSuccess;
  371. [messageContentArray addObject:secondmessageEntity];
  372. }
  373. }
  374. else
  375. {
  376. DDMessageEntity* messageEntity = [[DDMessageEntity alloc] initWithMsgID:[DDMessageModule getMessageID] msgType:message.msgType msgTime:message.msgTime sessionID:message.sessionId senderID:message.senderId msgContent:content toUserID:message.toUserID];
  377. messageEntity.msgContentType = DDMessageTypeText;
  378. messageEntity.state = DDmessageSendSuccess;
  379. [messageContentArray addObject:messageEntity];
  380. }
  381. }
  382. }];
  383. }
  384. if ([messageContentArray count] == 0)
  385. {
  386. [messageContentArray addObject:message];
  387. }
  388. return messageContentArray;
  389. }
  390. -(void)setApplicationUnreadMsgCount
  391. {
  392. [[UIApplication sharedApplication] setApplicationIconBadgeNumber:[self getUnreadMessgeCount]];
  393. }
  394. @end