From fca143dca84c54ad7d9756cd1876aca307f8a5cf Mon Sep 17 00:00:00 2001 From: levlam Date: Thu, 11 May 2023 19:43:30 +0300 Subject: [PATCH] Pass from_update == true first time when adding failed_to_send messages. --- td/telegram/MessagesManager.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index c0d6347fb..b58f0ce07 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -31324,7 +31324,7 @@ void MessagesManager::fail_send_message(FullMessageId full_message_id, int error update_failed_to_send_message_content(td_, message->content); bool need_update = false; - Message *m = add_message_to_dialog(d, std::move(message), false, true, true, false, &need_update, + Message *m = add_message_to_dialog(d, std::move(message), false, true, true, true, &need_update, &need_update_dialog_pos, "fail_send_message"); LOG_CHECK(m != nullptr) << "Failed to add failed to send " << new_message_id << " to " << dialog_id << " due to " << debug_add_message_to_dialog_fail_reason_; @@ -34312,10 +34312,10 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq } auto dialog_type = dialog_id.get_type(); - if (from_update) { + if (from_update && !message->is_failed_to_send) { CHECK(have_next); CHECK(have_previous); - if (message_id <= d->last_new_message_id && dialog_type != DialogType::Channel && !has_qts_messages(dialog_id) && + if (message_id <= d->last_new_message_id && dialog_type != DialogType::Channel && (message_id.is_server() || !td_->auth_manager_->is_bot())) { LOG(ERROR) << "New " << message_id << " in " << dialog_id << " from " << source << " has identifier less than last_new_message_id = " << d->last_new_message_id; @@ -34486,7 +34486,8 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq // in get_message_notification_group_force get_dialog_notification_group_id(d->dialog_id, get_notification_group_info(d, message.get())); } - if (*need_update || (!d->last_new_message_id.is_valid() && !message_id.is_yet_unsent() && from_update)) { + if (*need_update || (!d->last_new_message_id.is_valid() && !message_id.is_yet_unsent() && from_update && + !message->is_failed_to_send)) { auto pinned_message_id = get_message_content_pinned_message_id(message->content.get()); if (pinned_message_id.is_valid() && pinned_message_id < message_id && have_message_force(d, pinned_message_id, "preload pinned message")) { @@ -34501,8 +34502,9 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq << " from database"; } } - if (from_update && message->top_thread_message_id.is_valid() && message->top_thread_message_id != message_id && - message_id.is_server() && have_message_force(d, message->top_thread_message_id, "preload top reply message")) { + if (from_update && !message->is_failed_to_send && message->top_thread_message_id.is_valid() && + message->top_thread_message_id != message_id && message_id.is_server() && + have_message_force(d, message->top_thread_message_id, "preload top reply message")) { LOG(INFO) << "Preloaded top thread " << message->top_thread_message_id << " from database"; Message *top_m = get_message(d, message->top_thread_message_id); @@ -34639,8 +34641,8 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq *need_update_dialog_pos = false; } - if (from_update && message_id > d->last_new_message_id && !message_id.is_yet_unsent() && - !td_->auth_manager_->is_bot()) { + if (from_update && !message->is_failed_to_send && message_id > d->last_new_message_id && + !message_id.is_yet_unsent() && !td_->auth_manager_->is_bot()) { if (dialog_type == DialogType::SecretChat || message_id.is_server()) { // can delete messages, therefore must be called before message attaching/adding set_dialog_last_new_message_id(d, message_id, "add_message_to_dialog"); @@ -34742,7 +34744,7 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq add_message_to_database(d, m, "add_message_to_dialog"); } - if (from_update && dialog_type == DialogType::Channel) { + if (from_update && !m->is_failed_to_send && dialog_type == DialogType::Channel) { auto now = max(G()->unix_time_cached(), m->date); if (m->date < now - 2 * 86400 && Slice(source) == Slice("updateNewChannelMessage")) { // if the message is pretty old, we might have missed the update that the message has already been read @@ -34816,7 +34818,7 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq set_dialog_theme_name(d, get_message_content_theme_name(m->content.get())); } - if (from_update) { + if (from_update && !m->is_failed_to_send) { speculatively_update_active_group_call_id(d, m); speculatively_update_channel_participants(dialog_id, m); update_forum_topic_info_by_service_message_content(td_, m->content.get(), dialog_id, m->top_thread_message_id); @@ -35034,7 +35036,7 @@ MessagesManager::Message *MessagesManager::add_scheduled_message_to_dialog(Dialo register_message_reply(dialog_id, m); - if (from_update) { + if (from_update && !m->is_failed_to_send) { update_sent_message_contents(dialog_id, m); update_used_hashtags(dialog_id, m); update_has_outgoing_messages(dialog_id, m);