From 7339b49759030f6a90783b9cd4b5481219819750 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Fri, 9 May 2025 23:39:16 -0700 Subject: [PATCH] Encoding: need to include associated chat item guids. Beginning to understand associated chat items (reactions, etc). --- Dumped Classes/IMSharedUtilities_ClassDump.h | 1 + kordophone/Categories/IMChat+Encoded.m | 7 +++ kordophone/Categories/IMMessageItem+Encoded.m | 43 +++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/Dumped Classes/IMSharedUtilities_ClassDump.h b/Dumped Classes/IMSharedUtilities_ClassDump.h index 9945a4f..f3f25b5 100644 --- a/Dumped Classes/IMSharedUtilities_ClassDump.h +++ b/Dumped Classes/IMSharedUtilities_ClassDump.h @@ -1704,3 +1704,4 @@ extern NSURL* IMAttachmentPreviewFileURL(NSURL *attachmentURL, NSString *extensi - (id)initWithSerializedError_im:(struct NSDictionary *)arg1; @end +extern NSString *IMAssociatedMessageDecodeGUID(NSString* guid); diff --git a/kordophone/Categories/IMChat+Encoded.m b/kordophone/Categories/IMChat+Encoded.m index 7cdad49..c852d94 100644 --- a/kordophone/Categories/IMChat+Encoded.m +++ b/kordophone/Categories/IMChat+Encoded.m @@ -20,6 +20,13 @@ chatDict[@"date"] = MBIMWebServerFormatISO8601([self lastFinishedMessageDate]); chatDict[@"unreadCount"] = @([self unreadMessageCount]); + // NOTE: -[IMChat lastMessage] != -[[IMChat chatItems] lastMessage]. + // This means the messages we get back from the message list operation might be different from this here, which means we + // can't reliably use `lastMessage.guid` as a sync anchor. + // + // Ideally, everything should move to use chat items instead of messages so we can handle associated message items (reactions). + // When that happens, we should use `lastFinishedMessageItem` here instead of `lastMessage`, and avoid the db hit. + // IMMessage *lastMessage = [self lastMessage]; if (lastMessage) { NSString *lastMessagePreview = [lastMessage descriptionForPurpose:IMMessageDescriptionConversationList]; diff --git a/kordophone/Categories/IMMessageItem+Encoded.m b/kordophone/Categories/IMMessageItem+Encoded.m index aeaead6..a4edf11 100644 --- a/kordophone/Categories/IMMessageItem+Encoded.m +++ b/kordophone/Categories/IMMessageItem+Encoded.m @@ -9,6 +9,40 @@ #import "IMMessageItem+Encoded.h" #import "MBIMHTTPUtilities.h" +static NSString* IMAssociatedMessageTypeValue(IMAssociatedMessageType type) { + switch (type) { + case IMAssociatedMessageTypeAcknowledgmentHeart: + return @"heart"; + case IMAssociatedMessageTypeAcknowledgmentThumbsUp: + return @"thumbsUp"; + case IMAssociatedMessageTypeAcknowledgmentThumbsDown: + return @"thumbsDown"; + case IMAssociatedMessageTypeAcknowledgmentHa: + return @"ha"; + case IMAssociatedMessageTypeAcknowledgmentExclamation: + return @"exclamation"; + case IMAssociatedMessageTypeAcknowledgmentQuestionMark: + return @"questionMark"; + + case IMAssociatedMessageTypeAcknowledgmentHeartRemoved: + return @"removed heart"; + case IMAssociatedMessageTypeAcknowledgmentThumbsUpRemoved: + return @"removed thumbsUp"; + case IMAssociatedMessageTypeAcknowledgmentThumbsDownRemoved: + return @"removed thumbsDown"; + case IMAssociatedMessageTypeAcknowledgmentHaRemoved: + return @"removed ha"; + case IMAssociatedMessageTypeAcknowledgmentExclamationRemoved: + return @"removed exclamation"; + case IMAssociatedMessageTypeAcknowledgmentQuestionMarkRemoved: + return @"removed questionMark"; + + case IMAssociatedMessageTypeUnspecified: + default: + return @"unknown"; + } +} + @implementation IMMessage (Encoded) - (NSDictionary *)mbim_dictionaryRepresentation @@ -19,6 +53,15 @@ messageDict[@"sender"] = ([self isFromMe] ? nil : [[self sender] displayID]); // TODO: nil sender is still a weird way to represent this... messageDict[@"guid"] = [self guid]; + if ([self associatedMessageGUID]) { + NSString *encodedAssociatedMessageGUID = [self associatedMessageGUID]; + messageDict[@"associatedMessageGUID"] = encodedAssociatedMessageGUID; + messageDict[@"associatedMessageType"] = IMAssociatedMessageTypeValue([self associatedMessageType]); + + NSString *decodedAssociatedChatItemGUID = IMAssociatedMessageDecodeGUID(encodedAssociatedMessageGUID); + if (decodedAssociatedChatItemGUID) messageDict[@"associatedChatItemGUID"] = decodedAssociatedChatItemGUID; + } + if ([self fileTransferGUIDs]) { // Support only images right now NSMutableDictionary *attachmentMetadatas = [NSMutableDictionary dictionary];