From 927f44ac685cdd3c34967b8947cc4191573fd753 Mon Sep 17 00:00:00 2001 From: ryanzhao Date: Tue, 31 May 2022 16:00:36 +1000 Subject: [PATCH] sending & receiving --- .../ConversationVC+Interaction.swift | 2 +- SessionMessagingKit/Jobs/MessageSendJob.swift | 2 +- .../Messages/Signal/TSMessage.m | 3 +++ .../Visible Messages/VisibleMessage.swift | 2 +- .../Emoji Reacts/ReactMessage.swift | 14 ++++++++++++ .../MessageReceiver+Handling.swift | 22 +++++++++++++++++++ 6 files changed, 42 insertions(+), 3 deletions(-) diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index 30e8dddaf..e299ffc67 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -852,7 +852,7 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc else { message.addReaction(reactMessage, transaction: transaction) } - // MessageSender.send(visibleMessage, in: thread, using: transaction) + MessageSender.send(visibleMessage, in: thread, using: transaction) } } diff --git a/SessionMessagingKit/Jobs/MessageSendJob.swift b/SessionMessagingKit/Jobs/MessageSendJob.swift index 1a302c174..3be60900f 100644 --- a/SessionMessagingKit/Jobs/MessageSendJob.swift +++ b/SessionMessagingKit/Jobs/MessageSendJob.swift @@ -75,7 +75,7 @@ public final class MessageSendJob : NSObject, Job, NSCoding { // NSObject/NSCodi } let storage = SNMessagingKitConfiguration.shared.storage if let message = message as? VisibleMessage { - guard TSOutgoingMessage.find(withTimestamp: message.sentTimestamp!) != nil else { return } // The message has been deleted + guard TSOutgoingMessage.find(withTimestamp: message.sentTimestamp!) != nil || message.reaction != nil else { return } // The message has been deleted let attachments = message.attachmentIDs.compactMap { TSAttachment.fetch(uniqueId: $0) as? TSAttachmentStream } let attachmentsToUpload = attachments.filter { !$0.isUploaded } attachmentsToUpload.forEach { attachment in diff --git a/SessionMessagingKit/Messages/Signal/TSMessage.m b/SessionMessagingKit/Messages/Signal/TSMessage.m index 7a8d4e845..088f5d639 100644 --- a/SessionMessagingKit/Messages/Signal/TSMessage.m +++ b/SessionMessagingKit/Messages/Signal/TSMessage.m @@ -464,6 +464,9 @@ const NSUInteger kOversizeTextMessageSizeThreshold = 2 * 1024; changeBlock:^(TSMessage *message) { if (![message.reactions containsObject:reaction]) { [message.reactions addObject:reaction]; + } else { + NSUInteger index = [message.reactions indexOfObject:reaction]; + [message.reactions replaceObjectAtIndex:index withObject:reaction]; } }]; } diff --git a/SessionMessagingKit/Messages/Visible Messages/VisibleMessage.swift b/SessionMessagingKit/Messages/Visible Messages/VisibleMessage.swift index b35186428..4464fbb5b 100644 --- a/SessionMessagingKit/Messages/Visible Messages/VisibleMessage.swift +++ b/SessionMessagingKit/Messages/Visible Messages/VisibleMessage.swift @@ -110,7 +110,7 @@ public final class VisibleMessage : Message { // Open group invitation if let openGroupInvitation = openGroupInvitation, let openGroupInvitationProto = openGroupInvitation.toProto() { dataMessage.setOpenGroupInvitation(openGroupInvitationProto) } // Emoji react - if let reaction = reaction, let reactionProto = reaction.toProto() { + if let reaction = reaction, let reactionProto = reaction.toProto(using: transaction) { dataMessage.setReaction(reactionProto) } // Group context diff --git a/SessionMessagingKit/Sending & Receiving/Emoji Reacts/ReactMessage.swift b/SessionMessagingKit/Sending & Receiving/Emoji Reacts/ReactMessage.swift index 40b6c2f13..c3eed2cf7 100644 --- a/SessionMessagingKit/Sending & Receiving/Emoji Reacts/ReactMessage.swift +++ b/SessionMessagingKit/Sending & Receiving/Emoji Reacts/ReactMessage.swift @@ -36,4 +36,18 @@ public final class ReactMessage : MTLModel { public required init(dictionary dictionaryValue: [String: Any]!) throws { try super.init(dictionary: dictionaryValue) } + + @objc + public func isSelfReact() -> Bool { + return sender == getUserHexEncodedPublicKey() + } + + @objc + public override func isEqual(_ object: Any!) -> Bool { + guard let other = object as? ReactMessage else { return false } + return other.sender == self.sender && + other.emoji == self.emoji && + other.timestamp == self.timestamp && + other.authorId == self.authorId + } } diff --git a/SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift b/SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift index e3d69d3ea..9b72c6c84 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift @@ -376,6 +376,28 @@ extension MessageReceiver { } // Get or create thread guard let threadID = storage.getOrCreateThread(for: message.syncTarget ?? message.sender!, groupPublicKey: message.groupPublicKey, openGroupID: openGroupID, using: transaction) else { throw Error.noThread } + // Handle emoji reacts first + if let reaction = message.reaction, proto.dataMessage?.reaction != nil, let author = reaction.publicKey, let timestamp = reaction.timestamp { + var tsMessage: TSMessage? + if author == getUserHexEncodedPublicKey() { + tsMessage = TSOutgoingMessage.find(withTimestamp: timestamp) + } else { + tsMessage = TSIncomingMessage.find(withAuthorId: author, timestamp: timestamp, transaction: transaction) + } + let reactionMessage = ReactMessage(timestamp: timestamp, authorId: author, emoji: reaction.emoji) + reactionMessage.sender = message.sender + if let serverID = message.openGroupServerMessageID { reactionMessage.messageId = "\(serverID)" } + if let serverHash = message.serverHash { reactionMessage.messageId = serverHash } + switch reaction.kind { + case .react: + tsMessage?.addReaction(reactionMessage, transaction: transaction) + case .remove: + tsMessage?.removeReaction(reactionMessage, transaction: transaction) + case .none: + break + } + return "" + } // Parse quote if needed var tsQuotedMessage: TSQuotedMessage? = nil if message.quote != nil && proto.dataMessage?.quote != nil, let thread = TSThread.fetch(uniqueId: threadID, transaction: transaction) {