From b04c7efdf4b1f98e04c9233132acb350700926b6 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 17 Nov 2025 18:15:16 +0400 Subject: [PATCH] Fix last server message tracking in sublist/forum. Fixes #30011. --- Telegram/SourceFiles/api/api_updates.cpp | 10 +++++++++- Telegram/SourceFiles/data/data_forum_topic.cpp | 10 ++++++++++ Telegram/SourceFiles/data/data_forum_topic.h | 1 + Telegram/SourceFiles/data/data_saved_sublist.cpp | 5 +++-- Telegram/SourceFiles/data/data_saved_sublist.h | 4 ++-- Telegram/SourceFiles/history/history.cpp | 2 +- 6 files changed, 26 insertions(+), 6 deletions(-) diff --git a/Telegram/SourceFiles/api/api_updates.cpp b/Telegram/SourceFiles/api/api_updates.cpp index 4394d71414..56b2b333cb 100644 --- a/Telegram/SourceFiles/api/api_updates.cpp +++ b/Telegram/SourceFiles/api/api_updates.cpp @@ -30,6 +30,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/notify/data_notify_settings.h" #include "data/stickers/data_stickers.h" #include "data/data_saved_messages.h" +#include "data/data_saved_sublist.h" #include "data/data_session.h" #include "data/data_user.h" #include "data/data_chat.h" @@ -43,6 +44,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_histories.h" #include "data/data_folder.h" #include "data/data_forum.h" +#include "data/data_forum_topic.h" #include "data/data_send_action.h" #include "data/data_stories.h" #include "data/data_message_reactions.h" @@ -1701,7 +1703,13 @@ void Updates::feedUpdate(const MTPUpdate &update) { local->history()->peer, local->date()); } - local->setRealId(d.vid().v); + local->setRealId(newId); + if (const auto topic = local->topic()) { + topic->applyMaybeLast(local); + } + if (const auto sublist = local->savedSublist()) { + sublist->applyMaybeLast(local); + } } } } else { diff --git a/Telegram/SourceFiles/data/data_forum_topic.cpp b/Telegram/SourceFiles/data/data_forum_topic.cpp index 1dfa893bf4..4c4280ed7e 100644 --- a/Telegram/SourceFiles/data/data_forum_topic.cpp +++ b/Telegram/SourceFiles/data/data_forum_topic.cpp @@ -836,6 +836,16 @@ void ForumTopic::applyColorId(int32 colorId) { } } +void ForumTopic::applyMaybeLast(not_null item) { + if (!_lastServerMessage.value_or(nullptr) + || (*_lastServerMessage)->id < item->id) { + setLastServerMessage(item); + resolveChatListMessageGroup(); + } else { + growLastKnownServerMessageId(item->id); + } +} + void ForumTopic::applyItemAdded(not_null item) { if (item->isRegular()) { setLastServerMessage(item); diff --git a/Telegram/SourceFiles/data/data_forum_topic.h b/Telegram/SourceFiles/data/data_forum_topic.h index 49e299f963..068fb343ab 100644 --- a/Telegram/SourceFiles/data/data_forum_topic.h +++ b/Telegram/SourceFiles/data/data_forum_topic.h @@ -160,6 +160,7 @@ public: void applyCreator(PeerId creatorId); void applyCreationDate(TimeId date); void applyIsMy(bool my); + void applyMaybeLast(not_null item); void applyItemAdded(not_null item); void applyItemRemoved(MsgId id); void maybeSetLastMessage(not_null item); diff --git a/Telegram/SourceFiles/data/data_saved_sublist.cpp b/Telegram/SourceFiles/data/data_saved_sublist.cpp index 69473cdc83..bf6d050147 100644 --- a/Telegram/SourceFiles/data/data_saved_sublist.cpp +++ b/Telegram/SourceFiles/data/data_saved_sublist.cpp @@ -187,12 +187,13 @@ rpl::producer<> SavedSublist::destroyed() const { ) | rpl::to_empty); } -void SavedSublist::applyMaybeLast(not_null item, bool added) { - growLastKnownServerMessageId(item->id); +void SavedSublist::applyMaybeLast(not_null item) { if (!_lastServerMessage.value_or(nullptr) || (*_lastServerMessage)->id < item->id) { setLastServerMessage(item); resolveChatListMessageGroup(); + } else { + growLastKnownServerMessageId(item->id); } } diff --git a/Telegram/SourceFiles/data/data_saved_sublist.h b/Telegram/SourceFiles/data/data_saved_sublist.h index cdcc2e28ee..92098c16e4 100644 --- a/Telegram/SourceFiles/data/data_saved_sublist.h +++ b/Telegram/SourceFiles/data/data_saved_sublist.h @@ -52,8 +52,7 @@ public: [[nodiscard]] bool isHiddenAuthor() const; [[nodiscard]] rpl::producer<> destroyed() const; - void growLastKnownServerMessageId(MsgId id); - void applyMaybeLast(not_null item, bool added = false); + void applyMaybeLast(not_null item); void applyItemAdded(not_null item); void applyItemRemoved(MsgId id); @@ -143,6 +142,7 @@ private: void setChatListMessage(HistoryItem *item); void allowChatListMessageResolve(); void resolveChatListMessageGroup(); + void growLastKnownServerMessageId(MsgId id); void changeUnreadCountByMessage(MsgId id, int delta); void setUnreadCount(std::optional count); diff --git a/Telegram/SourceFiles/history/history.cpp b/Telegram/SourceFiles/history/history.cpp index d8c12b0731..63393d2d49 100644 --- a/Telegram/SourceFiles/history/history.cpp +++ b/Telegram/SourceFiles/history/history.cpp @@ -752,7 +752,7 @@ not_null History::addNewItem( } if (const auto sublist = item->savedSublist()) { - sublist->applyMaybeLast(item, unread); + sublist->applyMaybeLast(item); } return item;