Initial support for min-user-from-message request.

This commit is contained in:
John Preston
2025-12-18 21:18:33 +04:00
parent 66645ce523
commit 53324d5494
12 changed files with 184 additions and 136 deletions
+3 -120
View File
@@ -137,100 +137,6 @@ bool HasForceLogoutNotification(const MTPUpdates &updates) {
return false;
}
bool ForwardedInfoDataLoaded(
not_null<Main::Session*> session,
const MTPMessageFwdHeader &header) {
return header.match([&](const MTPDmessageFwdHeader &data) {
if (const auto fromId = data.vfrom_id()) {
// Fully loaded is required in this case.
if (!session->data().peerLoaded(peerFromMTP(*fromId))) {
return false;
}
}
return true;
});
}
bool MentionUsersLoaded(
not_null<Main::Session*> session,
const MTPVector<MTPMessageEntity> &entities) {
for (const auto &entity : entities.v) {
auto type = entity.type();
if (type == mtpc_messageEntityMentionName) {
if (!session->data().userLoaded(entity.c_messageEntityMentionName().vuser_id())) {
return false;
}
} else if (type == mtpc_inputMessageEntityMentionName) {
auto &inputUser = entity.c_inputMessageEntityMentionName().vuser_id();
if (inputUser.type() == mtpc_inputUser) {
if (!session->data().userLoaded(inputUser.c_inputUser().vuser_id())) {
return false;
}
}
}
}
return true;
}
DataIsLoadedResult AllDataLoadedForMessage(
not_null<Main::Session*> session,
const MTPMessage &message) {
return message.match([&](const MTPDmessage &message) {
if (const auto fromId = message.vfrom_id()) {
if (!message.is_post()
&& !session->data().peerLoaded(peerFromMTP(*fromId))) {
return DataIsLoadedResult::FromNotLoaded;
}
}
if (const auto viaBotId = message.vvia_bot_id()) {
if (!session->data().userLoaded(*viaBotId)) {
return DataIsLoadedResult::NotLoaded;
}
}
if (const auto fwd = message.vfwd_from()) {
if (!ForwardedInfoDataLoaded(session, *fwd)) {
return DataIsLoadedResult::NotLoaded;
}
}
if (const auto entities = message.ventities()) {
if (!MentionUsersLoaded(session, *entities)) {
return DataIsLoadedResult::MentionNotLoaded;
}
}
return DataIsLoadedResult::Ok;
}, [&](const MTPDmessageService &message) {
if (const auto fromId = message.vfrom_id()) {
if (!message.is_post()
&& !session->data().peerLoaded(peerFromMTP(*fromId))) {
return DataIsLoadedResult::FromNotLoaded;
}
}
return message.vaction().match(
[&](const MTPDmessageActionChatAddUser &action) {
for (const auto &userId : action.vusers().v) {
if (!session->data().userLoaded(userId)) {
return DataIsLoadedResult::NotLoaded;
}
}
return DataIsLoadedResult::Ok;
}, [&](const MTPDmessageActionChatJoinedByLink &action) {
if (!session->data().userLoaded(action.vinviter_id())) {
return DataIsLoadedResult::NotLoaded;
}
return DataIsLoadedResult::Ok;
}, [&](const MTPDmessageActionChatDeleteUser &action) {
if (!session->data().userLoaded(action.vuser_id())) {
return DataIsLoadedResult::NotLoaded;
}
return DataIsLoadedResult::Ok;
}, [](const auto &) {
return DataIsLoadedResult::Ok;
});
}, [](const MTPDmessageEmpty &message) {
return DataIsLoadedResult::Ok;
});
}
} // namespace
Updates::Updates(not_null<Main::Session*> session)
@@ -1613,25 +1519,13 @@ void Updates::feedUpdate(const MTPUpdate &update) {
// New messages.
case mtpc_updateNewMessage: {
auto &d = update.c_updateNewMessage();
const auto isDataLoaded = AllDataLoadedForMessage(&session(), d.vmessage());
if (!requestingDifference() && isDataLoaded != DataIsLoadedResult::Ok) {
MTP_LOG(0, ("getDifference "
"{ good - after not all data loaded in updateNewMessage }%1"
).arg(_session->mtp().isTestMode() ? " TESTMODE" : ""));
// This can be if this update was created by grouping
// some short message update into an updates vector.
return getDifference();
}
_session->data().fillMessagePeers(d.vmessage());
updateAndApply(d.vpts().v, d.vpts_count().v, update);
} break;
case mtpc_updateNewChannelMessage: {
auto &d = update.c_updateNewChannelMessage();
auto channel = session().data().channelLoaded(peerToChannel(PeerFromMessage(d.vmessage())));
const auto isDataLoaded = AllDataLoadedForMessage(&session(), d.vmessage());
{
// Todo delete.
const auto messageId = IdFromMessage(d.vmessage());
@@ -1643,27 +1537,16 @@ void Updates::feedUpdate(const MTPUpdate &update) {
}
}
}
if (!requestingDifference() && (!channel || isDataLoaded != DataIsLoadedResult::Ok)) {
if (!requestingDifference() && !channel) {
MTP_LOG(0, ("getDifference "
"{ good - after not all data loaded in updateNewChannelMessage }%1"
).arg(_session->mtp().isTestMode() ? " TESTMODE" : ""));
// Request last active supergroup participants if the 'from' user was not loaded yet.
// This will optimize similar getDifference() calls for almost all next messages.
if (isDataLoaded == DataIsLoadedResult::FromNotLoaded && channel && channel->isMegagroup()) {
if (channel->canViewMembers()
&& channel->mgInfo->lastParticipants.size() < _session->serverConfig().chatSizeMax
&& (channel->mgInfo->lastParticipants.empty()
|| channel->mgInfo->lastParticipants.size() < channel->membersCount())) {
session().api().chatParticipants().requestLast(channel);
}
}
if (!_byMinChannelTimer.isActive()) { // getDifference after timeout
_byMinChannelTimer.callOnce(PtsWaiter::kWaitForSkippedTimeout);
}
return;
}
_session->data().fillMessagePeers(d.vmessage());
if (channel && !_handlingChannelDifference) {
if (channel->ptsRequesting()) { // skip global updates while getting channel difference
MTP_LOG(0, ("Skipping new channel message because getting the difference."));