Notifications fixes and improvements.

GitOrigin-RevId: be1ebd6df5f003207ed450d867772286ebcbea27
This commit is contained in:
levlam 2018-12-04 02:25:29 +03:00
parent 25225d5c4b
commit 254007eab8
3 changed files with 37 additions and 22 deletions

View File

@ -9867,7 +9867,7 @@ void MessagesManager::try_restore_dialog_reply_markup(Dialog *d, const Message *
bool MessagesManager::set_dialog_last_notification(Dialog *d, int32 last_notification_date, bool MessagesManager::set_dialog_last_notification(Dialog *d, int32 last_notification_date,
NotificationId last_notification_id, const char *source) { NotificationId last_notification_id, const char *source) {
if (last_notification_date != d->last_notification_date || d->last_notification_id != last_notification_id) { if (last_notification_date != d->last_notification_date || d->last_notification_id != last_notification_id) {
VLOG(notifications) << "Set dialog last notification to " << last_notification_id << " sent at " VLOG(notifications) << "Set " << d->dialog_id << " last notification to " << last_notification_id << " sent at "
<< last_notification_date << " from " << source; << last_notification_date << " from " << source;
d->last_notification_date = last_notification_date; d->last_notification_date = last_notification_date;
d->last_notification_id = last_notification_id; d->last_notification_id = last_notification_id;
@ -10405,6 +10405,7 @@ void MessagesManager::fix_dialog_last_notification_id(Dialog *d, MessageId messa
} }
} }
if (G()->parameters().use_message_db) { if (G()->parameters().use_message_db) {
VLOG(notifications) << "Get message notification in " << d->dialog_id << " from " << d->last_notification_id;
G()->td_db()->get_messages_db_async()->get_messages_from_notification_id( G()->td_db()->get_messages_db_async()->get_messages_from_notification_id(
d->dialog_id, d->last_notification_id, 1, d->dialog_id, d->last_notification_id, 1,
PromiseCreator::lambda( PromiseCreator::lambda(
@ -10422,6 +10423,7 @@ void MessagesManager::do_fix_dialog_last_notification_id(DialogId dialog_id, Not
return; return;
} }
VLOG(notifications) << "Receive " << result.ok().size() << " messages with notifications in " << dialog_id;
Dialog *d = get_dialog(dialog_id); Dialog *d = get_dialog(dialog_id);
CHECK(d != nullptr); CHECK(d != nullptr);
if (d->last_notification_id != prev_last_notification_id) { if (d->last_notification_id != prev_last_notification_id) {
@ -10436,6 +10438,7 @@ void MessagesManager::do_fix_dialog_last_notification_id(DialogId dialog_id, Not
NotificationId last_notification_id; NotificationId last_notification_id;
for (auto &message : messages) { for (auto &message : messages) {
auto m = on_get_message_from_database(dialog_id, d, std::move(message)); auto m = on_get_message_from_database(dialog_id, d, std::move(message));
VLOG(notifications) << "Receive " << m->message_id << " with " << m->notification_id << " in " << dialog_id;
if (is_message_has_active_notification(d, m)) { if (is_message_has_active_notification(d, m)) {
last_notification_date = m->date; last_notification_date = m->date;
last_notification_id = m->notification_id; last_notification_id = m->notification_id;

View File

@ -670,6 +670,7 @@ void NotificationManager::flush_pending_updates(int32 group_id, const char *sour
// all other additions and edits can be merged to the first addition/edit // all other additions and edits can be merged to the first addition/edit
// i.e. in edit+delete+add chain we want to remove deletion and merge addition to the edit // i.e. in edit+delete+add chain we want to remove deletion and merge addition to the edit
bool is_hidden = get_last_updated_group_key() < group_keys_[NotificationGroupId(group_id)];
bool is_changed = true; bool is_changed = true;
while (is_changed) { while (is_changed) {
is_changed = false; is_changed = false;
@ -796,7 +797,7 @@ void NotificationManager::flush_pending_updates(int32 group_id, const char *sour
break; break;
} }
} }
if (update != nullptr && cur_pos == 1 && (updates.size() > 1 || update_ptr->total_count_ == 0)) { if (update != nullptr && cur_pos == 1 && (updates.size() > 1 || update_ptr->total_count_ == 0 || is_hidden)) {
VLOG(notifications) << "Remove empty update " << cur_pos; VLOG(notifications) << "Remove empty update " << cur_pos;
CHECK(moved_deleted_notification_ids.empty()); CHECK(moved_deleted_notification_ids.empty());
is_changed = true; is_changed = true;
@ -876,6 +877,16 @@ void NotificationManager::flush_pending_updates(int32 group_id, const char *sour
return; return;
} }
auto has_common_notifications = [](const vector<td_api::object_ptr<td_api::notification>> &notifications,
const vector<int32> &notification_ids) {
for (auto &notification : notifications) {
if (std::find(notification_ids.begin(), notification_ids.end(), notification->id_) != notification_ids.end()) {
return true;
}
}
return false;
};
size_t last_update_pos = 0; size_t last_update_pos = 0;
for (size_t i = 1; i < updates.size(); i++) { for (size_t i = 1; i < updates.size(); i++) {
if (updates[last_update_pos]->get_id() == td_api::updateNotificationGroup::ID && if (updates[last_update_pos]->get_id() == td_api::updateNotificationGroup::ID &&
@ -883,9 +894,9 @@ void NotificationManager::flush_pending_updates(int32 group_id, const char *sour
auto last_update_ptr = static_cast<td_api::updateNotificationGroup *>(updates[last_update_pos].get()); auto last_update_ptr = static_cast<td_api::updateNotificationGroup *>(updates[last_update_pos].get());
auto update_ptr = static_cast<td_api::updateNotificationGroup *>(updates[i].get()); auto update_ptr = static_cast<td_api::updateNotificationGroup *>(updates[i].get());
if (last_update_ptr->notification_settings_chat_id_ == update_ptr->notification_settings_chat_id_ && if (last_update_ptr->notification_settings_chat_id_ == update_ptr->notification_settings_chat_id_ &&
last_update_ptr->is_silent_ == update_ptr->is_silent_) { (!last_update_ptr->is_silent_ || update_ptr->is_silent_) &&
if ((last_update_ptr->added_notifications_.empty() && update_ptr->added_notifications_.empty()) || !has_common_notifications(last_update_ptr->added_notifications_, update_ptr->removed_notification_ids_) &&
(last_update_ptr->removed_notification_ids_.empty() && update_ptr->removed_notification_ids_.empty())) { !has_common_notifications(update_ptr->added_notifications_, last_update_ptr->removed_notification_ids_)) {
// combine updates // combine updates
VLOG(notifications) << "Combine " << as_notification_update(last_update_ptr) << " and " VLOG(notifications) << "Combine " << as_notification_update(last_update_ptr) << " and "
<< as_notification_update(update_ptr); << as_notification_update(update_ptr);
@ -899,7 +910,6 @@ void NotificationManager::flush_pending_updates(int32 group_id, const char *sour
continue; continue;
} }
} }
}
last_update_pos++; last_update_pos++;
if (last_update_pos != i) { if (last_update_pos != i) {
updates[last_update_pos] = std::move(updates[i]); updates[last_update_pos] = std::move(updates[i]);

View File

@ -545,7 +545,7 @@ class CliClient final : public Actor {
template <class T> template <class T>
static vector<T> to_integers(Slice ids_string, char delimiter = ' ') { static vector<T> to_integers(Slice ids_string, char delimiter = ' ') {
return transform(full_split(ids_string, delimiter), to_integer<T>); return transform(transform(full_split(ids_string, delimiter), trim<Slice>), to_integer<T>);
} }
void on_result(uint64 generation, uint64 id, tl_object_ptr<td_api::Object> result) { void on_result(uint64 generation, uint64 id, tl_object_ptr<td_api::Object> result) {
@ -3294,10 +3294,12 @@ class CliClient final : public Actor {
send_request(make_tl_object<td_api::resetAllNotificationSettings>()); send_request(make_tl_object<td_api::resetAllNotificationSettings>());
} else if (op == "rn") { } else if (op == "rn") {
string group_id; string group_id;
string notification_id; string notification_ids;
std::tie(group_id, notification_id) = split(args); std::tie(group_id, notification_ids) = split(args);
send_request( char delimiter = notification_ids.find(',') != string::npos ? ',' : ' ';
make_tl_object<td_api::removeNotification>(to_integer<int32>(group_id), to_integer<int32>(notification_id))); for (auto notification_id : to_integers<int32>(notification_ids, delimiter)) {
send_request(make_tl_object<td_api::removeNotification>(to_integer<int32>(group_id), notification_id));
}
} else if (op == "rng") { } else if (op == "rng") {
string group_id; string group_id;
string max_notification_id; string max_notification_id;