From c65a57e884de51cade584e3f01c7c5627aa6ebd8 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Mon, 7 Nov 2022 14:23:49 +0100 Subject: Matrix: fix edit being replaced with old message when re-entering the room (without restart) Add quote colors to 4chan, monospace for codeblocks --- src/QuickMedia.cpp | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) (limited to 'src/QuickMedia.cpp') diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index 80ae146..d72f465 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -5307,7 +5307,7 @@ namespace QuickMedia { *body_item->embedded_item = *related_body_item; body_item->embedded_item->embedded_item = nullptr; body_item->embedded_item->reactions.clear(); - if(message->user->user_id != my_user_id && ((related_body_item->userdata && static_cast(related_body_item->userdata)->user.get() == me) || message_contains_user_mention(body_item->get_description(), my_display_name) || message_contains_user_mention(body_item->get_description(), my_user_id))) + if(message->user->user_id != my_user_id && ((related_body_item->userdata && static_cast(related_body_item->userdata)->user.get() == me) || message_contains_user_mention(body_item, my_display_name, my_user_id))) body_item->set_description_color(get_theme().attention_alert_text_color, true); else body_item->set_description_color(get_theme().text_color); @@ -5322,7 +5322,7 @@ namespace QuickMedia { static std::shared_ptr message_to_body_item(RoomData *room, Message *message, const std::string &my_display_name, const std::string &my_user_id) { auto body_item = BodyItem::create(""); body_item->set_author(extract_first_line_remove_newline_elipses(room->get_user_display_name(message->user), AUTHOR_MAX_LENGTH)); - body_item->set_description(strip(formatted_text_to_qm_text(message->body.c_str(), message->body.size()))); + body_item->set_description(strip(formatted_text_to_qm_text(message->body.c_str(), message->body.size(), true))); body_item->set_timestamp(message->timestamp); if(!message->thumbnail_url.empty()) { body_item->thumbnail_url = message->thumbnail_url; @@ -5352,7 +5352,7 @@ namespace QuickMedia { body_item->set_description_color(get_theme().faded_text_color); body_item->thumbnail_url.clear(); } - if(message->user->user_id != my_user_id && (message_contains_user_mention(body_item->get_description(), my_display_name) || message_contains_user_mention(body_item->get_description(), my_user_id))) + if(message->user->user_id != my_user_id && message_contains_user_mention(body_item.get(), my_display_name, my_user_id)) body_item->set_description_color(get_theme().attention_alert_text_color, true); return body_item; } @@ -5651,16 +5651,16 @@ namespace QuickMedia { } else { // TODO: Properly check reply message objects for mention of user instead of message data, but only when synapse fixes that notifications // are not triggered by reply to a message with our display name/user id. - Message *reply_to_message = static_cast(body_item->userdata); - std::string qm_formatted_text = formatted_text_to_qm_text(reply_to_message->body.c_str(), reply_to_message->body.size()); + Message *edited_message_ref = static_cast(body_item->userdata); + std::string qm_formatted_text = formatted_text_to_qm_text(message->body.c_str(), message->body.size(), true); body_item->set_description(std::move(qm_formatted_text)); - if(message->user != me && (message_contains_user_mention(reply_to_message->body, my_display_name) || message_contains_user_mention(reply_to_message->body, me->user_id))) + if(message->user != me && message_contains_user_mention(message.get(), my_display_name, me->user_id)) body_item->set_description_color(get_theme().attention_alert_text_color, true); else body_item->set_description_color(get_theme().text_color); - message->replaces = reply_to_message; - reply_to_message->replaced_by = message; + message->replaces = edited_message_ref; + edited_message_ref->replaced_by = message; } it = unreferenced_events.erase(it); } else { @@ -5692,16 +5692,16 @@ namespace QuickMedia { } else { // TODO: Properly check reply message objects for mention of user instead of message data, but only when synapse fixes that notifications // are not triggered by reply to a message with our display name/user id. - Message *reply_to_message = static_cast(body_item->userdata); - std::string qm_formatted_text = formatted_text_to_qm_text(reply_to_message->body.c_str(), reply_to_message->body.size()); + Message *edited_message_ref = static_cast(body_item->userdata); + std::string qm_formatted_text = formatted_text_to_qm_text(message->body.c_str(), message->body.size(), true); body_item->set_description(std::move(qm_formatted_text)); - if(message->user != me && (message_contains_user_mention(reply_to_message->body, my_display_name) || message_contains_user_mention(reply_to_message->body, me->user_id))) + if(message->user != me && message_contains_user_mention(message.get(), my_display_name, me->user_id)) body_item->set_description_color(get_theme().attention_alert_text_color, true); else body_item->set_description_color(get_theme().text_color); - message->replaces = reply_to_message; - reply_to_message->replaced_by = message; + message->replaces = edited_message_ref; + edited_message_ref->replaced_by = message; } } else { unreferenced_events.push_back(message); @@ -6194,14 +6194,17 @@ namespace QuickMedia { tabs[MESSAGES_TAB_INDEX].body->select_last_item(); return true; } else if(chat_state == ChatState::EDITING) { - void *related_to_message = currently_operating_on_item->userdata; + Message *related_to_message = (Message*)currently_operating_on_item->userdata; message->related_event_type = RelatedEventType::EDIT; - message->related_event_id = static_cast(related_to_message)->event_id; + message->related_event_id = related_to_message->event_id; + // TODO: + //related_to_message->replaced_by = message; + //message->replaces = related_to_message; size_t body_item_index = 0; auto body_item = find_body_item_by_event_id(tabs[MESSAGES_TAB_INDEX].body->get_items().data(), tabs[MESSAGES_TAB_INDEX].body->get_items().size(), message->related_event_id, &body_item_index); if(body_item) { const std::string formatted_text = matrix->body_to_formatted_body(current_room, text); - std::string qm_formatted_text = formatted_text_to_qm_text(formatted_text.c_str(), formatted_text.size()); + std::string qm_formatted_text = formatted_text_to_qm_text(formatted_text.c_str(), formatted_text.size(), true); auto body_item_shared_ptr = tabs[MESSAGES_TAB_INDEX].body->get_item_by_index(body_item_index); body_item_shared_ptr->set_description(std::move(qm_formatted_text)); @@ -6298,7 +6301,7 @@ namespace QuickMedia { if(related_body_item) { *body_item = *related_body_item; body_item->reactions.clear(); - if(message_contains_user_mention(related_body_item->get_description(), current_room->get_user_display_name(me)) || message_contains_user_mention(related_body_item->get_description(), me->user_id)) + if(message_contains_user_mention(related_body_item.get(), current_room->get_user_display_name(me), me->user_id)) body_item->set_description_color(get_theme().attention_alert_text_color, true); else body_item->set_description_color(get_theme().text_color); @@ -6698,7 +6701,7 @@ namespace QuickMedia { }); }; - auto cleanup_tasks = [&set_read_marker_future, &fetch_message_future, &fetch_users_future, &typing_state_queue, &typing_state_thread, &post_task_queue, &provisional_message_queue, &fetched_messages_set, &sent_messages, &pending_sent_replies, &post_thread, &tabs, MESSAGES_TAB_INDEX, PINNED_TAB_INDEX, USERS_TAB_INDEX]() { + auto cleanup_tasks = [&]() { set_read_marker_future.cancel(); fetch_message_future.cancel(); fetch_users_future.cancel(); @@ -6730,6 +6733,7 @@ namespace QuickMedia { } //tabs.clear(); + matrix->on_exit_room(current_room); }; // TODO: Remove this once synapse bug has been resolved where /sync does not include user info for new messages when using message filter that limits number of messages for initial sync, -- cgit v1.2.3