Fix last server message tracking in sublist/forum.

Fixes #30011.
This commit is contained in:
John Preston
2025-11-17 18:15:16 +04:00
parent 0119731360
commit b04c7efdf4
6 changed files with 26 additions and 6 deletions
+9 -1
View File
@@ -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 {
@@ -836,6 +836,16 @@ void ForumTopic::applyColorId(int32 colorId) {
}
}
void ForumTopic::applyMaybeLast(not_null<HistoryItem*> item) {
if (!_lastServerMessage.value_or(nullptr)
|| (*_lastServerMessage)->id < item->id) {
setLastServerMessage(item);
resolveChatListMessageGroup();
} else {
growLastKnownServerMessageId(item->id);
}
}
void ForumTopic::applyItemAdded(not_null<HistoryItem*> item) {
if (item->isRegular()) {
setLastServerMessage(item);
@@ -160,6 +160,7 @@ public:
void applyCreator(PeerId creatorId);
void applyCreationDate(TimeId date);
void applyIsMy(bool my);
void applyMaybeLast(not_null<HistoryItem*> item);
void applyItemAdded(not_null<HistoryItem*> item);
void applyItemRemoved(MsgId id);
void maybeSetLastMessage(not_null<HistoryItem*> item);
@@ -187,12 +187,13 @@ rpl::producer<> SavedSublist::destroyed() const {
) | rpl::to_empty);
}
void SavedSublist::applyMaybeLast(not_null<HistoryItem*> item, bool added) {
growLastKnownServerMessageId(item->id);
void SavedSublist::applyMaybeLast(not_null<HistoryItem*> item) {
if (!_lastServerMessage.value_or(nullptr)
|| (*_lastServerMessage)->id < item->id) {
setLastServerMessage(item);
resolveChatListMessageGroup();
} else {
growLastKnownServerMessageId(item->id);
}
}
@@ -52,8 +52,7 @@ public:
[[nodiscard]] bool isHiddenAuthor() const;
[[nodiscard]] rpl::producer<> destroyed() const;
void growLastKnownServerMessageId(MsgId id);
void applyMaybeLast(not_null<HistoryItem*> item, bool added = false);
void applyMaybeLast(not_null<HistoryItem*> item);
void applyItemAdded(not_null<HistoryItem*> 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<int> count);
+1 -1
View File
@@ -752,7 +752,7 @@ not_null<HistoryItem*> History::addNewItem(
}
if (const auto sublist = item->savedSublist()) {
sublist->applyMaybeLast(item, unread);
sublist->applyMaybeLast(item);
}
return item;