diff --git a/Telegram/SourceFiles/history/history.cpp b/Telegram/SourceFiles/history/history.cpp index bfa188a2fc..b7024dd3ea 100644 --- a/Telegram/SourceFiles/history/history.cpp +++ b/Telegram/SourceFiles/history/history.cpp @@ -1540,9 +1540,21 @@ void History::calculateFirstUnreadMessage() { } } +void History::readClientSideMessages() { + for (const auto &block : blocks) { + for (const auto &view : block->messages) { + const auto item = view->data(); + if (!item->out()) { + item->markClientSideAsRead(); + } + } + } +} + MsgId History::readInbox() { const auto upTo = msgIdForRead(); setUnreadCount(0); + readClientSideMessages(); if (upTo) { inboxRead(upTo); } diff --git a/Telegram/SourceFiles/history/history.h b/Telegram/SourceFiles/history/history.h index e5067d2b64..0a40f659b7 100644 --- a/Telegram/SourceFiles/history/history.h +++ b/Telegram/SourceFiles/history/history.h @@ -426,6 +426,7 @@ private: void setInboxReadTill(MsgId upTo); void setOutboxReadTill(MsgId upTo); + void readClientSideMessages(); void applyMessageChanges( not_null item, diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index 07c83fc056..53ceb79c6b 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -659,6 +659,10 @@ bool HistoryItem::unread() const { return (_flags & MTPDmessage_ClientFlag::f_clientside_unread); } +void HistoryItem::markClientSideAsRead() { + _flags &= ~MTPDmessage_ClientFlag::f_clientside_unread; +} + MessageGroupId HistoryItem::groupId() const { return _groupId; } diff --git a/Telegram/SourceFiles/history/history_item.h b/Telegram/SourceFiles/history/history_item.h index 475e2bfcf6..824bd4d029 100644 --- a/Telegram/SourceFiles/history/history_item.h +++ b/Telegram/SourceFiles/history/history_item.h @@ -111,16 +111,17 @@ public: void removeMainView(); void destroy(); - bool out() const { + [[nodiscard]] bool out() const { return _flags & MTPDmessage::Flag::f_out; } - bool unread() const; - bool mentionsMe() const { + [[nodiscard]] bool unread() const; + void markClientSideAsRead(); + [[nodiscard]] bool mentionsMe() const { return _flags & MTPDmessage::Flag::f_mentioned; } - bool isUnreadMention() const; - bool isUnreadMedia() const; - bool hasUnreadMediaFlag() const; + [[nodiscard]] bool isUnreadMention() const; + [[nodiscard]] bool isUnreadMedia() const; + [[nodiscard]] bool hasUnreadMediaFlag() const; void markMediaRead(); @@ -129,7 +130,7 @@ public: void savePreviousMedia() { _savedMedia = _media->clone(this); } - bool isEditingMedia() const { + [[nodiscard]] bool isEditingMedia() const { return _savedMedia != nullptr; } void clearSavedMedia() {