Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for iMessage replies #16

Open
Hoodgail opened this issue Jul 3, 2022 · 2 comments
Open

Add support for iMessage replies #16

Hoodgail opened this issue Jul 3, 2022 · 2 comments
Labels
enhancement New feature or request

Comments

@Hoodgail
Copy link

Hoodgail commented Jul 3, 2022

Do you see how imessage shows what message is being replied to?
image
Will there be such features for airmessage? doesnt need to have the same interface as imessage
image (5)
It could even look something simple like discord's

And later on add to support to reply from airmessage.
maybe a context menu on right click with the reply button.

@tagavari
Copy link
Member

tagavari commented Jul 3, 2022

Currently, AirMessage Server will ignore message replies. The server can be updated to include message reply information and allow clients to display when a message is a reply. However, similar to tapbacks, AirMessage cannot allow the user to initiate replies without privilege escalation.

As this functionality would have to first be supported by AirMessage Server, this issue is also being moved there.

@tagavari tagavari transferred this issue from airmessage/airmessage-web Jul 3, 2022
@tagavari tagavari added the enhancement New feature or request label Jul 3, 2022
@tagavari tagavari changed the title Replies Add support for iMessage replies Jul 3, 2022
@tagavari tagavari moved this to Changes in consideration in AirMessage task board Jul 3, 2022
@sabogalc
Copy link

sabogalc commented Jul 17, 2022

Here is some information from @tneotia on supporting replies. Original link

@iandwelker in case you want to implement this:

  1. To render replies, you'd want to pull the thread_originator_guid column from chat.db. You can kinda see in here (the line renderer), here (the message bubble itself that decides whether the line should get rendered), and here (code that does some of the processing of whether the message is a reply, whether it should show the reply line, how that reply line is gonna look, etc)
  2. To send replies, refer to the following objc code:
// get the chat
    IMChat *chat = [BlueBubblesHelper getChat: data[@"chatGuid"]];
// get the message text
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString: data[@"message"]];
// get the subject line, if any
    NSMutableAttributedString *subjectAttributedString = nil;
    if ([data objectForKey:(@"subject")] != [NSNull null]) {
        subjectAttributedString = [[NSMutableAttributedString alloc] initWithString: data[@"subject"]];
    }
// get the effect ID, if any
    NSString *effectId = nil;
    if ([data objectForKey:(@"effectId")] != [NSNull null]) {
        effectId = data[@"effectId"];
    }
    
// helper function to create a message
    void (^createMessage)(NSAttributedString*, NSAttributedString*, NSString*, NSString*) = ^(NSAttributedString *message, NSAttributedString *subject, NSString *effectId, NSString *threadIdentifier) {
// init an IMMessage with the text, subject, and effect ID
        IMMessage *messageToSend = [[IMMessage alloc] init];
        messageToSend = [messageToSend initWithSender:(nil) time:(nil) text:(message) messageSubject:(subject) fileTransferGUIDs:(nil) flags:(100005) error:(nil) guid:(nil) subject:(nil) balloonBundleID:(nil) payloadData:(nil) expressiveSendStyleID:(effectId)];
// add the thread ID for the reply
        messageToSend.threadIdentifier = threadIdentifier;
// send it
        [chat sendMessage:(messageToSend)];
    };
    
    if ([data objectForKey:(@"selectedMessageGuid")] != [NSNull null]) {
// get the message being replied to
        [BlueBubblesHelper getMessageItem:(chat) :(data[@"selectedMessageGuid"]) completionBlock:^(IMMessage *message) {
// get the specific IMMessagePartChatItem out of the message
            IMMessageItem *messageItem = (IMMessageItem *)message._imMessageItem;
            NSObject *items = messageItem._newChatItems;
            IMMessagePartChatItem *item;
            // sometimes items is an array so we need to account for that
            if ([items isKindOfClass:[NSArray class]]) {
                for(IMMessagePartChatItem* imci in (NSArray *)items) {
                    if([imci._item.guid isEqualToString:(data[@"selectedMessageGuid"])]) {
                        DLog(@"BLUEBUBBLESHELPER: %@", data[@"selectedMessageGuid"]);
                        item = imci;
                    }
                }
            } else {
                item = (IMMessagePartChatItem *)items;
            }
            NSString *identifier = @"";
// either reply to an existing thread or create a new thread
            if (message.threadIdentifier != nil) {
                identifier = message.threadIdentifier;
            } else {
                identifier = IMCreateThreadIdentifierForMessagePartChatItem(item);
            }
            createMessage(attributedString, subjectAttributedString, effectId, identifier);
        }];
    }

If you got more questions lmk!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
Status: Changes in consideration
Development

No branches or pull requests

3 participants