diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 694a332fb..12e13d348 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -21946,9 +21946,10 @@ unique_ptr MessagesManager::parse_message(DialogId dia return m; } -void MessagesManager::on_get_history_from_database(DialogId dialog_id, MessageId from_message_id, int32 offset, - int32 limit, bool from_the_end, bool only_local, - vector &&messages, Promise &&promise) { +void MessagesManager::on_get_history_from_database(DialogId dialog_id, MessageId from_message_id, + MessageId old_last_database_message_id, int32 offset, int32 limit, + bool from_the_end, bool only_local, vector &&messages, + Promise &&promise) { CHECK(-limit < offset && offset <= 0); CHECK(offset < 0 || from_the_end); CHECK(!from_message_id.is_scheduled()); @@ -21972,6 +21973,17 @@ void MessagesManager::on_get_history_from_database(DialogId dialog_id, MessageId << d->first_database_message_id << ", last database message is " << d->last_database_message_id << ", have_full_history = " << d->have_full_history; + if (old_last_database_message_id < d->last_database_message_id && old_last_database_message_id < from_message_id) { + // new messages where added to the database since the request was sent + // they should have been received from the database, so we must repeat the request to get them + if (from_the_end) { + get_history_from_the_end_impl(d, true, only_local, std::move(promise)); + } else { + get_history_impl(d, from_message_id, offset, limit, true, only_local, std::move(promise)); + } + return; + } + if (messages.empty() && from_the_end && d->messages == nullptr) { if (d->have_full_history) { set_dialog_is_empty(d, "on_get_history_from_database empty"); @@ -22199,10 +22211,12 @@ void MessagesManager::get_history_from_the_end_impl(const Dialog *d, bool from_d db_query.from_message_id = MessageId::max(); db_query.limit = limit; G()->td_db()->get_messages_db_async()->get_messages( - db_query, PromiseCreator::lambda([dialog_id, only_local, limit, actor_id = actor_id(this), + db_query, PromiseCreator::lambda([dialog_id, old_last_database_message_id = d->last_database_message_id, + only_local, limit, actor_id = actor_id(this), promise = std::move(promise)](std::vector messages) mutable { - send_closure(actor_id, &MessagesManager::on_get_history_from_database, dialog_id, MessageId::max(), 0, limit, - true, only_local, std::move(messages), std::move(promise)); + send_closure(actor_id, &MessagesManager::on_get_history_from_database, dialog_id, MessageId::max(), + old_last_database_message_id, 0, limit, true, only_local, std::move(messages), + std::move(promise)); })); } else { if (only_local || dialog_id.get_type() == DialogType::SecretChat) { @@ -22244,10 +22258,12 @@ void MessagesManager::get_history_impl(const Dialog *d, MessageId from_message_i db_query.limit = limit; G()->td_db()->get_messages_db_async()->get_messages( db_query, - PromiseCreator::lambda([dialog_id, from_message_id, offset, limit, only_local, actor_id = actor_id(this), + PromiseCreator::lambda([dialog_id, from_message_id, old_last_database_message_id = d->last_database_message_id, + offset, limit, only_local, actor_id = actor_id(this), promise = std::move(promise)](std::vector messages) mutable { - send_closure(actor_id, &MessagesManager::on_get_history_from_database, dialog_id, from_message_id, offset, - limit, false, only_local, std::move(messages), std::move(promise)); + send_closure(actor_id, &MessagesManager::on_get_history_from_database, dialog_id, from_message_id, + old_last_database_message_id, offset, limit, false, only_local, std::move(messages), + std::move(promise)); })); } else { if (only_local || dialog_id.get_type() == DialogType::SecretChat) { diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 3fedadc66..5f7ce0788 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -1998,7 +1998,8 @@ class MessagesManager final : public Actor { void preload_older_messages(const Dialog *d, MessageId min_message_id); - void on_get_history_from_database(DialogId dialog_id, MessageId from_message_id, int32 offset, int32 limit, + void on_get_history_from_database(DialogId dialog_id, MessageId from_message_id, + MessageId old_last_database_message_id, int32 offset, int32 limit, bool from_the_end, bool only_local, vector &&messages, Promise &&promise);