Reduced number of requests for authorizations list in SessionsBox.

This commit is contained in:
23rd 2020-09-18 22:04:18 +03:00 committed by John Preston
parent 41cb37b091
commit 3e6ba53a04
3 changed files with 43 additions and 21 deletions

View file

@ -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

View file

@ -33,6 +33,8 @@ public:
Fn<void(const RPCError &error)> &&fail,
std::optional<uint64> hash = std::nullopt);
[[nodiscard]] crl::time lastReceivedTime();
[[nodiscard]] List list() const;
[[nodiscard]] rpl::producer<List> listChanges() const;
[[nodiscard]] int total() const;
@ -45,6 +47,8 @@ private:
List _list;
rpl::event_stream<> _listChanges;
crl::time _lastReceived = 0;
};
} // namespace Api

View file

@ -69,6 +69,7 @@ private:
class List;
void shortPollSessions();
void parse(const Api::Authorizations::List &list);
void terminate(Fn<void()> 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();
}