// // MBIMSendMessageOperation.m // kordophoned // // Created by James Magahern on 11/13/18. // Copyright © 2018 James Magahern. All rights reserved. // #import "MBIMSendMessageOperation.h" #import "IMCore_ClassDump.h" @implementation MBIMSendMessageOperation + (void)load { [super load]; } + (NSString *)endpointName { return @"sendMessage"; } - (BOOL)_sendMessage:(NSString *)messageBody toChatWithGUID:(NSString *)chatGUID attachmentGUIDs:(NSArray *)guids { __block BOOL result = YES; dispatch_sync([[self class] sharedIMAccessQueue], ^{ IMChat *chat = [[IMChatRegistry sharedInstance] existingChatWithGUID:chatGUID]; // TODO: chat might not be an iMessage chat! IMAccount *iMessageAccount = [[IMAccountController sharedInstance] bestAccountForService:[IMServiceImpl iMessageService]]; IMHandle *senderHandle = [iMessageAccount loginIMHandle]; NSAttributedString *replyAttrString = [[NSAttributedString alloc] initWithString:messageBody]; NSAttributedString *attrStringWithFileTransfers = IMCreateSuperFormatStringWithAppendedFileTransfers(replyAttrString, guids); IMMessage *reply = [IMMessage fromMeIMHandle:senderHandle withText:attrStringWithFileTransfers fileTransferGUIDs:guids flags:(kIMMessageFinished | kIMMessageIsFromMe)]; for (NSString *guid in [reply fileTransferGUIDs]) { [[IMFileTransferCenter sharedInstance] assignTransfer:guid toHandle:chat.recipient]; } if (!chat) { MBIMLogInfo(@"Chat does not exist: %@", chatGUID); result = NO; } else { dispatch_async(dispatch_get_main_queue(), ^{ [chat sendMessage:reply]; }); } }); return result; } - (void)main { NSObject *response = [[HTTPErrorResponse alloc] initWithErrorCode:500]; NSError *error = nil; NSDictionary *args = [NSJSONSerialization JSONObjectWithData:self.requestBodyData options:0 error:&error]; if (error || args.count == 0) { self.serverCompletionBlock(response); return; } NSString *guid = [args objectForKey:@"guid"]; NSString *messageBody = [args objectForKey:@"body"]; if (!guid || !messageBody) { self.serverCompletionBlock(response); return; } NSArray *transferGUIDs = [args objectForKey:@"fileTransferGUIDs"]; if (!transferGUIDs) { transferGUIDs = @[]; } BOOL result = [self _sendMessage:messageBody toChatWithGUID:guid attachmentGUIDs:transferGUIDs]; if (result) { response = [[HTTPErrorResponse alloc] initWithErrorCode:200]; } self.serverCompletionBlock(response); } @end