From bb6fc197681bf01bccaf3de91cee96bdd79caed2 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 30 Mar 2026 15:34:31 +0700 Subject: [PATCH] Check all peers load status in short updates. --- Telegram/SourceFiles/api/api_updates.cpp | 93 ++++++++++++++++++++++-- 1 file changed, 88 insertions(+), 5 deletions(-) diff --git a/Telegram/SourceFiles/api/api_updates.cpp b/Telegram/SourceFiles/api/api_updates.cpp index 234a5ffb39..1aa8fc9df8 100644 --- a/Telegram/SourceFiles/api/api_updates.cpp +++ b/Telegram/SourceFiles/api/api_updates.cpp @@ -91,6 +91,90 @@ enum class DataIsLoadedResult { Ok = 3, }; +[[nodiscard]] bool PeerDataIsLoaded( + not_null owner, + PeerId peerId) { + return !peerId || owner->peerLoaded(peerId); +} + +[[nodiscard]] bool MentionUsersDataIsLoaded( + not_null owner, + const MTPVector &entities) { + for (const auto &entity : entities.v) { + auto loaded = true; + entity.match([&](const MTPDmessageEntityMentionName &data) { + loaded = owner->userLoaded(data.vuser_id()); + }, [&](const MTPDinputMessageEntityMentionName &data) { + data.vuser_id().match([&](const MTPDinputUser &data) { + loaded = owner->userLoaded(data.vuser_id()); + }, [](const auto &) { + }); + }, [](const auto &) { + }); + if (!loaded) { + return false; + } + } + return true; +} + +[[nodiscard]] bool ForwardedInfoDataIsLoaded( + not_null owner, + const MTPMessageFwdHeader &header) { + return header.match([&](const MTPDmessageFwdHeader &data) { + return (!data.vfrom_id() + || PeerDataIsLoaded(owner, peerFromMTP(*data.vfrom_id()))) + && (!data.vsaved_from_peer() + || PeerDataIsLoaded(owner, peerFromMTP(*data.vsaved_from_peer()))) + && (!data.vsaved_from_id() + || PeerDataIsLoaded(owner, peerFromMTP(*data.vsaved_from_id()))); + }); +} + +[[nodiscard]] bool ReplyDataIsLoaded( + not_null owner, + const MTPMessageReplyHeader &header) { + return header.match([&](const MTPDmessageReplyHeader &data) { + return (!data.vreply_to_peer_id() + || PeerDataIsLoaded(owner, peerFromMTP(*data.vreply_to_peer_id()))) + && (!data.vreply_from() + || ForwardedInfoDataIsLoaded(owner, *data.vreply_from())) + && (!data.vquote_entities() + || MentionUsersDataIsLoaded(owner, *data.vquote_entities())); + }, [&](const MTPDmessageReplyStoryHeader &data) { + return PeerDataIsLoaded(owner, peerFromMTP(data.vpeer())); + }); +} + +[[nodiscard]] bool DataIsLoaded( + not_null owner, + const MTPDupdateShortMessage &data) { + return owner->userLoaded(data.vuser_id()) + && (!data.vfwd_from() + || ForwardedInfoDataIsLoaded(owner, *data.vfwd_from())) + && (!data.vvia_bot_id() + || owner->userLoaded(*data.vvia_bot_id())) + && (!data.vreply_to() + || ReplyDataIsLoaded(owner, *data.vreply_to())) + && (!data.ventities() + || MentionUsersDataIsLoaded(owner, *data.ventities())); +} + +[[nodiscard]] bool DataIsLoaded( + not_null owner, + const MTPDupdateShortChatMessage &data) { + return owner->chatLoaded(data.vchat_id()) + && owner->userLoaded(data.vfrom_id()) + && (!data.vfwd_from() + || ForwardedInfoDataIsLoaded(owner, *data.vfwd_from())) + && (!data.vvia_bot_id() + || owner->userLoaded(*data.vvia_bot_id())) + && (!data.vreply_to() + || ReplyDataIsLoaded(owner, *data.vreply_to())) + && (!data.ventities() + || MentionUsersDataIsLoaded(owner, *data.ventities())); +} + void ProcessScheduledMessageWithElapsedTime( not_null session, bool needToAdd, @@ -1424,9 +1508,9 @@ void Updates::applyUpdates( case mtpc_updateShortMessage: { auto &d = updates.c_updateShortMessage(); - if (!session().data().userLoaded(d.vuser_id())) { + if (!DataIsLoaded(&_session->data(), d)) { MTP_LOG(0, ("getDifference " - "{ good - getting user for updateShortMessage }%1" + "{ good - after not all data loaded in updateShortMessage }%1" ).arg(_session->mtp().isTestMode() ? " TESTMODE" : "")); return getDifference(); } @@ -1439,10 +1523,9 @@ void Updates::applyUpdates( case mtpc_updateShortChatMessage: { auto &d = updates.c_updateShortChatMessage(); - const auto chat = session().data().chatLoaded(d.vchat_id()); - if (!chat) { + if (!DataIsLoaded(&_session->data(), d)) { MTP_LOG(0, ("getDifference " - "{ good - getting chat for updateShortChatMessage }%1" + "{ good - after not all data loaded in updateShortChatMessage }%1" ).arg(_session->mtp().isTestMode() ? " TESTMODE" : "")); return getDifference(); }