From 38696df14d1c851d25e27cb959594dc68dcc8f9e Mon Sep 17 00:00:00 2001 From: levlam Date: Sun, 17 Nov 2019 22:27:52 +0300 Subject: [PATCH] Load all drafts when chat list is loaded first time. GitOrigin-RevId: 5f9190a53ecb131f3493dfd0bf53c04c3bf9fe8f --- td/telegram/MessagesManager.cpp | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 7ce7af47..04aaaa81 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -118,6 +118,29 @@ class GetOnlinesQuery : public Td::ResultHandler { } }; +class GetAllDraftsQuery : public Td::ResultHandler { + public: + void send() { + send_query(G()->net_query_creator().create(create_storer(telegram_api::messages_getAllDrafts()))); + } + + void on_result(uint64 id, BufferSlice packet) override { + auto result_ptr = fetch_result(packet); + if (result_ptr.is_error()) { + return on_error(id, result_ptr.move_as_error()); + } + + auto ptr = result_ptr.move_as_ok(); + LOG(INFO) << "Receive result for GetAllDraftsQuery: " << to_string(ptr); + td->updates_manager_->on_get_updates(std::move(ptr)); + } + + void on_error(uint64 id, Status status) override { + LOG(ERROR) << "Receive error for GetAllDraftsQuery: " << status; + status.ignore(); + } +}; + class GetDialogQuery : public Td::ResultHandler { DialogId dialog_id_; @@ -12296,6 +12319,10 @@ void MessagesManager::load_dialog_list(FolderId folder_id, int32 limit, bool onl get_sequence_dispatcher_id(DialogId(), MessageContentType::None)); is_query_sent = true; } + if (folder_id == FolderId::main() && list.last_server_dialog_date_ == MIN_DIALOG_DATE) { + // do not pass promise to not wait for drafts before showing chat list + td_->create_handler()->send(); + } } CHECK(is_query_sent); } @@ -21926,6 +21953,11 @@ void MessagesManager::on_update_dialog_draft_message(DialogId dialog_id, auto d = get_dialog_force(dialog_id); if (d == nullptr) { LOG(INFO) << "Ignore update chat draft in unknown " << dialog_id; + if (!have_input_peer(dialog_id, AccessRights::Read)) { + LOG(ERROR) << "Have no read access to " << dialog_id << " to repair chat draft message"; + } else { + send_get_dialog_query(dialog_id, Promise()); + } return; } update_dialog_draft_message(d, get_draft_message(td_->contacts_manager_.get(), std::move(draft_message)), true, true);