Add MessagesManager::read_dialog_inbox.

This commit is contained in:
levlam 2023-04-14 14:55:59 +03:00
parent 598ba5422f
commit d302dbd241
2 changed files with 37 additions and 26 deletions

View File

@ -20220,38 +20220,47 @@ Status MessagesManager::view_messages(DialogId dialog_id, vector<MessageId> mess
}
CHECK(source == MessageSource::DialogHistory || force_read);
if (max_message_id > d->last_read_inbox_message_id) {
const MessageId last_read_message_id = max_message_id;
const MessageId prev_last_read_inbox_message_id = d->last_read_inbox_message_id;
MessageId read_history_on_server_message_id;
if (dialog_id.get_type() != DialogType::SecretChat) {
if (last_read_message_id.get_prev_server_message_id().get() >
prev_last_read_inbox_message_id.get_prev_server_message_id().get()) {
read_history_on_server_message_id = last_read_message_id.get_prev_server_message_id();
}
} else {
if (last_read_message_id > prev_last_read_inbox_message_id) {
read_history_on_server_message_id = last_read_message_id;
}
}
if (read_history_on_server_message_id.is_valid()) {
// add dummy timeout to not try to repair unread_count in read_history_inbox before server request succeeds
// the timeout will be overwritten in the read_history_on_server call
pending_read_history_timeout_.add_timeout_in(dialog_id.get(), 0);
}
read_history_inbox(d->dialog_id, last_read_message_id, -1, "view_messages 13");
if (read_history_on_server_message_id.is_valid()) {
// call read_history_on_server after read_history_inbox to not have delay before request if all messages are read
read_history_on_server(d, read_history_on_server_message_id);
}
}
read_dialog_inbox(d, max_message_id);
if (d->is_marked_as_unread) {
set_dialog_is_marked_as_unread(d, false);
}
return Status::OK();
}
void MessagesManager::read_dialog_inbox(Dialog *d, MessageId max_message_id) {
CHECK(d != nullptr);
CHECK(max_message_id.is_valid());
CHECK(max_message_id.is_server() || max_message_id.is_local());
if (max_message_id <= d->last_read_inbox_message_id) {
return;
}
const MessageId last_read_message_id = max_message_id;
const MessageId prev_last_read_inbox_message_id = d->last_read_inbox_message_id;
MessageId read_history_on_server_message_id;
if (d->dialog_id.get_type() != DialogType::SecretChat) {
if (last_read_message_id.get_prev_server_message_id().get() >
prev_last_read_inbox_message_id.get_prev_server_message_id().get()) {
read_history_on_server_message_id = last_read_message_id.get_prev_server_message_id();
}
} else {
if (last_read_message_id > prev_last_read_inbox_message_id) {
read_history_on_server_message_id = last_read_message_id;
}
}
if (read_history_on_server_message_id.is_valid()) {
// add dummy timeout to not try to repair unread_count in read_history_inbox before server request succeeds
// the timeout will be overwritten in the read_history_on_server call
pending_read_history_timeout_.add_timeout_in(d->dialog_id.get(), 0);
}
read_history_inbox(d->dialog_id, last_read_message_id, -1, "read_dialog_inbox");
if (read_history_on_server_message_id.is_valid()) {
// call read_history_on_server after read_history_inbox to not have delay before request if all messages are read
read_history_on_server(d, read_history_on_server_message_id);
}
}
void MessagesManager::finish_get_message_views(DialogId dialog_id, const vector<MessageId> &message_ids) {
Dialog *d = get_dialog(dialog_id);
CHECK(d != nullptr);

View File

@ -2253,6 +2253,8 @@ class MessagesManager final : public Actor {
bool has_incoming_notification(DialogId dialog_id, const Message *m) const;
void read_dialog_inbox(Dialog *d, MessageId max_message_id);
int32 calc_new_unread_count_from_last_unread(Dialog *d, MessageId max_message_id, MessageType type) const;
int32 calc_new_unread_count_from_the_end(Dialog *d, MessageId max_message_id, MessageType type,