diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index c901dfe9..6b52c3ba 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -8298,8 +8298,8 @@ void MessagesManager::read_history_inbox(DialogId dialog_id, MessageId max_messa } LOG_IF(INFO, d->last_new_message_id.is_valid() && max_message_id.get() > d->last_new_message_id.get() && - max_message_id.is_server() && dialog_id.get_type() != DialogType::Channel && - !running_get_difference_) + max_message_id.get() > d->max_notification_message_id.get() && max_message_id.is_server() && + dialog_id.get_type() != DialogType::Channel && !running_get_difference_) << "Receive read inbox update up to unknown " << max_message_id << " in " << dialog_id << " from " << source << ". Last new is " << d->last_new_message_id << ", unread_count = " << unread_count << ". Possible only for deleted incoming message. " << td_->updates_manager_->get_state(); @@ -12884,6 +12884,9 @@ Status MessagesManager::view_messages(DialogId dialog_id, const vector max_message_id.get() && + message_id.get() <= d->max_notification_message_id.get()) { + max_message_id = message_id; } } if (!d->pending_viewed_message_ids.empty()) { @@ -18214,8 +18217,19 @@ Result MessagesManager::get_messag if (d == nullptr) { return Status::Error("Ignore notification in unknown chat"); } - if (message_id.is_valid() && message_id.get() <= d->last_new_message_id.get()) { - return Status::Error("Ignore notification about known message"); + if (message_id.is_valid()) { + if (message_id.get() <= d->last_new_message_id.get()) { + return Status::Error("Ignore notification about known message"); + } + if (message_id.get() == d->max_notification_message_id.get()) { + return Status::Error("Ignore previously added message push notification"); + } + if (message_id.get() < d->max_notification_message_id.get()) { + return Status::Error("Ignore out of order message push notification"); + } + if (message_id.get() <= d->last_read_inbox_message_id.get()) { + return Status::Error("Ignore notification about read message"); + } } if (random_id != 0) { CHECK(dialog_id.get_type() == DialogType::SecretChat); @@ -18254,6 +18268,10 @@ Result MessagesManager::get_messag return Status::Error("Can't assign notification group ID"); } + if (message_id.is_valid() && message_id.get() > d->max_notification_message_id.get()) { + d->max_notification_message_id = message_id; + } + MessagePushNotificationInfo result; result.group_id = group_id; result.group_type = contains_mention ? NotificationGroupType::Mentions : NotificationGroupType::Messages; diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 53e6aaa6..1233ec9b 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -958,6 +958,7 @@ class MessagesManager : public Actor { MessageId deleted_last_message_id; int32 pending_last_message_date = 0; MessageId pending_last_message_id; + MessageId max_notification_message_id; MessageId max_added_message_id; MessageId being_added_message_id;