From fd47fd4d9ece7d561814dcaf65b82c9676e3f94d Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 9 Jan 2023 11:48:33 +0400 Subject: [PATCH] Track shared media index better. Fixes #25667. --- Telegram/SourceFiles/api/api_editing.cpp | 1 + Telegram/SourceFiles/history/history.cpp | 9 ++++---- Telegram/SourceFiles/history/history_item.cpp | 22 ++++++++++++++++++- Telegram/SourceFiles/history/history_item.h | 1 + 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/Telegram/SourceFiles/api/api_editing.cpp b/Telegram/SourceFiles/api/api_editing.cpp index 70dbc6a45..916e27653 100644 --- a/Telegram/SourceFiles/api/api_editing.cpp +++ b/Telegram/SourceFiles/api/api_editing.cpp @@ -148,6 +148,7 @@ void EditMessageWithUploadedMedia( MTPInputMedia media) { const auto done = [=](Fn applyUpdates) { if (item) { + item->removeFromSharedMediaIndex(); item->clearSavedMedia(); item->setIsLocalUpdateMedia(true); applyUpdates(); diff --git a/Telegram/SourceFiles/history/history.cpp b/Telegram/SourceFiles/history/history.cpp index b2533c4fe..032ba3b1d 100644 --- a/Telegram/SourceFiles/history/history.cpp +++ b/Telegram/SourceFiles/history/history.cpp @@ -845,18 +845,17 @@ not_null History::addNewToBack( addItemToBlock(item); if (!unread && item->isRegular()) { - if (const auto sharedMediaTypes = item->sharedMediaTypes()) { + if (const auto types = item->sharedMediaTypes()) { auto from = loadedAtTop() ? 0 : minMsgId(); auto till = loadedAtBottom() ? ServerMaxMsgId : maxMsgId(); auto &storage = session().storage(); storage.add(Storage::SharedMediaAddExisting( peer->id, MsgId(0), // topicRootId - sharedMediaTypes, + types, item->id, { from, till })); - const auto pinned = sharedMediaTypes.test( - Storage::SharedMediaType::Pinned); + const auto pinned = types.test(Storage::SharedMediaType::Pinned); if (pinned) { setHasPinnedMessages(true); } @@ -864,7 +863,7 @@ not_null History::addNewToBack( storage.add(Storage::SharedMediaAddExisting( peer->id, topic->rootId(), - sharedMediaTypes, + types, item->id, { item->id, item->id})); if (pinned) { diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index 2ea02494d..2770eec1e 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -1395,6 +1395,7 @@ void HistoryItem::applyEdition(HistoryMessageEdition &&edition) { setReplyMarkup(base::take(edition.replyMarkup)); } if (!isLocalUpdateMedia()) { + removeFromSharedMediaIndex(); refreshMedia(edition.mtpMedia); } if (!edition.useSameReactions) { @@ -1405,6 +1406,9 @@ void HistoryItem::applyEdition(HistoryMessageEdition &&edition) { setText(_media ? edition.textWithEntities : EnsureNonEmpty(edition.textWithEntities)); + if (!isLocalUpdateMedia()) { + indexAsNewItem(); + } if (!edition.useSameReplies) { if (!edition.replies.isNull) { if (checkRepliesPts(edition.replies)) { @@ -1424,6 +1428,7 @@ void HistoryItem::applyEdition(const MTPDmessageService &message) { if (message.vaction().type() == mtpc_messageActionHistoryClear) { const auto wasGrouped = history()->owner().groups().isGrouped(this); setReplyMarkup({}); + removeFromSharedMediaIndex(); refreshMedia(nullptr); setTextValue({}); changeViewsCount(-1); @@ -1653,7 +1658,10 @@ void HistoryItem::destroyHistoryEntry() { Storage::SharedMediaTypesMask HistoryItem::sharedMediaTypes() const { auto result = Storage::SharedMediaTypesMask {}; - if (const auto media = this->media()) { + const auto media = _savedLocalEditMediaData + ? _savedLocalEditMediaData->media.get() + : _media.get(); + if (media) { result.set(media->sharedMediaTypes()); } if (hasTextLinks()) { @@ -1684,6 +1692,18 @@ void HistoryItem::indexAsNewItem() { } } +void HistoryItem::removeFromSharedMediaIndex() { + if (isRegular()) { + if (const auto types = sharedMediaTypes()) { + _history->session().storage().remove( + Storage::SharedMediaRemoveOne( + _history->peer->id, + types, + id)); + } + } +} + void HistoryItem::incrementReplyToTopCounter() { if (const auto reply = Get()) { changeReplyToTopCounter(reply, 1); diff --git a/Telegram/SourceFiles/history/history_item.h b/Telegram/SourceFiles/history/history_item.h index 0827140d4..05041d4c6 100644 --- a/Telegram/SourceFiles/history/history_item.h +++ b/Telegram/SourceFiles/history/history_item.h @@ -346,6 +346,7 @@ public: [[nodiscard]] Storage::SharedMediaTypesMask sharedMediaTypes() const; void indexAsNewItem(); + void removeFromSharedMediaIndex(); [[nodiscard]] QString notificationHeader() const; [[nodiscard]] TextWithEntities notificationText() const;