mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-04-13 04:37:11 +02:00
parent
ab20f8eb31
commit
ad7d1fddf0
2 changed files with 57 additions and 24 deletions
|
@ -57,6 +57,7 @@ constexpr auto kGeoPointScale = 1;
|
|||
constexpr auto kGeoPointZoomMin = 13;
|
||||
constexpr auto kMaxLoadParts = 5;
|
||||
constexpr auto kKeepLoadingParts = 8;
|
||||
constexpr auto kAllowPageReloadAfter = 3 * crl::time(1000);
|
||||
|
||||
} // namespace
|
||||
|
||||
|
@ -815,19 +816,19 @@ void Instance::show(
|
|||
}
|
||||
break;
|
||||
case Type::OpenPage:
|
||||
case Type::OpenLink:
|
||||
case Type::OpenLink: {
|
||||
if (!urlChecked) {
|
||||
break;
|
||||
}
|
||||
_fullRequested[_shownSession].emplace(event.url);
|
||||
_shownSession->api().request(MTPmessages_GetWebPage(
|
||||
MTP_string(event.url),
|
||||
MTP_int(0)
|
||||
const auto session = _shownSession;
|
||||
const auto url = event.url;
|
||||
auto &requested = _fullRequested[session][url];
|
||||
requested.lastRequestedAt = crl::now();
|
||||
session->api().request(MTPmessages_GetWebPage(
|
||||
MTP_string(url),
|
||||
MTP_int(requested.hash)
|
||||
)).done([=](const MTPmessages_WebPage &result) {
|
||||
_shownSession->data().processUsers(result.data().vusers());
|
||||
_shownSession->data().processChats(result.data().vchats());
|
||||
const auto page = _shownSession->data().processWebpage(
|
||||
result.data().vwebpage());
|
||||
const auto page = processReceivedPage(session, url, result);
|
||||
if (page && page->iv) {
|
||||
const auto parts = event.url.split('#');
|
||||
const auto hash = (parts.size() > 1) ? parts[1] : u""_q;
|
||||
|
@ -838,7 +839,7 @@ void Instance::show(
|
|||
}).fail([=] {
|
||||
UrlClickHandler::Open(event.url);
|
||||
}).send();
|
||||
break;
|
||||
} break;
|
||||
case Type::Report:
|
||||
if (const auto controller = _shownSession->tryResolveWindow()) {
|
||||
controller->window().activate();
|
||||
|
@ -954,15 +955,13 @@ void Instance::openWithIvPreferred(
|
|||
};
|
||||
_ivRequestSession = session;
|
||||
_ivRequestUri = uri;
|
||||
_fullRequested[session].emplace(url);
|
||||
auto &requested = _fullRequested[session][url];
|
||||
requested.lastRequestedAt = crl::now();
|
||||
_ivRequestId = session->api().request(MTPmessages_GetWebPage(
|
||||
MTP_string(url),
|
||||
MTP_int(0)
|
||||
MTP_int(requested.hash)
|
||||
)).done([=](const MTPmessages_WebPage &result) {
|
||||
const auto &data = result.data();
|
||||
session->data().processUsers(data.vusers());
|
||||
session->data().processChats(data.vchats());
|
||||
finish(session->data().processWebpage(data.vwebpage()));
|
||||
finish(processReceivedPage(session, url, result));
|
||||
}).fail([=] {
|
||||
finish(nullptr);
|
||||
}).send();
|
||||
|
@ -971,24 +970,47 @@ void Instance::openWithIvPreferred(
|
|||
void Instance::requestFull(
|
||||
not_null<Main::Session*> session,
|
||||
const QString &id) {
|
||||
if (!_tracking.contains(session)
|
||||
|| !_fullRequested[session].emplace(id).second) {
|
||||
if (!_tracking.contains(session)) {
|
||||
return;
|
||||
}
|
||||
auto &requested = _fullRequested[session][id];
|
||||
const auto last = requested.lastRequestedAt;
|
||||
const auto now = crl::now();
|
||||
if (last && (now - last) < kAllowPageReloadAfter) {
|
||||
return;
|
||||
}
|
||||
requested.lastRequestedAt = now;
|
||||
session->api().request(MTPmessages_GetWebPage(
|
||||
MTP_string(id),
|
||||
MTP_int(0)
|
||||
MTP_int(requested.hash)
|
||||
)).done([=](const MTPmessages_WebPage &result) {
|
||||
session->data().processUsers(result.data().vusers());
|
||||
session->data().processChats(result.data().vchats());
|
||||
const auto page = session->data().processWebpage(
|
||||
result.data().vwebpage());
|
||||
const auto page = processReceivedPage(session, id, result);
|
||||
if (page && page->iv && _shown && _shownSession == session) {
|
||||
_shown->update(page->iv.get());
|
||||
}
|
||||
}).send();
|
||||
}
|
||||
|
||||
WebPageData *Instance::processReceivedPage(
|
||||
not_null<Main::Session*> session,
|
||||
const QString &url,
|
||||
const MTPmessages_WebPage &result) {
|
||||
const auto &data = result.data();
|
||||
const auto owner = &session->data();
|
||||
owner->processUsers(data.vusers());
|
||||
owner->processChats(data.vchats());
|
||||
auto &requested = _fullRequested[session][url];
|
||||
const auto &mtp = data.vwebpage();
|
||||
return mtp.match([&](const MTPDwebPageNotModified &data) {
|
||||
return requested.page;
|
||||
}, [&](const MTPDwebPage &data) {
|
||||
requested.hash = data.vhash().v;
|
||||
return owner->processWebpage(data).get();
|
||||
}, [&](const auto &) {
|
||||
return owner->processWebpage(mtp).get();
|
||||
});
|
||||
}
|
||||
|
||||
void Instance::processOpenChannel(const QString &context) {
|
||||
if (!_shownSession) {
|
||||
return;
|
||||
|
|
|
@ -61,12 +61,23 @@ public:
|
|||
[[nodiscard]] rpl::lifetime &lifetime();
|
||||
|
||||
private:
|
||||
struct FullResult {
|
||||
crl::time lastRequestedAt = 0;
|
||||
WebPageData *page = nullptr;
|
||||
int32 hash = 0;
|
||||
};
|
||||
|
||||
void processOpenChannel(const QString &context);
|
||||
void processJoinChannel(const QString &context);
|
||||
void requestFull(not_null<Main::Session*> session, const QString &id);
|
||||
|
||||
void trackSession(not_null<Main::Session*> session);
|
||||
|
||||
WebPageData *processReceivedPage(
|
||||
not_null<Main::Session*> session,
|
||||
const QString &url,
|
||||
const MTPmessages_WebPage &result);
|
||||
|
||||
const not_null<Delegate*> _delegate;
|
||||
|
||||
std::unique_ptr<Shown> _shown;
|
||||
|
@ -77,7 +88,7 @@ private:
|
|||
base::flat_set<not_null<ChannelData*>>> _joining;
|
||||
base::flat_map<
|
||||
not_null<Main::Session*>,
|
||||
base::flat_set<QString>> _fullRequested;
|
||||
base::flat_map<QString, FullResult>> _fullRequested;
|
||||
|
||||
base::flat_map<
|
||||
not_null<Main::Session*>,
|
||||
|
|
Loading…
Add table
Reference in a new issue