From 3e6ba53a04dbee038dc103ef15f7bc0fd74b65bc Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Fri, 18 Sep 2020 22:04:18 +0300 Subject: [PATCH] Reduced number of requests for authorizations list in SessionsBox. --- .../SourceFiles/api/api_authorizations.cpp | 5 ++ Telegram/SourceFiles/api/api_authorizations.h | 4 ++ Telegram/SourceFiles/boxes/sessions_box.cpp | 55 ++++++++++++------- 3 files changed, 43 insertions(+), 21 deletions(-) diff --git a/Telegram/SourceFiles/api/api_authorizations.cpp b/Telegram/SourceFiles/api/api_authorizations.cpp index 404a717b3f..f1c9884764 100644 --- a/Telegram/SourceFiles/api/api_authorizations.cpp +++ b/Telegram/SourceFiles/api/api_authorizations.cpp @@ -103,6 +103,7 @@ void Authorizations::reload() { _requestId = _api.request(MTPaccount_GetAuthorizations( )).done([=](const MTPaccount_Authorizations &result) { _requestId = 0; + _lastReceived = crl::now(); result.match([&](const MTPDaccount_authorizations &auths) { _list = ( auths.vauthorizations().v @@ -158,4 +159,8 @@ int Authorizations::total() const { ranges::not_fn(&Entry::incomplete)); } +crl::time Authorizations::lastReceivedTime() { + return _lastReceived; +} + } // namespace Api diff --git a/Telegram/SourceFiles/api/api_authorizations.h b/Telegram/SourceFiles/api/api_authorizations.h index b01192c032..ba2377d680 100644 --- a/Telegram/SourceFiles/api/api_authorizations.h +++ b/Telegram/SourceFiles/api/api_authorizations.h @@ -33,6 +33,8 @@ public: Fn &&fail, std::optional hash = std::nullopt); + [[nodiscard]] crl::time lastReceivedTime(); + [[nodiscard]] List list() const; [[nodiscard]] rpl::producer listChanges() const; [[nodiscard]] int total() const; @@ -45,6 +47,8 @@ private: List _list; rpl::event_stream<> _listChanges; + crl::time _lastReceived = 0; + }; } // namespace Api diff --git a/Telegram/SourceFiles/boxes/sessions_box.cpp b/Telegram/SourceFiles/boxes/sessions_box.cpp index 9e0a8bbd7b..11fa0b4a56 100644 --- a/Telegram/SourceFiles/boxes/sessions_box.cpp +++ b/Telegram/SourceFiles/boxes/sessions_box.cpp @@ -69,6 +69,7 @@ private: class List; void shortPollSessions(); + void parse(const Api::Authorizations::List &list); void terminate(Fn terminateRequest, QString message); void terminateOne(uint64 hash); @@ -170,32 +171,36 @@ void SessionsContent::setupContent() { _authorizations->listChanges( ) | rpl::start_with_next([=](const Api::Authorizations::List &list) { - _data = Full(); - for (const auto auth : list) { - auto entry = Entry(auth); - if (!entry.hash) { - _data.current = std::move(entry); - } else if (entry.incomplete) { - _data.incomplete.push_back(std::move(entry)); - } else { - _data.list.push_back(std::move(entry)); - } - } - - _loading = false; - - ranges::sort(_data.list, std::greater<>(), &Entry::activeTime); - ranges::sort(_data.incomplete, std::greater<>(), &Entry::activeTime); - - _inner->showData(_data); - - _shortPollTimer.callOnce(kSessionsShortPollTimeout); + parse(list); }, lifetime()); _loading = true; shortPollSessions(); } +void SessionsContent::parse(const Api::Authorizations::List &list) { + _data = Full(); + for (const auto &auth : list) { + auto entry = Entry(auth); + if (!entry.hash) { + _data.current = std::move(entry); + } else if (entry.incomplete) { + _data.incomplete.push_back(std::move(entry)); + } else { + _data.list.push_back(std::move(entry)); + } + } + + _loading = false; + + ranges::sort(_data.list, std::greater<>(), &Entry::activeTime); + ranges::sort(_data.incomplete, std::greater<>(), &Entry::activeTime); + + _inner->showData(_data); + + _shortPollTimer.callOnce(kSessionsShortPollTimeout); +} + void SessionsContent::resizeEvent(QResizeEvent *e) { RpWidget::resizeEvent(e); @@ -218,7 +223,15 @@ void SessionsContent::paintEvent(QPaintEvent *e) { } void SessionsContent::shortPollSessions() { - _authorizations->reload(); + const auto left = kSessionsShortPollTimeout + - (crl::now() - _authorizations->lastReceivedTime()); + if (left > 0) { + parse(_authorizations->list()); + _shortPollTimer.cancel(); + _shortPollTimer.callOnce(left); + } else { + _authorizations->reload(); + } update(); }