diff options
Diffstat (limited to 'src/QuickMedia.cpp')
-rw-r--r-- | src/QuickMedia.cpp | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index 0021f96..4a81219 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -3006,17 +3006,30 @@ namespace QuickMedia { if(messages.empty()) continue; - BodyItem *room_body_item = static_cast<BodyItem*>(room->userdata); - assert(room_body_item); + std::shared_ptr<UserInfo> me = matrix->get_me(room); + time_t read_marker_message_timestamp = 0; + if(me) { + auto read_marker_message = room->get_message_by_id(room->get_user_read_marker(me)); + if(read_marker_message) + read_marker_message_timestamp = read_marker_message->timestamp; + } // TODO: this wont always work because we dont display all types of messages from server, such as "joined", "left", "kicked", "banned", "changed avatar", "changed display name", etc. - bool unread_messages = false; - std::shared_ptr<UserInfo> me = matrix->get_me(room); - if(room->has_unread_mention || (me && room->get_user_read_marker(me) != messages.back()->event_id)) - unread_messages = true; + // TODO: Binary search? + Message *last_unread_message = nullptr; + for(auto &message : messages) { + if(message->related_event_type != RelatedEventType::EDIT && message->related_event_type != RelatedEventType::REDACTION && message->timestamp > read_marker_message_timestamp) + last_unread_message = message.get(); + } + + if(!last_unread_message && !is_first_sync) + continue; - if(unread_messages) { - std::string room_desc = "Unread: " + matrix->message_get_author_displayname(messages.back().get()) + ": " + extract_first_line(messages.back()->body, 150); + BodyItem *room_body_item = static_cast<BodyItem*>(room->userdata); + assert(room_body_item); + + if(last_unread_message) { + std::string room_desc = "Unread: " + matrix->message_get_author_displayname(last_unread_message) + ": " + extract_first_line(last_unread_message->body, 150); if(room->has_unread_mention) room_desc += "\n** You were mentioned **"; // TODO: Better notification? room_body_item->set_description(std::move(room_desc)); @@ -3046,7 +3059,15 @@ namespace QuickMedia { } } } else if(is_first_sync) { - room_body_item->set_description(matrix->message_get_author_displayname(messages.back().get()) + ": " + extract_first_line(messages.back()->body, 150)); + Message *last_unread_message = nullptr; + for(auto it = messages.rbegin(), end = messages.rend(); it != end; ++it) { + if((*it)->related_event_type != RelatedEventType::EDIT && (*it)->related_event_type != RelatedEventType::REDACTION) { + last_unread_message = (*it).get(); + break; + } + } + if(last_unread_message) + room_body_item->set_description(matrix->message_get_author_displayname(last_unread_message) + ": " + extract_first_line(last_unread_message->body, 150)); } } }; @@ -3176,8 +3197,8 @@ namespace QuickMedia { Messages new_messages; if(matrix->get_all_synced_room_messages(current_room, new_messages) == PluginResult::OK) { tabs[MESSAGES_TAB_INDEX].body->insert_items_by_timestamps(messages_to_body_items(new_messages, matrix->get_me(current_room).get())); - tabs[MESSAGES_TAB_INDEX].body->select_last_item(); modify_related_messages_in_current_room(new_messages); + tabs[MESSAGES_TAB_INDEX].body->select_last_item(); } else { std::string err_msg = "Failed to get messages in room: " + current_room->id; show_notification("QuickMedia", err_msg, Urgency::CRITICAL); |