diff options
Diffstat (limited to 'src/QuickMedia.cpp')
-rw-r--r-- | src/QuickMedia.cpp | 59 |
1 files changed, 33 insertions, 26 deletions
diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp index 71ba8d2..f66d419 100644 --- a/src/QuickMedia.cpp +++ b/src/QuickMedia.cpp @@ -3364,7 +3364,8 @@ namespace QuickMedia { std::string event_id; }; - std::vector<ProvisionalMessage> unresolved_provisional_messages; // |event_id| is always empty in this. Use |message->event_id| instead + // This is needed to keep the message shared ptr alive. TODO: Remove this shit, maybe even use raw pointers. + std::unordered_map<std::string, ProvisionalMessage> sent_messages; // |event_id| is always empty in this. Use |message->event_id| instead std::optional<ProvisionalMessage> provisional_message; MessageQueue<ProvisionalMessage> provisional_message_queue; MessageQueue<std::function<ProvisionalMessage()>> post_task_queue; @@ -3378,22 +3379,21 @@ namespace QuickMedia { }; std::thread post_thread(post_thread_handler); - auto resolve_provisional_messages = [&unresolved_provisional_messages](Messages &messages) { - if(messages.empty() || unresolved_provisional_messages.empty()) - return; + auto filter_my_messages = [&me](Messages &messages) { + for(auto it = messages.begin(); it != messages.end();) { + if((*it)->user == me) + it = messages.erase(it); + else + ++it; + } + }; - for(auto it = unresolved_provisional_messages.begin(); it != unresolved_provisional_messages.end();) { - auto find_it = std::find_if(messages.cbegin(), messages.cend(), [&it](const std::shared_ptr<Message> &message) { - return message->event_id == it->message->event_id; - }); - if(find_it != messages.end()) { - it->body_item->set_description_color(sf::Color::White); - it->body_item->userdata = find_it->get(); // This is ok because the message is added to |all_messages| - it = unresolved_provisional_messages.erase(it); - messages.erase(find_it); - } else { + auto filter_sent_messages = [&sent_messages](Messages &messages) { + for(auto it = messages.begin(); it != messages.end();) { + if(sent_messages.find((*it)->event_id) != sent_messages.end()) + it = messages.erase(it); + else ++it; - } } }; @@ -3414,7 +3414,7 @@ namespace QuickMedia { tabs[MESSAGES_TAB_INDEX].body->select_last_item(); } }; - + chat_input.on_submit_callback = [this, &tabs, &me, &chat_input, &selected_tab, ¤t_room, &new_page, &chat_state, ¤tly_operating_on_item, &post_task_queue, &unreferenced_events, &find_body_item_by_event_id](std::string text) mutable { if(!current_room) return false; @@ -3509,14 +3509,17 @@ namespace QuickMedia { void *related_to_message = currently_operating_on_item->userdata; message->related_event_type = RelatedEventType::EDIT; message->related_event_id = static_cast<Message*>(related_to_message)->event_id; - auto body_item = find_body_item_by_event_id(tabs[MESSAGES_TAB_INDEX].body->items.data(), tabs[MESSAGES_TAB_INDEX].body->items.size(), message->related_event_id); + size_t body_item_index = 0; + auto body_item = find_body_item_by_event_id(tabs[MESSAGES_TAB_INDEX].body->items.data(), tabs[MESSAGES_TAB_INDEX].body->items.size(), message->related_event_id, &body_item_index); if(body_item) { - body_item->set_description(text); - body_item->set_description_color(provisional_message_color); - unreferenced_events.push_back(message); - post_task_queue.push([this, ¤t_room, text, related_to_message, message]() { + auto body_item_shared_ptr = tabs[MESSAGES_TAB_INDEX].body->items[body_item_index]; + body_item_shared_ptr->set_description(text); + body_item_shared_ptr->set_description_color(provisional_message_color); + //unreferenced_events.push_back(message); + post_task_queue.push([this, ¤t_room, text, related_to_message, message, body_item_shared_ptr]() { ProvisionalMessage provisional_message; provisional_message.message = message; + provisional_message.body_item = body_item_shared_ptr; if(matrix->post_edit(current_room, text, related_to_message, provisional_message.event_id) != PluginResult::OK) fprintf(stderr, "Failed to post matrix edit\n"); return provisional_message; @@ -3900,7 +3903,7 @@ namespace QuickMedia { } }; - auto cleanup_tasks = [&set_read_marker_future, &fetch_message_future, &typing_state_queue, &typing_state_thread, &post_task_queue, &provisional_message_queue, &post_thread, &tabs]() { + auto cleanup_tasks = [&set_read_marker_future, &fetch_message_future, &typing_state_queue, &typing_state_thread, &post_task_queue, &provisional_message_queue, &fetched_messages_set, &sent_messages, &post_thread, &tabs]() { set_read_marker_future.cancel(); fetch_message_future.cancel(); typing_state_queue.close(); @@ -3914,6 +3917,8 @@ namespace QuickMedia { post_thread.join(); } provisional_message_queue.clear(); + fetched_messages_set.clear(); + sent_messages.clear(); //unreferenced_event_by_room.clear(); @@ -4327,7 +4332,8 @@ namespace QuickMedia { if(!provisional_message->event_id.empty()) { provisional_message->message->event_id = std::move(provisional_message->event_id); - unresolved_provisional_messages.push_back(provisional_message.value()); + provisional_message->body_item->set_description_color(sf::Color::White); + sent_messages[provisional_message->message->event_id] = std::move(provisional_message.value()); } else if(provisional_message->body_item) { provisional_message->body_item->set_description("Failed to send: " + provisional_message->body_item->get_description()); provisional_message->body_item->set_description_color(sf::Color::Red); @@ -4340,7 +4346,7 @@ namespace QuickMedia { matrix->get_room_sync_data(current_room, sync_data); if(!sync_data.messages.empty()) { all_messages.insert(all_messages.end(), sync_data.messages.begin(), sync_data.messages.end()); - resolve_provisional_messages(sync_data.messages); + filter_my_messages(sync_data.messages); filter_existing_messages(sync_data.messages); } add_new_messages_to_current_room(sync_data.messages); @@ -4358,6 +4364,7 @@ namespace QuickMedia { all_messages.insert(all_messages.end(), new_messages.begin(), new_messages.end()); if(new_messages.empty()) fetched_enough_messages = true; + filter_sent_messages(new_messages); filter_existing_messages(new_messages); fprintf(stderr, "Finished fetching older messages, num new messages: %zu\n", new_messages.size()); bool move_to_bottom = false; @@ -4603,8 +4610,8 @@ namespace QuickMedia { fetched_messages_set.insert(message->event_id); } all_messages.insert(all_messages.end(), all_messages_new.begin(), all_messages_new.end()); - auto me = matrix->get_me(current_room); - resolve_provisional_messages(all_messages_new); + me = matrix->get_me(current_room); + filter_sent_messages(all_messages_new); add_new_messages_to_current_room(all_messages_new); modify_related_messages_in_current_room(all_messages_new); |