diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index 1ec256053a..46569a15e3 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -1060,15 +1060,9 @@ not_null Session::processChat(const MTPChat &data) { } channel->setPhoto(data.vphoto()); - if (const auto monoforum = data.vlinked_monoforum_id()) { - if (const auto linked = channelLoaded(monoforum->v)) { - channel->setMonoforumLink(linked); - } else { - channel->updateFull(); - } - } else { - channel->setMonoforumLink(nullptr); - } + applyMonoforumLinkedId( + channel, + data.vlinked_monoforum_id().value_or_empty()); if (wasInChannel != channel->amIn()) { flags |= UpdateFlag::ChannelAmIn; @@ -1152,12 +1146,31 @@ UserData *Session::processUsers(const MTPVector &data) { PeerData *Session::processChats(const MTPVector &data) { auto result = (PeerData*)nullptr; + _postponedMonoforumLinkedIds.emplace(); for (const auto &chat : data.v) { result = processChat(chat); } + const auto ids = base::take(_postponedMonoforumLinkedIds); + for (const auto &[channel, linkedId] : *ids) { + applyMonoforumLinkedId(channel, linkedId); + } return result; } +void Session::applyMonoforumLinkedId( + not_null channel, + ChannelId linkedId) { + if (!linkedId) { + channel->setMonoforumLink(nullptr); + } else if (_postponedMonoforumLinkedIds) { + _postponedMonoforumLinkedIds->emplace(channel, linkedId); + } else if (const auto linked = channelLoaded(linkedId)) { + channel->setMonoforumLink(linked); + } else { + channel->updateFull(); + } +} + void Session::applyMaximumChatVersions(const MTPVector &data) { for (const auto &chat : data.v) { chat.match([&](const MTPDchat &data) { @@ -4809,11 +4822,11 @@ void Session::refreshChatListEntry(Dialogs::Key key) { } else if (const auto monoforum = history->peer->monoforum()) { monoforum->preloadSublists(); } - if (const auto broadcast = history->peer->monoforumBroadcast()) { - if (!broadcast->isFullLoaded()) { - broadcast->updateFull(); - } - } + //if (const auto broadcast = history->peer->monoforumBroadcast()) { + // if (!broadcast->isFullLoaded()) { + // broadcast->updateFull(); + // } + //} } } diff --git a/Telegram/SourceFiles/data/data_session.h b/Telegram/SourceFiles/data/data_session.h index 825e497ff6..9a9e42bf09 100644 --- a/Telegram/SourceFiles/data/data_session.h +++ b/Telegram/SourceFiles/data/data_session.h @@ -992,6 +992,10 @@ private: void setWallpapers(const QVector &data, uint64 hash); void highlightProcessDone(uint64 processId); + void applyMonoforumLinkedId( + not_null channel, + ChannelId linkedId); + void checkPollsClosings(); const not_null _session; @@ -1157,6 +1161,10 @@ private: std::unordered_map> _peers; + std::optional, + ChannelId>> _postponedMonoforumLinkedIds; + MessageIdsList _mimeForwardIds; std::weak_ptr _creditsSubsRebuilder;