From 62677720fca066da91ab952d46bf0ddd0303ea2b Mon Sep 17 00:00:00 2001 From: levlam Date: Mon, 24 Jul 2023 15:42:38 +0300 Subject: [PATCH] Immediately unload messages in closed chats after updates.channelDifferenceTooLong. --- td/telegram/MessagesManager.cpp | 22 +++++++++++++++++++--- td/telegram/MessagesManager.h | 3 ++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 649d18536..44b07f017 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -5992,7 +5992,7 @@ void MessagesManager::on_pending_unload_dialog_timeout_callback(void *messages_m auto messages_manager = static_cast(messages_manager_ptr); send_closure_later(messages_manager->actor_id(messages_manager), &MessagesManager::unload_dialog, - DialogId(dialog_id_int)); + DialogId(dialog_id_int), -1); } void MessagesManager::on_dialog_unmute_timeout_callback(void *messages_manager_ptr, int64 dialog_id_int) { @@ -11853,10 +11853,13 @@ double MessagesManager::get_next_unload_dialog_delay(Dialog *d) const { return delay + delay * 1e-9 * d->unload_dialog_delay_seed; } -void MessagesManager::unload_dialog(DialogId dialog_id) { +void MessagesManager::unload_dialog(DialogId dialog_id, int32 delay) { if (G()->close_flag()) { return; } + if (delay < 0) { + delay = get_unload_dialog_delay() - 2; + } Dialog *d = get_dialog(dialog_id); CHECK(d != nullptr); @@ -11876,7 +11879,7 @@ void MessagesManager::unload_dialog(DialogId dialog_id) { bool has_left_to_unload_messages = false; auto to_unload_message_ids = - find_unloadable_messages(d, G()->unix_time_cached() - get_unload_dialog_delay() + 2, has_left_to_unload_messages); + find_unloadable_messages(d, G()->unix_time_cached() - delay, has_left_to_unload_messages); vector unloaded_message_ids; vector> unloaded_messages; @@ -20618,6 +20621,11 @@ void MessagesManager::close_dialog(Dialog *d) { CHECK(!d->has_unload_timeout); pending_unload_dialog_timeout_.set_timeout_in(dialog_id.get(), get_next_unload_dialog_delay(d)); d->has_unload_timeout = true; + + if (d->need_unload_on_close) { + unload_dialog(dialog_id, 0); + d->need_unload_on_close = false; + } } dialog_viewed_messages_.erase(dialog_id); @@ -38569,6 +38577,14 @@ void MessagesManager::on_get_channel_dialog(DialogId dialog_id, MessageId last_m // offline. It is the best way for gaps support, but it is pretty hard to implement correctly. // It should be also noted that some messages like outgoing live location messages shouldn't be deleted. + if (is_message_unload_enabled()) { + if (d->open_count == 0) { + unload_dialog(dialog_id, 0); + } else { + d->need_unload_on_close = true; + } + } + if (last_message_id > d->last_new_message_id && !td_->auth_manager_->is_bot()) { // TODO properly support last_message_id <= d->last_new_message_id set_dialog_first_database_message_id(d, MessageId(), "on_get_channel_dialog 6"); diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 410e82a65..25f9d6d29 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -1403,6 +1403,7 @@ class MessagesManager final : public Actor { bool has_outgoing_messages = false; bool was_opened = false; + bool need_unload_on_close = false; bool need_restore_reply_markup = true; bool need_drop_default_send_message_as_dialog_id = false; @@ -2035,7 +2036,7 @@ class MessagesManager final : public Actor { double get_next_unload_dialog_delay(Dialog *d) const; - void unload_dialog(DialogId dialog_id); + void unload_dialog(DialogId dialog_id, int32 delay); void clear_dialog_message_list(Dialog *d, bool remove_from_dialog_list, int32 last_message_date);