aboutsummaryrefslogtreecommitdiff
path: root/src/QuickMedia.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/QuickMedia.cpp')
-rw-r--r--src/QuickMedia.cpp63
1 files changed, 59 insertions, 4 deletions
diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp
index 1bb7a04..d9b1041 100644
--- a/src/QuickMedia.cpp
+++ b/src/QuickMedia.cpp
@@ -3076,7 +3076,7 @@ namespace QuickMedia {
body_item->url = message->url;
body_item->set_author_color(message->user->display_name_color);
body_item->userdata = (void*)message; // Note: message has to be valid as long as body_item is used!
- if(message->related_event_type == RelatedEventType::REDACTION || message->related_event_type == RelatedEventType::EDIT)
+ if(message->related_event_type == RelatedEventType::REDACTION || message->related_event_type == RelatedEventType::EDIT || message->related_event_type == RelatedEventType::REACTION)
body_item->visible = false;
if(message_contains_user_mention(message->body, my_display_name) || message_contains_user_mention(message->body, my_user_id))
body_item->set_description_color(sf::Color(255, 100, 100));
@@ -3218,8 +3218,8 @@ namespace QuickMedia {
body_item->embedded_item = nullptr;
body_item->embedded_item_status = FetchStatus::NONE;
message->type = MessageType::REDACTION;
- message->related_event_id.clear();
- message->related_event_type = RelatedEventType::NONE;
+ //message->related_event_id.clear();
+ //message->related_event_type = RelatedEventType::NONE;
body_item->thumbnail_url = current_room->get_user_avatar_url(message->user);
body_item->thumbnail_mask_type = ThumbnailMaskType::CIRCLE;
body_item->set_description("Message deleted");
@@ -3253,7 +3253,7 @@ namespace QuickMedia {
}
};
- // TODO: Optimize with hash map?
+ // TODO: Optimize find_body_item_by_event_id hash map?
auto modify_related_messages_in_current_room = [&set_body_as_deleted, &unreferenced_events, &find_body_item_by_event_id, &tabs](Messages &messages) {
if(messages.empty())
return;
@@ -3279,6 +3279,53 @@ namespace QuickMedia {
}
};
+ std::vector<std::shared_ptr<Message>> unresolved_reactions;
+ // TODO: Optimize find_body_item_by_event_id hash map?
+ auto process_reactions = [&tabs, &find_body_item_by_event_id, &unresolved_reactions, &current_room](Messages &messages) {
+ if(messages.empty())
+ return;
+
+ auto &body_items = tabs[MESSAGES_TAB_INDEX].body->items;
+
+ // TODO: Check in |messages| instead
+ for(auto it = unresolved_reactions.begin(); it != unresolved_reactions.end();) {
+ auto body_item = find_body_item_by_event_id(body_items.data(), body_items.size(), (*it)->related_event_id);
+ if(body_item) {
+ body_item->add_reaction(current_room->get_user_display_name((*it)->user) + ": " + (*it)->body, (*it).get());
+ it = unresolved_reactions.erase(it);
+ } else {
+ ++it;
+ }
+ }
+
+ for(auto &message : messages) {
+ if(message->type == MessageType::REACTION) {
+ auto body_item = find_body_item_by_event_id(body_items.data(), body_items.size(), message->related_event_id);
+ if(body_item)
+ body_item->add_reaction(current_room->get_user_display_name(message->user) + ": " + message->body, message.get());
+ else
+ unresolved_reactions.push_back(message);
+ } else if(message->type == MessageType::REDACTION) {
+ auto body_item = find_body_item_by_event_id(body_items.data(), body_items.size(), message->related_event_id);
+ if(body_item && static_cast<Message*>(body_item->userdata)) {
+ Message *reaction_message = static_cast<Message*>(body_item->userdata);
+ if(reaction_message->type == MessageType::REACTION) {
+ auto body_item = find_body_item_by_event_id(body_items.data(), body_items.size(), reaction_message->related_event_id);
+ if(body_item)
+ body_item->remove_reaction_by_userdata(reaction_message);
+ }
+ } else {
+ for(auto it = unresolved_reactions.begin(); it != unresolved_reactions.end(); ++it) {
+ if(message->related_event_id == (*it)->event_id) {
+ unresolved_reactions.erase(it);
+ break;
+ }
+ }
+ }
+ }
+ }
+ };
+
auto pinned_body_items_contains_event = [&tabs](const std::string &event_id) {
for(auto &body_item : tabs[PINNED_TAB_INDEX].body->items) {
if(static_cast<PinnedEventData*>(body_item->userdata)->event_id == event_id)
@@ -3345,6 +3392,7 @@ namespace QuickMedia {
auto me = matrix->get_me(current_room);
tabs[MESSAGES_TAB_INDEX].body->insert_items_by_timestamps(messages_to_body_items(current_room, all_messages, current_room->get_user_display_name(me), me->user_id));
modify_related_messages_in_current_room(all_messages);
+ process_reactions(all_messages);
tabs[MESSAGES_TAB_INDEX].body->select_last_item();
std::vector<std::string> pinned_events;
@@ -4059,6 +4107,8 @@ namespace QuickMedia {
if((selected_tab == MESSAGES_TAB_INDEX || selected_tab == PINNED_TAB_INDEX) && event.key.code == sf::Keyboard::Enter) {
BodyItem *selected = tabs[selected_tab].body->get_selected();
if(selected) {
+ Message *mess = static_cast<Message*>(selected->userdata);
+ fprintf(stderr, "Mess type: %d\n", mess->type);
if(!display_url_or_image(selected))
display_url_or_image(selected->embedded_item.get());
}
@@ -4268,6 +4318,7 @@ namespace QuickMedia {
cleanup_tasks();
tabs.clear();
unreferenced_events.clear();
+ unresolved_reactions.clear();
all_messages.clear();
new_page = PageType::CHAT;
matrix->stop_sync();
@@ -4388,6 +4439,7 @@ namespace QuickMedia {
}
add_new_messages_to_current_room(sync_data.messages);
modify_related_messages_in_current_room(sync_data.messages);
+ process_reactions(sync_data.messages);
process_pinned_events(sync_data.pinned_events);
if(set_read_marker_future.ready()) {
@@ -4418,6 +4470,7 @@ namespace QuickMedia {
tabs[MESSAGES_TAB_INDEX].body->set_selected_item(selected_item_index);
}
modify_related_messages_in_current_room(new_messages);
+ process_reactions(new_messages);
// TODO: Do not loop all items, only loop the new items
resolve_unreferenced_events_with_body_items(tabs[MESSAGES_TAB_INDEX].body->items.data(), tabs[MESSAGES_TAB_INDEX].body->items.size());
}
@@ -4653,6 +4706,8 @@ namespace QuickMedia {
filter_sent_messages(all_messages_new);
add_new_messages_to_current_room(all_messages_new);
modify_related_messages_in_current_room(all_messages_new);
+ unresolved_reactions.clear();
+ process_reactions(all_messages_new);
std::vector<std::string> pinned_events;
matrix->get_all_pinned_events(current_room, pinned_events);