Apply short topic info from channelMessages.

This commit is contained in:
John Preston 2022-11-08 15:36:46 +04:00
parent 983b6af0b4
commit c7741cb62a
17 changed files with 121 additions and 74 deletions

View file

@ -152,18 +152,22 @@ void MessagesSearch::searchReceived(
const auto total = int(data.vcount().v); const auto total = int(data.vcount().v);
return FoundMessages{ total, std::move(items), nextToken }; return FoundMessages{ total, std::move(items), nextToken };
}, [&](const MTPDmessages_channelMessages &data) { }, [&](const MTPDmessages_channelMessages &data) {
if (const auto channel = _history->peer->asChannel()) {
channel->ptsReceived(data.vpts().v);
} else {
LOG(("API Error: "
"received messages.channelMessages when no channel "
"was passed!"));
}
if (_requestId != 0) { if (_requestId != 0) {
// Don't apply cached data! // Don't apply cached data!
owner.processUsers(data.vusers()); owner.processUsers(data.vusers());
owner.processChats(data.vchats()); owner.processChats(data.vchats());
} }
if (const auto channel = _history->peer->asChannel()) {
channel->ptsReceived(data.vpts().v);
if (_requestId != 0) {
// Don't apply cached data!
channel->processTopics(data.vtopics());
}
} else {
LOG(("API Error: "
"received messages.channelMessages when no channel "
"was passed!"));
}
auto items = HistoryItemsFromTL(&owner, data.vmessages().v); auto items = HistoryItemsFromTL(&owner, data.vmessages().v);
const auto total = int(data.vcount().v); const auto total = int(data.vcount().v);
return FoundMessages{ total, std::move(items), nextToken }; return FoundMessages{ total, std::move(items), nextToken };

View file

@ -2870,18 +2870,18 @@ void ApiWrap::requestMessageAfterDate(
}; };
const auto list = result.match([&]( const auto list = result.match([&](
const MTPDmessages_messages &data) { const MTPDmessages_messages &data) {
return handleMessages(result.c_messages_messages()); return handleMessages(data);
}, [&](const MTPDmessages_messagesSlice &data) { }, [&](const MTPDmessages_messagesSlice &data) {
return handleMessages(result.c_messages_messagesSlice()); return handleMessages(data);
}, [&](const MTPDmessages_channelMessages &data) { }, [&](const MTPDmessages_channelMessages &data) {
const auto &messages = result.c_messages_channelMessages(); if (const auto channel = peer->asChannel()) {
if (peer && peer->isChannel()) { channel->ptsReceived(data.vpts().v);
peer->asChannel()->ptsReceived(messages.vpts().v); channel->processTopics(data.vtopics());
} else { } else {
LOG(("API Error: received messages.channelMessages when " LOG(("API Error: received messages.channelMessages when "
"no channel was passed! (ApiWrap::jumpToDate)")); "no channel was passed! (ApiWrap::jumpToDate)"));
} }
return handleMessages(messages); return handleMessages(data);
}, [&](const MTPDmessages_messagesNotModified &) { }, [&](const MTPDmessages_messagesNotModified &) {
LOG(("API Error: received messages.messagesNotModified! " LOG(("API Error: received messages.messagesNotModified! "
"(ApiWrap::jumpToDate)")); "(ApiWrap::jumpToDate)"));

View file

@ -83,7 +83,6 @@ std::unique_ptr<Data::Forum> MegagroupInfo::takeForumData() {
return result; return result;
} }
return nullptr; return nullptr;
} }
ChannelData::ChannelData(not_null<Data::Session*> owner, PeerId id) ChannelData::ChannelData(not_null<Data::Session*> owner, PeerId id)
@ -876,6 +875,12 @@ const Data::AllowedReactions &ChannelData::allowedReactions() const {
return _allowedReactions; return _allowedReactions;
} }
void ChannelData::processTopics(const MTPVector<MTPForumTopic> &topics) {
if (const auto forum = this->forum()) {
forum->applyReceivedTopics(topics);
}
}
namespace Data { namespace Data {
void ApplyMigration( void ApplyMigration(

View file

@ -437,6 +437,8 @@ public:
return mgInfo ? mgInfo->forum() : nullptr; return mgInfo ? mgInfo->forum() : nullptr;
} }
void processTopics(const MTPVector<MTPForumTopic> &topics);
// Still public data members. // Still public data members.
uint64 access = 0; uint64 access = 0;

View file

@ -204,7 +204,16 @@ void Forum::applyReceivedTopics(
owner().processChats(data.vchats()); owner().processChats(data.vchats());
owner().processMessages(data.vmessages(), NewMessageType::Existing); owner().processMessages(data.vmessages(), NewMessageType::Existing);
channel()->ptsReceived(data.vpts().v); channel()->ptsReceived(data.vpts().v);
const auto &list = data.vtopics().v; applyReceivedTopics(data.vtopics(), std::move(callback));
if (!_staleRootIds.empty()) {
requestSomeStale();
}
}
void Forum::applyReceivedTopics(
const MTPVector<MTPForumTopic> &topics,
Fn<void(not_null<ForumTopic*>)> callback) {
const auto &list = topics.v;
for (const auto &topic : list) { for (const auto &topic : list) {
const auto rootId = topic.match([&](const auto &data) { const auto rootId = topic.match([&](const auto &data) {
return data.vid().v; return data.vid().v;
@ -235,9 +244,6 @@ void Forum::applyReceivedTopics(
} }
}); });
} }
if (!_staleRootIds.empty()) {
requestSomeStale();
}
} }
void Forum::requestSomeStale() { void Forum::requestSomeStale() {

View file

@ -74,6 +74,9 @@ public:
void applyReceivedTopics( void applyReceivedTopics(
const MTPmessages_ForumTopics &topics, const MTPmessages_ForumTopics &topics,
Fn<void(not_null<ForumTopic*>)> callback = nullptr); Fn<void(not_null<ForumTopic*>)> callback = nullptr);
void applyReceivedTopics(
const MTPVector<MTPForumTopic> &topics,
Fn<void(not_null<ForumTopic*>)> callback = nullptr);
[[nodiscard]] MsgId reserveCreatingId( [[nodiscard]] MsgId reserveCreatingId(
const QString &title, const QString &title,

View file

@ -296,6 +296,8 @@ void ForumTopic::readTillEnd() {
void ForumTopic::applyTopic(const MTPDforumTopic &data) { void ForumTopic::applyTopic(const MTPDforumTopic &data) {
Expects(_rootId == data.vid().v); Expects(_rootId == data.vid().v);
const auto min = data.is_short();
applyCreator(peerFromMTP(data.vfrom_id())); applyCreator(peerFromMTP(data.vfrom_id()));
applyCreationDate(data.vdate().v); applyCreationDate(data.vdate().v);
@ -307,32 +309,38 @@ void ForumTopic::applyTopic(const MTPDforumTopic &data) {
} }
applyColorId(data.vicon_color().v); applyColorId(data.vicon_color().v);
if (data.is_pinned()) {
owner().setChatPinned(this, 0, true);
} else {
_list->pinned()->setPinned(this, false);
}
owner().notifySettings().apply(this, data.vnotify_settings());
const auto draft = data.vdraft();
if (draft && draft->type() == mtpc_draftMessage) {
Data::ApplyPeerCloudDraft(
&session(),
channel()->id,
_rootId,
draft->c_draftMessage());
}
applyIsMy(data.is_my()); applyIsMy(data.is_my());
setClosed(data.is_closed()); setClosed(data.is_closed());
_replies->setInboxReadTill( if (min) {
data.vread_inbox_max_id().v, int a = 0;
data.vunread_count().v); } else {
_replies->setOutboxReadTill(data.vread_outbox_max_id().v); if (data.is_pinned()) {
applyTopicTopMessage(data.vtop_message().v); owner().setChatPinned(this, 0, true);
unreadMentions().setCount(data.vunread_mentions_count().v); } else {
unreadReactions().setCount(data.vunread_reactions_count().v); _list->pinned()->setPinned(this, false);
}
owner().notifySettings().apply(this, data.vnotify_settings());
if (const auto draft = data.vdraft()) {
draft->match([&](const MTPDdraftMessage &data) {
Data::ApplyPeerCloudDraft(
&session(),
channel()->id,
_rootId,
data);
}, [](const MTPDdraftMessageEmpty&) {});
}
_replies->setInboxReadTill(
data.vread_inbox_max_id().v,
data.vunread_count().v);
_replies->setOutboxReadTill(data.vread_outbox_max_id().v);
applyTopicTopMessage(data.vtop_message().v);
unreadMentions().setCount(data.vunread_mentions_count().v);
unreadReactions().setCount(data.vunread_reactions_count().v);
}
} }
void ForumTopic::applyCreator(PeerId creatorId) { void ForumTopic::applyCreator(PeerId creatorId) {

View file

@ -661,25 +661,6 @@ void RepliesList::loadAfter() {
bool RepliesList::processMessagesIsEmpty(const MTPmessages_Messages &result) { bool RepliesList::processMessagesIsEmpty(const MTPmessages_Messages &result) {
const auto guard = gsl::finally([&] { _listChanges.fire({}); }); const auto guard = gsl::finally([&] { _listChanges.fire({}); });
const auto fullCount = result.match([&](
const MTPDmessages_messagesNotModified &) {
LOG(("API Error: received messages.messagesNotModified! "
"(HistoryWidget::messagesReceived)"));
return 0;
}, [&](const MTPDmessages_messages &data) {
return int(data.vmessages().v.size());
}, [&](const MTPDmessages_messagesSlice &data) {
return data.vcount().v;
}, [&](const MTPDmessages_channelMessages &data) {
if (_history->peer->isChannel()) {
_history->peer->asChannel()->ptsReceived(data.vpts().v);
} else {
LOG(("API Error: received messages.channelMessages when "
"no channel was passed! (HistoryWidget::messagesReceived)"));
}
return data.vcount().v;
});
auto &owner = _history->owner(); auto &owner = _history->owner();
const auto list = result.match([&]( const auto list = result.match([&](
const MTPDmessages_messagesNotModified &) { const MTPDmessages_messagesNotModified &) {
@ -691,6 +672,27 @@ bool RepliesList::processMessagesIsEmpty(const MTPmessages_Messages &result) {
owner.processChats(data.vchats()); owner.processChats(data.vchats());
return data.vmessages().v; return data.vmessages().v;
}); });
const auto fullCount = result.match([&](
const MTPDmessages_messagesNotModified &) {
LOG(("API Error: received messages.messagesNotModified! "
"(HistoryWidget::messagesReceived)"));
return 0;
}, [&](const MTPDmessages_messages &data) {
return int(data.vmessages().v.size());
}, [&](const MTPDmessages_messagesSlice &data) {
return data.vcount().v;
}, [&](const MTPDmessages_channelMessages &data) {
if (const auto channel = _history->peer->asChannel()) {
channel->ptsReceived(data.vpts().v);
channel->processTopics(data.vtopics());
} else {
LOG(("API Error: received messages.channelMessages when "
"no channel was passed! (HistoryWidget::messagesReceived)"));
}
return data.vcount().v;
});
if (list.isEmpty()) { if (list.isEmpty()) {
return true; return true;
} }

View file

@ -137,9 +137,10 @@ SearchResult ParseSearchResult(
} break; } break;
case mtpc_messages_channelMessages: { case mtpc_messages_channelMessages: {
auto &d = data.c_messages_channelMessages(); const auto &d = data.c_messages_channelMessages();
if (auto channel = peer->asChannel()) { if (const auto channel = peer->asChannel()) {
channel->ptsReceived(d.vpts().v); channel->ptsReceived(d.vpts().v);
channel->processTopics(d.vtopics());
} else { } else {
LOG(("API Error: received messages.channelMessages when " LOG(("API Error: received messages.channelMessages when "
"no channel was passed! (ParseSearchResult)")); "no channel was passed! (ParseSearchResult)"));

View file

@ -2155,6 +2155,7 @@ void Session::processExistingMessages(
data.match([&](const MTPDmessages_channelMessages &data) { data.match([&](const MTPDmessages_channelMessages &data) {
if (channel) { if (channel) {
channel->ptsReceived(data.vpts().v); channel->ptsReceived(data.vpts().v);
channel->processTopics(data.vtopics());
} else { } else {
LOG(("App Error: received messages.channelMessages!")); LOG(("App Error: received messages.channelMessages!"));
} }

View file

@ -295,6 +295,7 @@ void WebPageData::ApplyChanges(
const MTPDmessages_channelMessages &data) { const MTPDmessages_channelMessages &data) {
if (channel) { if (channel) {
channel->ptsReceived(data.vpts().v); channel->ptsReceived(data.vpts().v);
channel->processTopics(data.vtopics());
} else { } else {
LOG(("API Error: received messages.channelMessages " LOG(("API Error: received messages.channelMessages "
"when no channel was passed! (WebPageData::ApplyChanges)")); "when no channel was passed! (WebPageData::ApplyChanges)"));

View file

@ -1643,6 +1643,7 @@ void Widget::searchReceived(
if (const auto peer = searchInPeer()) { if (const auto peer = searchInPeer()) {
if (const auto channel = peer->asChannel()) { if (const auto channel = peer->asChannel()) {
channel->ptsReceived(data.vpts().v); channel->ptsReceived(data.vpts().v);
channel->processTopics(data.vtopics());
} else { } else {
LOG(("API Error: " LOG(("API Error: "
"received messages.channelMessages when no channel " "received messages.channelMessages when no channel "

View file

@ -560,7 +560,7 @@ bool HistoryInner::hasSelectRestriction() const {
} }
void HistoryInner::messagesReceived( void HistoryInner::messagesReceived(
PeerData *peer, not_null<PeerData*> peer,
const QVector<MTPMessage> &messages) { const QVector<MTPMessage> &messages) {
if (_history->peer == peer) { if (_history->peer == peer) {
_history->addOlderSlice(messages); _history->addOlderSlice(messages);
@ -575,7 +575,9 @@ void HistoryInner::messagesReceived(
} }
} }
void HistoryInner::messagesReceivedDown(PeerData *peer, const QVector<MTPMessage> &messages) { void HistoryInner::messagesReceivedDown(
not_null<PeerData*> peer,
const QVector<MTPMessage> &messages) {
if (_history->peer == peer) { if (_history->peer == peer) {
const auto oldLoaded = _migrated const auto oldLoaded = _migrated
&& _history->isEmpty() && _history->isEmpty()

View file

@ -99,8 +99,12 @@ public:
Ui::ChatPaintContext preparePaintContext(const QRect &clip) const; Ui::ChatPaintContext preparePaintContext(const QRect &clip) const;
void messagesReceived(PeerData *peer, const QVector<MTPMessage> &messages); void messagesReceived(
void messagesReceivedDown(PeerData *peer, const QVector<MTPMessage> &messages); not_null<PeerData*> peer,
const QVector<MTPMessage> &messages);
void messagesReceivedDown(
not_null<PeerData*> peer,
const QVector<MTPMessage> &messages);
[[nodiscard]] TextForMimeData getSelectedText() const; [[nodiscard]] TextForMimeData getSelectedText() const;

View file

@ -142,6 +142,7 @@ void Proxy::addSlice(const MTPmessages_Messages &slice, int alreadyLoaded) {
}, [&](const MTPDmessages_channelMessages &data) { }, [&](const MTPDmessages_channelMessages &data) {
if (const auto channel = history->peer->asChannel()) { if (const auto channel = history->peer->asChannel()) {
channel->ptsReceived(data.vpts().v); channel->ptsReceived(data.vpts().v);
channel->processTopics(data.vtopics());
} else { } else {
LOG(("API Error: received messages.channelMessages when " LOG(("API Error: received messages.channelMessages when "
"no channel was passed! (Proxy::addSlice)")); "no channel was passed! (Proxy::addSlice)"));

View file

@ -3021,7 +3021,10 @@ void HistoryWidget::messagesFailed(const MTP::Error &error, int requestId) {
} }
} }
void HistoryWidget::messagesReceived(PeerData *peer, const MTPmessages_Messages &messages, int requestId) { void HistoryWidget::messagesReceived(
not_null<PeerData*> peer,
const MTPmessages_Messages &messages,
int requestId) {
Expects(_history != nullptr); Expects(_history != nullptr);
bool toMigrated = (peer == _peer->migrateFrom()); bool toMigrated = (peer == _peer->migrateFrom());
@ -3057,8 +3060,9 @@ void HistoryWidget::messagesReceived(PeerData *peer, const MTPmessages_Messages
} break; } break;
case mtpc_messages_channelMessages: { case mtpc_messages_channelMessages: {
auto &d(messages.c_messages_channelMessages()); auto &d(messages.c_messages_channelMessages());
if (peer && peer->isChannel()) { if (const auto channel = peer->asChannel()) {
peer->asChannel()->ptsReceived(d.vpts().v); channel->ptsReceived(d.vpts().v);
channel->processTopics(d.vtopics());
} else { } else {
LOG(("API Error: received messages.channelMessages when no channel was passed! (HistoryWidget::messagesReceived)")); LOG(("API Error: received messages.channelMessages when no channel was passed! (HistoryWidget::messagesReceived)"));
} }
@ -5668,7 +5672,9 @@ std::optional<int> HistoryWidget::unreadBarTop() const {
return std::nullopt; return std::nullopt;
} }
void HistoryWidget::addMessagesToFront(PeerData *peer, const QVector<MTPMessage> &messages) { void HistoryWidget::addMessagesToFront(
not_null<PeerData*> peer,
const QVector<MTPMessage> &messages) {
_list->messagesReceived(peer, messages); _list->messagesReceived(peer, messages);
if (!_firstLoadRequest) { if (!_firstLoadRequest) {
updateHistoryGeometry(); updateHistoryGeometry();
@ -5677,7 +5683,7 @@ void HistoryWidget::addMessagesToFront(PeerData *peer, const QVector<MTPMessage>
} }
void HistoryWidget::addMessagesToBack( void HistoryWidget::addMessagesToBack(
PeerData *peer, not_null<PeerData*> peer,
const QVector<MTPMessage> &messages) { const QVector<MTPMessage> &messages) {
const auto checkForUnreadStart = [&] { const auto checkForUnreadStart = [&] {
if (_history->unreadBar() || !_history->trackUnreadMessages()) { if (_history->unreadBar() || !_history->trackUnreadMessages()) {

View file

@ -522,10 +522,10 @@ private:
void checkPreview(); void checkPreview();
void requestPreview(); void requestPreview();
void gotPreview(QString links, const MTPMessageMedia &media, mtpRequestId req); void gotPreview(QString links, const MTPMessageMedia &media, mtpRequestId req);
void messagesReceived(PeerData *peer, const MTPmessages_Messages &messages, int requestId); void messagesReceived(not_null<PeerData*> peer, const MTPmessages_Messages &messages, int requestId);
void messagesFailed(const MTP::Error &error, int requestId); void messagesFailed(const MTP::Error &error, int requestId);
void addMessagesToFront(PeerData *peer, const QVector<MTPMessage> &messages); void addMessagesToFront(not_null<PeerData*> peer, const QVector<MTPMessage> &messages);
void addMessagesToBack(PeerData *peer, const QVector<MTPMessage> &messages); void addMessagesToBack(not_null<PeerData*> peer, const QVector<MTPMessage> &messages);
void updateHistoryGeometry(bool initial = false, bool loadedDown = false, const ScrollChange &change = { ScrollChangeNone, 0 }); void updateHistoryGeometry(bool initial = false, bool loadedDown = false, const ScrollChange &change = { ScrollChangeNone, 0 });
void updateListSize(); void updateListSize();