Improve synchronization of unread mentions count.
GitOrigin-RevId: 6fa968ff0e2c2b4865078a275aa5bf1603e70583
This commit is contained in:
parent
4d72f8c14b
commit
6babab76f0
@ -6907,7 +6907,7 @@ void MessagesManager::on_get_history(DialogId dialog_id, MessageId from_message_
|
|||||||
}
|
}
|
||||||
|
|
||||||
// be aware that in some cases an empty answer may be returned, because of the race of getHistory and deleteMessages
|
// be aware that in some cases an empty answer may be returned, because of the race of getHistory and deleteMessages
|
||||||
// and not because there is no more messages
|
// and not because there are no more messages
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7239,24 +7239,34 @@ void MessagesManager::on_get_dialog_messages_search_result(DialogId dialog_id, c
|
|||||||
// anyway pretend that there is no more messages
|
// anyway pretend that there is no more messages
|
||||||
first_added_message_id = MessageId::min();
|
first_added_message_id = MessageId::min();
|
||||||
}
|
}
|
||||||
|
Dialog *d = get_dialog(dialog_id);
|
||||||
|
CHECK(d != nullptr);
|
||||||
for (auto &message : messages) {
|
for (auto &message : messages) {
|
||||||
auto new_message = on_get_message(std::move(message), false, dialog_id.get_type() == DialogType::Channel, false,
|
auto new_message = on_get_message(std::move(message), false, dialog_id.get_type() == DialogType::Channel, false,
|
||||||
false, "SearchMessagesQuery");
|
false, "SearchMessagesQuery");
|
||||||
if (new_message != FullMessageId()) {
|
if (new_message == FullMessageId()) {
|
||||||
if (new_message.get_dialog_id() != dialog_id) {
|
|
||||||
LOG(ERROR) << "Receive " << new_message << " instead of a message in " << dialog_id;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO check that messages are returned in decreasing message_id order
|
|
||||||
auto message_id = new_message.get_message_id();
|
|
||||||
if (message_id.get() < first_added_message_id.get() || !first_added_message_id.is_valid()) {
|
|
||||||
first_added_message_id = message_id;
|
|
||||||
}
|
|
||||||
result.push_back(message_id);
|
|
||||||
} else {
|
|
||||||
total_count--;
|
total_count--;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (new_message.get_dialog_id() != dialog_id) {
|
||||||
|
LOG(ERROR) << "Receive " << new_message << " instead of a message in " << dialog_id;
|
||||||
|
total_count--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto message_id = new_message.get_message_id();
|
||||||
|
if (filter == SearchMessagesFilter::UnreadMention &&
|
||||||
|
message_id.get() <= d->last_read_all_mentions_message_id.get()) {
|
||||||
|
total_count--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO check that messages are returned in decreasing message_id order
|
||||||
|
if (message_id.get() < first_added_message_id.get() || !first_added_message_id.is_valid()) {
|
||||||
|
first_added_message_id = message_id;
|
||||||
|
}
|
||||||
|
result.push_back(message_id);
|
||||||
}
|
}
|
||||||
if (total_count < static_cast<int32>(result.size())) {
|
if (total_count < static_cast<int32>(result.size())) {
|
||||||
LOG(ERROR) << "Receive " << result.size() << " valid messages out of " << total_count << " in " << messages.size()
|
LOG(ERROR) << "Receive " << result.size() << " valid messages out of " << total_count << " in " << messages.size()
|
||||||
@ -7265,8 +7275,6 @@ void MessagesManager::on_get_dialog_messages_search_result(DialogId dialog_id, c
|
|||||||
}
|
}
|
||||||
if (query.empty() && !sender_user_id.is_valid() && filter != SearchMessagesFilter::Empty &&
|
if (query.empty() && !sender_user_id.is_valid() && filter != SearchMessagesFilter::Empty &&
|
||||||
G()->parameters().use_message_db) {
|
G()->parameters().use_message_db) {
|
||||||
Dialog *d = get_dialog(dialog_id);
|
|
||||||
CHECK(d != nullptr);
|
|
||||||
bool update_dialog = false;
|
bool update_dialog = false;
|
||||||
|
|
||||||
auto &old_message_count = d->message_count_by_index[search_messages_filter_index(filter)];
|
auto &old_message_count = d->message_count_by_index[search_messages_filter_index(filter)];
|
||||||
@ -8196,7 +8204,7 @@ void MessagesManager::read_all_dialog_mentions(DialogId dialog_id, Promise<Unit>
|
|||||||
|
|
||||||
if (d->last_new_message_id.get() > d->last_read_all_mentions_message_id.get()) {
|
if (d->last_new_message_id.get() > d->last_read_all_mentions_message_id.get()) {
|
||||||
d->last_read_all_mentions_message_id = d->last_new_message_id;
|
d->last_read_all_mentions_message_id = d->last_new_message_id;
|
||||||
on_dialog_updated(dialog_id, "read_all_mentions");
|
on_dialog_updated(dialog_id, "read_all_dialog_mentions");
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<MessageId> message_ids;
|
vector<MessageId> message_ids;
|
||||||
@ -8215,7 +8223,7 @@ void MessagesManager::read_all_dialog_mentions(DialogId dialog_id, Promise<Unit>
|
|||||||
send_closure(G()->td(), &Td::send_update,
|
send_closure(G()->td(), &Td::send_update,
|
||||||
make_tl_object<td_api::updateMessageMentionRead>(dialog_id.get(), m->message_id.get(), 0));
|
make_tl_object<td_api::updateMessageMentionRead>(dialog_id.get(), m->message_id.get(), 0));
|
||||||
is_update_sent = true;
|
is_update_sent = true;
|
||||||
on_message_changed(d, m, true, "read_all_mentions");
|
on_message_changed(d, m, true, "read_all_dialog_mentions");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d->unread_mention_count != 0) {
|
if (d->unread_mention_count != 0) {
|
||||||
@ -8225,7 +8233,7 @@ void MessagesManager::read_all_dialog_mentions(DialogId dialog_id, Promise<Unit>
|
|||||||
send_update_chat_unread_mention_count(d);
|
send_update_chat_unread_mention_count(d);
|
||||||
} else {
|
} else {
|
||||||
LOG(INFO) << "Update unread mention message count in " << dialog_id << " to " << d->unread_mention_count;
|
LOG(INFO) << "Update unread mention message count in " << dialog_id << " to " << d->unread_mention_count;
|
||||||
on_dialog_updated(dialog_id, "read_all_mentions");
|
on_dialog_updated(dialog_id, "read_all_dialog_mentions");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
remove_message_dialog_notifications(d, MessageId::max(), d->mention_notification_group, "read_all_dialog_mentions");
|
remove_message_dialog_notifications(d, MessageId::max(), d->mention_notification_group, "read_all_dialog_mentions");
|
||||||
@ -14816,15 +14824,20 @@ void MessagesManager::on_search_dialog_messages_db_result(int64 random_id, Dialo
|
|||||||
for (auto &message : messages) {
|
for (auto &message : messages) {
|
||||||
auto m = on_get_message_from_database(dialog_id, d, message, "on_search_dialog_messages_db_result");
|
auto m = on_get_message_from_database(dialog_id, d, message, "on_search_dialog_messages_db_result");
|
||||||
if (m != nullptr && first_db_message_id.get() <= m->message_id.get()) {
|
if (m != nullptr && first_db_message_id.get() <= m->message_id.get()) {
|
||||||
res.push_back(m->message_id);
|
if (filter_type == SearchMessagesFilter::UnreadMention && !m->contains_unread_mention) {
|
||||||
|
// skip already read by d->last_read_all_mentions_message_id mentions
|
||||||
|
} else {
|
||||||
|
res.push_back(m->message_id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto &message_count = d->message_count_by_index[search_messages_filter_index(filter_type)];
|
auto &message_count = d->message_count_by_index[search_messages_filter_index(filter_type)];
|
||||||
int32 result_size = narrow_cast<int32>(res.size());
|
int32 result_size = narrow_cast<int32>(res.size());
|
||||||
if ((message_count < result_size) ||
|
bool from_the_end =
|
||||||
(from_message_id == MessageId::max() && first_db_message_id == MessageId::min() && message_count > result_size &&
|
from_message_id == MessageId::max() || (offset < 0 && (result_size == 0 || res[0].get() < from_message_id.get()));
|
||||||
result_size < limit + offset)) {
|
if (message_count < result_size || (message_count > result_size && from_the_end &&
|
||||||
|
first_db_message_id == MessageId::min() && result_size < limit + offset)) {
|
||||||
LOG(INFO) << "Fix found message count in " << dialog_id << " from " << message_count << " to " << result_size;
|
LOG(INFO) << "Fix found message count in " << dialog_id << " from " << message_count << " to " << result_size;
|
||||||
message_count = result_size;
|
message_count = result_size;
|
||||||
if (filter_type == SearchMessagesFilter::UnreadMention) {
|
if (filter_type == SearchMessagesFilter::UnreadMention) {
|
||||||
@ -23375,6 +23388,9 @@ MessagesManager::Message *MessagesManager::add_message_to_dialog(Dialog *d, uniq
|
|||||||
|
|
||||||
if (message->contains_unread_mention && message_id.get() <= d->last_read_all_mentions_message_id.get()) {
|
if (message->contains_unread_mention && message_id.get() <= d->last_read_all_mentions_message_id.get()) {
|
||||||
message->contains_unread_mention = false;
|
message->contains_unread_mention = false;
|
||||||
|
if (message->from_database) {
|
||||||
|
on_message_changed(d, message.get(), false, "add already read mention message to dialog");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*need_update && may_need_message_notification(d, message.get())) {
|
if (*need_update && may_need_message_notification(d, message.get())) {
|
||||||
|
Reference in New Issue
Block a user