From 1833fac094258a3f24232cac6be1f86903c688a4 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 11 Mar 2022 11:04:46 +0400 Subject: [PATCH] Make scheduled message ids determenistic. Fixes #6686. --- Telegram/SourceFiles/data/data_groups.cpp | 5 +---- Telegram/SourceFiles/data/data_msg_id.h | 1 + Telegram/SourceFiles/data/data_scheduled_messages.cpp | 4 ++-- Telegram/SourceFiles/data/data_session.h | 2 +- Telegram/SourceFiles/history/history.cpp | 4 ++++ Telegram/SourceFiles/history/history.h | 1 + 6 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Telegram/SourceFiles/data/data_groups.cpp b/Telegram/SourceFiles/data/data_groups.cpp index ed675143e3..5c0756cacb 100644 --- a/Telegram/SourceFiles/data/data_groups.cpp +++ b/Telegram/SourceFiles/data/data_groups.cpp @@ -113,12 +113,9 @@ HistoryItemsList::const_iterator Groups::findPositionForItem( const HistoryItemsList &group, not_null item) { const auto last = end(group); - if (!item->isRegular()) { - return last; - } const auto itemId = item->id; for (auto result = begin(group); result != last; ++result) { - if ((*result)->isRegular() && (*result)->id > itemId) { + if ((*result)->id > itemId) { return result; } } diff --git a/Telegram/SourceFiles/data/data_msg_id.h b/Telegram/SourceFiles/data/data_msg_id.h index 448bf10ad6..24e1c53252 100644 --- a/Telegram/SourceFiles/data/data_msg_id.h +++ b/Telegram/SourceFiles/data/data_msg_id.h @@ -76,6 +76,7 @@ Q_DECLARE_METATYPE(MsgId); constexpr auto StartClientMsgId = MsgId(0x01 - (1LL << 58)); constexpr auto EndClientMsgId = MsgId(-(1LL << 57)); constexpr auto ServerMaxMsgId = MsgId(1LL << 56); +constexpr auto ScheduledMsgIdsRange = (1LL << 32); constexpr auto ShowAtUnreadMsgId = MsgId(0); constexpr auto SpecialMsgIdShift = EndClientMsgId.bare; diff --git a/Telegram/SourceFiles/data/data_scheduled_messages.cpp b/Telegram/SourceFiles/data/data_scheduled_messages.cpp index 005925c55d..eada95dff9 100644 --- a/Telegram/SourceFiles/data/data_scheduled_messages.cpp +++ b/Telegram/SourceFiles/data/data_scheduled_messages.cpp @@ -319,7 +319,7 @@ void ScheduledMessages::apply( } else { Assert(!list.itemById.contains(local->id)); Assert(!list.idByItem.contains(local)); - local->setRealId(local->history()->nextNonHistoryEntryId()); + local->setRealId(local->history()->scheduledMessageId(id)); list.idByItem.emplace(local, id); list.itemById.emplace(id, local); } @@ -467,7 +467,7 @@ HistoryItem *ScheduledMessages::append( } const auto item = _session->data().addNewMessage( - history->nextNonHistoryEntryId(), + history->scheduledMessageId(id), PrepareMessage(message), MessageFlags(), // localFlags NewMessageType::Existing); diff --git a/Telegram/SourceFiles/data/data_session.h b/Telegram/SourceFiles/data/data_session.h index def8eee031..fecf7cff7a 100644 --- a/Telegram/SourceFiles/data/data_session.h +++ b/Telegram/SourceFiles/data/data_session.h @@ -993,7 +993,7 @@ private: std::unique_ptr _sponsoredMessages; const std::unique_ptr _reactions; - MsgId _nonHistoryEntryId = ServerMaxMsgId; + MsgId _nonHistoryEntryId = ServerMaxMsgId.bare + ScheduledMsgIdsRange; rpl::lifetime _lifetime; diff --git a/Telegram/SourceFiles/history/history.cpp b/Telegram/SourceFiles/history/history.cpp index 70dbef59d8..6dc57db49c 100644 --- a/Telegram/SourceFiles/history/history.cpp +++ b/Telegram/SourceFiles/history/history.cpp @@ -1760,6 +1760,10 @@ MsgId History::nextNonHistoryEntryId() { return owner().nextNonHistoryEntryId(); } +MsgId History::scheduledMessageId(MsgId remoteScheduledMsgId) const { + return ServerMaxMsgId + remoteScheduledMsgId + 1; +} + bool History::folderKnown() const { return _folder.has_value(); } diff --git a/Telegram/SourceFiles/history/history.h b/Telegram/SourceFiles/history/history.h index 6de30b3ebd..c7f26be43d 100644 --- a/Telegram/SourceFiles/history/history.h +++ b/Telegram/SourceFiles/history/history.h @@ -439,6 +439,7 @@ public: [[nodiscard]] std::pair findItemAndOffset(int top) const; [[nodiscard]] MsgId nextNonHistoryEntryId(); + [[nodiscard]] MsgId scheduledMessageId(MsgId remoteScheduledMsgId) const; bool folderKnown() const override; Data::Folder *folder() const override;