From 4f4ef941c63d2cae3932a16ee21fa318cd82f05c Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 10 Feb 2022 15:15:32 +0300 Subject: [PATCH] Move SendPreloadRequest out of HistoryWidget. --- Telegram/CMakeLists.txt | 2 + .../SourceFiles/history/history_widget.cpp | 58 ++------------ .../SourceFiles/support/support_preload.cpp | 77 +++++++++++++++++++ .../SourceFiles/support/support_preload.h | 19 +++++ 4 files changed, 103 insertions(+), 53 deletions(-) create mode 100644 Telegram/SourceFiles/support/support_preload.cpp create mode 100644 Telegram/SourceFiles/support/support_preload.h diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index fee34723f..199f5ed4e 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -1097,6 +1097,8 @@ PRIVATE support/support_common.h support/support_helper.cpp support/support_helper.h + support/support_preload.cpp + support/support_preload.h support/support_templates.cpp support/support_templates.h ui/chat/attach/attach_item_single_file_preview.cpp diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 433b0a922..3f0601710 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -143,6 +143,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "core/shortcuts.h" #include "support/support_common.h" #include "support/support_autocomplete.h" +#include "support/support_preload.h" #include "dialogs/dialogs_key.h" #include "calls/calls_instance.h" #include "facades.h" @@ -3387,59 +3388,10 @@ void HistoryWidget::checkSupportPreload(bool force) { } clearSupportPreloadRequest(); _supportPreloadHistory = history; - auto offsetId = MsgId(); - auto offset = 0; - auto loadCount = kMessagesPerPage; - if (const auto around = history->loadAroundId()) { - history->getReadyFor(ShowAtUnreadMsgId); - offset = -loadCount / 2; - offsetId = around; - } - const auto offsetDate = 0; - const auto maxId = 0; - const auto minId = 0; - const auto historyHash = uint64(0); - const auto type = Data::Histories::RequestType::History; - auto &histories = history->owner().histories(); - _supportPreloadRequest = histories.sendRequest(history, type, [=](Fn finish) { - return history->session().api().request(MTPmessages_GetHistory( - history->peer->input, - MTP_int(offsetId), - MTP_int(offsetDate), - MTP_int(offset), - MTP_int(loadCount), - MTP_int(maxId), - MTP_int(minId), - MTP_long(historyHash) - )).done([=](const MTPmessages_Messages &result) { - if (const auto around = history->loadAroundId()) { - if (around != offsetId) { - _supportPreloadRequest = 0; - _supportPreloadHistory = nullptr; - crl::on_main(this, [=] { checkSupportPreload(); }); - return; - } - history->clear(History::ClearType::Unload); - history->getReadyFor(ShowAtUnreadMsgId); - } else if (offsetId) { - _supportPreloadRequest = 0; - _supportPreloadHistory = nullptr; - crl::on_main(this, [=] { checkSupportPreload(); }); - return; - } else { - history->clear(History::ClearType::Unload); - history->getReadyFor(ShowAtTheEndMsgId); - } - result.match([](const MTPDmessages_messagesNotModified&) { - }, [&](const auto &data) { - history->owner().processUsers(data.vusers()); - history->owner().processChats(data.vchats()); - history->addOlderSlice(data.vmessages().v); - }); - finish(); - }).fail([=](const MTP::Error &error) { - finish(); - }).send(); + _supportPreloadRequest = Support::SendPreloadRequest(history, [=] { + _supportPreloadRequest = 0; + _supportPreloadHistory = nullptr; + crl::on_main(this, [=] { checkSupportPreload(); }); }); } diff --git a/Telegram/SourceFiles/support/support_preload.cpp b/Telegram/SourceFiles/support/support_preload.cpp new file mode 100644 index 000000000..046bc9182 --- /dev/null +++ b/Telegram/SourceFiles/support/support_preload.cpp @@ -0,0 +1,77 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "support/support_preload.h" + +#include "history/history.h" +#include "data/data_peer.h" +#include "data/data_session.h" +#include "data/data_histories.h" +#include "main/main_session.h" +#include "apiwrap.h" + +namespace Support { +namespace { + +constexpr auto kPreloadMessagesCount = 50; + +} // namespace + +int SendPreloadRequest(not_null history, Fn retry) { + auto offsetId = MsgId(); + auto offset = 0; + auto loadCount = kPreloadMessagesCount; + if (const auto around = history->loadAroundId()) { + history->getReadyFor(ShowAtUnreadMsgId); + offset = -loadCount / 2; + offsetId = around; + } + const auto offsetDate = 0; + const auto maxId = 0; + const auto minId = 0; + const auto historyHash = uint64(0); + const auto type = Data::Histories::RequestType::History; + auto &histories = history->owner().histories(); + return histories.sendRequest(history, type, [=](Fn finish) { + return history->session().api().request(MTPmessages_GetHistory( + history->peer->input, + MTP_int(offsetId), + MTP_int(offsetDate), + MTP_int(offset), + MTP_int(loadCount), + MTP_int(maxId), + MTP_int(minId), + MTP_long(historyHash) + )).done([=](const MTPmessages_Messages &result) { + if (const auto around = history->loadAroundId()) { + if (around != offsetId) { + retry(); + return; + } + history->clear(History::ClearType::Unload); + history->getReadyFor(ShowAtUnreadMsgId); + } else if (offsetId) { + retry(); + return; + } else { + history->clear(History::ClearType::Unload); + history->getReadyFor(ShowAtTheEndMsgId); + } + result.match([](const MTPDmessages_messagesNotModified&) { + }, [&](const auto &data) { + history->owner().processUsers(data.vusers()); + history->owner().processChats(data.vchats()); + history->addOlderSlice(data.vmessages().v); + }); + finish(); + }).fail([=](const MTP::Error &error) { + finish(); + }).send(); + }); +} + +} // namespace Support diff --git a/Telegram/SourceFiles/support/support_preload.h b/Telegram/SourceFiles/support/support_preload.h new file mode 100644 index 000000000..7557c4467 --- /dev/null +++ b/Telegram/SourceFiles/support/support_preload.h @@ -0,0 +1,19 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +class History; + +namespace Support { + +// Returns histories().request, not api().request. +[[nodiscard]] int SendPreloadRequest( + not_null history, + Fn retry); + +} // namespace Support