Support removing notifications by max_message_id.

GitOrigin-RevId: 7841a68dcc05cb70910da0b28b93996c87782f4b
This commit is contained in:
levlam 2018-11-20 17:08:44 +03:00
parent 4ec3171d29
commit cb1d429eb2
5 changed files with 32 additions and 8 deletions

View File

@ -532,6 +532,9 @@ void NotificationManager::remove_notification(NotificationGroupId group_id, Noti
added_notifications.push_back( added_notifications.push_back(
get_notification_object(group_it->first.dialog_id, get_notification_object(group_it->first.dialog_id,
group_it->second.notifications[old_group_size - max_notification_group_size_ - 1])); group_it->second.notifications[old_group_size - max_notification_group_size_ - 1]));
if (added_notifications.back()->type_ == nullptr) {
added_notifications.pop_back();
}
} else { } else {
// TODO preload more notifications in the group // TODO preload more notifications in the group
} }
@ -552,11 +555,12 @@ void NotificationManager::remove_notification(NotificationGroupId group_id, Noti
} }
void NotificationManager::remove_notification_group(NotificationGroupId group_id, NotificationId max_notification_id, void NotificationManager::remove_notification_group(NotificationGroupId group_id, NotificationId max_notification_id,
int32 new_total_count, Promise<Unit> &&promise) { MessageId max_message_id, int32 new_total_count,
Promise<Unit> &&promise) {
if (!group_id.is_valid()) { if (!group_id.is_valid()) {
return promise.set_error(Status::Error(400, "Group identifier is invalid")); return promise.set_error(Status::Error(400, "Group identifier is invalid"));
} }
if (!max_notification_id.is_valid()) { if (!max_notification_id.is_valid() && !max_message_id.is_valid()) {
return promise.set_error(Status::Error(400, "Notification identifier is invalid")); return promise.set_error(Status::Error(400, "Notification identifier is invalid"));
} }
@ -564,9 +568,11 @@ void NotificationManager::remove_notification_group(NotificationGroupId group_id
return promise.set_value(Unit()); return promise.set_value(Unit());
} }
VLOG(notifications) << "Remove " << group_id << " up to " << max_notification_id; VLOG(notifications) << "Remove " << group_id << " up to " << max_notification_id << " or " << max_message_id;
if (max_notification_id.is_valid()) {
// TODO remove notifications from database by max_notification_id, save that they are removed // TODO remove notifications from database by max_notification_id, save that they are removed
}
auto group_it = get_group(group_id); auto group_it = get_group(group_id);
if (group_it == groups_.end()) { if (group_it == groups_.end()) {
@ -577,7 +583,8 @@ void NotificationManager::remove_notification_group(NotificationGroupId group_id
auto pending_delete_end = group_it->second.pending_notifications.begin(); auto pending_delete_end = group_it->second.pending_notifications.begin();
for (auto it = group_it->second.pending_notifications.begin(); it != group_it->second.pending_notifications.end(); for (auto it = group_it->second.pending_notifications.begin(); it != group_it->second.pending_notifications.end();
++it) { ++it) {
if (it->notification_id.get() <= max_notification_id.get()) { if (it->notification_id.get() <= max_notification_id.get() ||
(max_message_id.is_valid() && it->type->get_message_id().get() <= max_message_id.get())) {
pending_delete_end = it + 1; pending_delete_end = it + 1;
} }
} }
@ -595,7 +602,9 @@ void NotificationManager::remove_notification_group(NotificationGroupId group_id
auto old_group_size = group_it->second.notifications.size(); auto old_group_size = group_it->second.notifications.size();
auto notification_delete_end = old_group_size; auto notification_delete_end = old_group_size;
for (size_t pos = 0; pos < notification_delete_end; pos++) { for (size_t pos = 0; pos < notification_delete_end; pos++) {
if (group_it->second.notifications[pos].notification_id.get() > max_notification_id.get()) { auto &notification = group_it->second.notifications[pos];
if (notification.notification_id.get() > max_notification_id.get() &&
(!max_message_id.is_valid() || notification.type->get_message_id().get() > max_message_id.get())) {
notification_delete_end = pos; notification_delete_end = pos;
} }
} }

View File

@ -7,6 +7,7 @@
#pragma once #pragma once
#include "td/telegram/DialogId.h" #include "td/telegram/DialogId.h"
#include "td/telegram/MessageId.h"
#include "td/telegram/NotificationGroupId.h" #include "td/telegram/NotificationGroupId.h"
#include "td/telegram/NotificationId.h" #include "td/telegram/NotificationId.h"
#include "td/telegram/NotificationType.h" #include "td/telegram/NotificationType.h"
@ -53,7 +54,7 @@ class NotificationManager : public Actor {
Promise<Unit> &&promise); Promise<Unit> &&promise);
void remove_notification_group(NotificationGroupId group_id, NotificationId max_notification_id, void remove_notification_group(NotificationGroupId group_id, NotificationId max_notification_id,
int32 new_total_count, Promise<Unit> &&promise); MessageId max_message_id, int32 new_total_count, Promise<Unit> &&promise);
void on_notification_group_count_max_changed(); void on_notification_group_count_max_changed();

View File

@ -16,6 +16,10 @@ class NotificationTypeMessage : public NotificationType {
return true; return true;
} }
MessageId get_message_id() const override {
return message_id_;
}
td_api::object_ptr<td_api::NotificationType> get_notification_type_object(DialogId dialog_id) const override { td_api::object_ptr<td_api::NotificationType> get_notification_type_object(DialogId dialog_id) const override {
auto message_object = G()->td().get_actor_unsafe()->messages_manager_->get_message_object({dialog_id, message_id_}); auto message_object = G()->td().get_actor_unsafe()->messages_manager_->get_message_object({dialog_id, message_id_});
if (message_object == nullptr) { if (message_object == nullptr) {
@ -44,6 +48,10 @@ class NotificationTypeSecretChat : public NotificationType {
return false; return false;
} }
MessageId get_message_id() const override {
return MessageId();
}
td_api::object_ptr<td_api::NotificationType> get_notification_type_object(DialogId dialog_id) const override { td_api::object_ptr<td_api::NotificationType> get_notification_type_object(DialogId dialog_id) const override {
return td_api::make_object<td_api::notificationTypeNewSecretChat>(); return td_api::make_object<td_api::notificationTypeNewSecretChat>();
} }
@ -66,6 +74,10 @@ class NotificationTypeCall : public NotificationType {
return false; return false;
} }
MessageId get_message_id() const override {
return MessageId();
}
td_api::object_ptr<td_api::NotificationType> get_notification_type_object(DialogId dialog_id) const override { td_api::object_ptr<td_api::NotificationType> get_notification_type_object(DialogId dialog_id) const override {
return td_api::make_object<td_api::notificationTypeNewCall>(call_id_.get()); return td_api::make_object<td_api::notificationTypeNewCall>(call_id_.get());
} }

View File

@ -28,6 +28,8 @@ class NotificationType {
virtual bool can_be_delayed() const = 0; virtual bool can_be_delayed() const = 0;
virtual MessageId get_message_id() const = 0;
virtual td_api::object_ptr<td_api::NotificationType> get_notification_type_object(DialogId dialog_id) const = 0; virtual td_api::object_ptr<td_api::NotificationType> get_notification_type_object(DialogId dialog_id) const = 0;
virtual StringBuilder &to_string_builder(StringBuilder &string_builder) const = 0; virtual StringBuilder &to_string_builder(StringBuilder &string_builder) const = 0;

View File

@ -5110,7 +5110,7 @@ void Td::on_request(uint64 id, const td_api::removeNotificationGroup &request) {
CHECK_IS_USER(); CHECK_IS_USER();
CREATE_OK_REQUEST_PROMISE(); CREATE_OK_REQUEST_PROMISE();
notification_manager_->remove_notification_group(NotificationGroupId(request.notification_group_id_), notification_manager_->remove_notification_group(NotificationGroupId(request.notification_group_id_),
NotificationId(request.max_notification_id_), -1, NotificationId(request.max_notification_id_), MessageId(), -1,
std::move(promise)); std::move(promise));
} }