Reduced number of requests for authorizations list in SessionsBox.
This commit is contained in:
parent
41cb37b091
commit
3e6ba53a04
3 changed files with 43 additions and 21 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue