From b1a1635ce7b99f2b50a83cd9da7d2f6f40ec60d7 Mon Sep 17 00:00:00 2001 From: levlam Date: Sat, 13 Apr 2019 16:50:06 +0300 Subject: [PATCH] Fix adding too new messages. GitOrigin-RevId: 3874c25b07674608d8a4cef61cd4801ce6a5f115 --- td/telegram/MessagesManager.cpp | 47 +++++++++++++++++++++---------- td/telegram/MessagesManager.h | 2 ++ td/telegram/NotificationManager.h | 1 + 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index b062745b2..e407eb2e7 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -22191,23 +22191,38 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq } } - if (!from_update && ((message_id.is_server() && d->last_new_message_id != MessageId() && - message_id.get() > d->last_new_message_id.get()) || - (message_id.is_local() && d->last_database_message_id != MessageId() && - message_id.get() > d->last_database_message_id.get() && !message->is_failed_to_send))) { - if (!message->from_database) { - LOG(ERROR) << "Ignore " << message_id << " in " << dialog_id << " received not through update from " << source - << ". Last new is " << d->last_new_message_id << ", channel difference " - << debug_channel_difference_dialog_ << " " << to_string(get_message_object(dialog_id, message.get())); - dump_debug_message_op(d, 3); - if (dialog_id.get_type() == DialogType::Channel && have_input_peer(dialog_id, AccessRights::Read)) { - channel_get_difference_retry_timeout_.add_timeout_in(dialog_id.get(), 0.001); + if (!from_update && !message->is_failed_to_send) { + MessageId max_message_id; + if (message_id.is_server()) { + if (d->being_added_message_id.is_valid()) { + // if a too new message not from update has failed to preload before being_added_message_id was set, + // then it should fail to load event after it is set and last_new_message_id has changed + max_message_id = d->being_updated_last_new_message_id; + } else { + max_message_id = d->last_new_message_id; + } + } else if (message_id.is_local()) { + if (d->being_added_message_id.is_valid()) { + max_message_id = d->being_updated_last_database_message_id; + } else { + max_message_id = d->last_database_message_id; } - } else { - LOG(INFO) << "Ignore " << message_id << " in " << dialog_id << " received not through update from " << source; } - debug_add_message_to_dialog_fail_reason_ = "too new message not from update"; - return nullptr; + if (max_message_id != MessageId() && message_id.get() > max_message_id.get()) { + if (!message->from_database) { + LOG(ERROR) << "Ignore " << message_id << " in " << dialog_id << " received not through update from " << source + << ". Last is " << max_message_id << ", channel difference " + << debug_channel_difference_dialog_ << " " << to_string(get_message_object(dialog_id, message.get())); + dump_debug_message_op(d, 3); + if (dialog_id.get_type() == DialogType::Channel && have_input_peer(dialog_id, AccessRights::Read)) { + channel_get_difference_retry_timeout_.add_timeout_in(dialog_id.get(), 0.001); + } + } else { + LOG(INFO) << "Ignore " << message_id << " in " << dialog_id << " received not through update from " << source; + } + debug_add_message_to_dialog_fail_reason_ = "too new message not from update"; + return nullptr; + } } if ((message_id.is_server() || (message_id.is_local() && dialog_id.get_type() == DialogType::SecretChat)) && message_id.get() <= d->max_unavailable_message_id.get()) { @@ -22397,6 +22412,8 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq << d->debug_added_pinned_message_id << " " << d->debug_add_message_to_dialog_fail_reason_ << " " << source; d->being_added_message_id = message_id; + d->being_updated_last_new_message_id = d->last_new_message_id; + d->being_updated_last_database_message_id = d->last_database_message_id; d->debug_being_added_need_update = *need_update; d->debug_preloaded_pinned_message_id = preloaded_pinned_message_id; d->debug_added_pinned_message_id = added_pinned_message_id; diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 4678a4555..0708a6c67 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -972,6 +972,8 @@ class MessagesManager : public Actor { MessageId max_added_message_id; MessageId being_added_message_id; + MessageId being_updated_last_new_message_id; + MessageId being_updated_last_database_message_id; bool debug_being_added_need_update = false; // TODO remove MessageId debug_preloaded_pinned_message_id; // TODO remove MessageId debug_added_pinned_message_id; // TODO remove diff --git a/td/telegram/NotificationManager.h b/td/telegram/NotificationManager.h index 27028060c..5edc35136 100644 --- a/td/telegram/NotificationManager.h +++ b/td/telegram/NotificationManager.h @@ -8,6 +8,7 @@ #include "td/telegram/CallId.h" #include "td/telegram/DialogId.h" +#include "td/telegram/Document.h" #include "td/telegram/MessageId.h" #include "td/telegram/Notification.h" #include "td/telegram/NotificationGroupId.h"