Check all peers load status in short updates.

This commit is contained in:
John Preston
2026-03-30 15:34:31 +07:00
parent b6ae741000
commit bb6fc19768
+88 -5
View File
@@ -91,6 +91,90 @@ enum class DataIsLoadedResult {
Ok = 3,
};
[[nodiscard]] bool PeerDataIsLoaded(
not_null<Data::Session*> owner,
PeerId peerId) {
return !peerId || owner->peerLoaded(peerId);
}
[[nodiscard]] bool MentionUsersDataIsLoaded(
not_null<Data::Session*> owner,
const MTPVector<MTPMessageEntity> &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<Data::Session*> 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<Data::Session*> 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<Data::Session*> 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<Data::Session*> 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<Main::Session*> 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();
}