diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index b81d0e63f..24fb0ea18 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -2633,7 +2633,9 @@ void ApiWrap::resolveWebPages() { if (!ids.isEmpty()) { requestId = request(MTPmessages_GetMessages( MTP_vector(ids) - )).done([=](const MTPmessages_Messages &result, mtpRequestId requestId) { + )).done([=]( + const MTPmessages_Messages &result, + mtpRequestId requestId) { gotWebPages(nullptr, result, requestId); }).afterDelay(kSmallDelayMs).send(); } @@ -2642,7 +2644,9 @@ void ApiWrap::resolveWebPages() { reqsByIndex[i.value().first] = request(MTPchannels_GetMessages( i.key()->inputChannel, MTP_vector(i.value().second) - )).done([=, channel = i.key()](const MTPmessages_Messages &result, mtpRequestId requestId) { + )).done([=, channel = i.key()]( + const MTPmessages_Messages &result, + mtpRequestId requestId) { gotWebPages(channel, result, requestId); }).afterDelay(kSmallDelayMs).send(); } @@ -2957,58 +2961,8 @@ void ApiWrap::refreshFileReference( }); } -void ApiWrap::gotWebPages(ChannelData *channel, const MTPmessages_Messages &msgs, mtpRequestId req) { - const QVector *v = 0; - switch (msgs.type()) { - case mtpc_messages_messages: { - auto &d = msgs.c_messages_messages(); - _session->data().processUsers(d.vusers()); - _session->data().processChats(d.vchats()); - v = &d.vmessages().v; - } break; - - case mtpc_messages_messagesSlice: { - auto &d = msgs.c_messages_messagesSlice(); - _session->data().processUsers(d.vusers()); - _session->data().processChats(d.vchats()); - v = &d.vmessages().v; - } break; - - case mtpc_messages_channelMessages: { - auto &d = msgs.c_messages_channelMessages(); - if (channel) { - channel->ptsReceived(d.vpts().v); - } else { - LOG(("API Error: received messages.channelMessages when no channel was passed! (ApiWrap::gotWebPages)")); - } - _session->data().processUsers(d.vusers()); - _session->data().processChats(d.vchats()); - v = &d.vmessages().v; - } break; - - case mtpc_messages_messagesNotModified: { - LOG(("API Error: received messages.messagesNotModified! (ApiWrap::gotWebPages)")); - } break; - } - - if (!v) return; - - auto indices = base::flat_map(); // copied from feedMsgs - for (auto i = 0, l = v->size(); i != l; ++i) { - const auto msgId = IdFromMessage(v->at(i)); - indices.emplace((uint64(uint32(msgId)) << 32) | uint64(i), i); - } - - for (const auto &[position, index] : indices) { - const auto item = _session->data().addNewMessage( - v->at(index), - MTPDmessage_ClientFlags(), - NewMessageType::Existing); - if (item) { - _session->data().requestItemResize(item); - } - } - +void ApiWrap::gotWebPages(ChannelData *channel, const MTPmessages_Messages &result, mtpRequestId req) { + WebPageData::ApplyChanges(&session(), channel, result); for (auto i = _webPagesPending.begin(); i != _webPagesPending.cend();) { if (i.value() == req) { if (i.key()->pendingTill > 0) { diff --git a/Telegram/SourceFiles/data/data_web_page.cpp b/Telegram/SourceFiles/data/data_web_page.cpp index 4d0500ae2..d3a5eaa93 100644 --- a/Telegram/SourceFiles/data/data_web_page.cpp +++ b/Telegram/SourceFiles/data/data_web_page.cpp @@ -12,6 +12,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "mainwidget.h" #include "data/data_session.h" #include "data/data_photo.h" +#include "data/data_channel.h" #include "data/data_document.h" #include "ui/image/image.h" #include "ui/text/text_entity.h" @@ -240,3 +241,45 @@ void WebPageData::replaceDocumentGoodThumbnail() { document->setGoodThumbnailPhoto(photo); } } + +void WebPageData::ApplyChanges( + not_null session, + ChannelData *channel, + const MTPmessages_Messages &result) { + result.match([&]( + const MTPDmessages_channelMessages &data) { + if (channel) { + channel->ptsReceived(data.vpts().v); + } else { + LOG(("API Error: received messages.channelMessages " + "when no channel was passed! (WebPageData::ApplyChanges)")); + } + }, [&](const auto &) { + }); + const auto list = result.match([]( + const MTPDmessages_messagesNotModified &) { + LOG(("API Error: received messages.messagesNotModified! " + "(WebPageData::ApplyChanges)")); + return static_cast*>(nullptr); + }, [&](const auto &data) { + session->data().processUsers(data.vusers()); + session->data().processChats(data.vchats()); + return &data.vmessages().v; + }); + if (!list) { + return; + } + + for (const auto &message : *list) { + message.match([&](const MTPDmessage &data) { + if (const auto media = data.vmedia()) { + media->match([&](const MTPDmessageMediaWebPage &data) { + session->data().processWebpage(data.vwebpage()); + }, [&](const auto &) { + }); + } + }, [&](const auto &) { + }); + } + session->data().sendWebPageGamePollNotifications(); +} \ No newline at end of file diff --git a/Telegram/SourceFiles/data/data_web_page.h b/Telegram/SourceFiles/data/data_web_page.h index f3e6dfbae..74e0aaae2 100644 --- a/Telegram/SourceFiles/data/data_web_page.h +++ b/Telegram/SourceFiles/data/data_web_page.h @@ -10,6 +10,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_photo.h" #include "data/data_document.h" +class ChannelData; + +namespace Main { +class Session; +} // namespace Main + enum class WebPageType { Photo, Video, @@ -50,6 +56,11 @@ struct WebPageData { const QString &newAuthor, int newPendingTill); + static void ApplyChanges( + not_null session, + ChannelData *channel, + const MTPmessages_Messages &result); + WebPageId id = 0; WebPageType type = WebPageType::Article; QString url;