Fix rescheduling of being edited message.

GitOrigin-RevId: f398f11ac37fbec9edbcbf8b470620f7d43db29d
This commit is contained in:
levlam 2019-12-06 20:47:22 +03:00
parent bdc8c27bc4
commit 2c030f1bed
2 changed files with 21 additions and 19 deletions

View File

@ -9004,10 +9004,11 @@ void MessagesManager::unload_dialog(DialogId dialog_id) {
} }
} }
void MessagesManager::delete_all_dialog_messages(Dialog *d, bool remove_from_dialog_list, bool is_permanent) { void MessagesManager::delete_all_dialog_messages(Dialog *d, bool remove_from_dialog_list, bool is_permanently_deleted) {
CHECK(d != nullptr); CHECK(d != nullptr);
LOG(INFO) << "Delete all messages in " << d->dialog_id LOG(INFO) << "Delete all messages in " << d->dialog_id
<< " with remove_from_dialog_list = " << remove_from_dialog_list << " and is_permanent = " << is_permanent; << " with remove_from_dialog_list = " << remove_from_dialog_list
<< " and is_permanently_deleted = " << is_permanently_deleted;
if (is_debug_message_op_enabled()) { if (is_debug_message_op_enabled()) {
d->debug_message_op.emplace_back(Dialog::MessageOp::DeleteAll, MessageId(), MessageContentType::None, d->debug_message_op.emplace_back(Dialog::MessageOp::DeleteAll, MessageId(), MessageContentType::None,
remove_from_dialog_list, false, false, ""); remove_from_dialog_list, false, false, "");
@ -9046,9 +9047,9 @@ void MessagesManager::delete_all_dialog_messages(Dialog *d, bool remove_from_dia
} }
vector<int64> deleted_message_ids; vector<int64> deleted_message_ids;
do_delete_all_dialog_messages(d, d->messages, deleted_message_ids); do_delete_all_dialog_messages(d, d->messages, is_permanently_deleted, deleted_message_ids);
delete_all_dialog_messages_from_database(d, MessageId::max(), "delete_all_dialog_messages"); delete_all_dialog_messages_from_database(d, MessageId::max(), "delete_all_dialog_messages");
if (is_permanent) { if (is_permanently_deleted) {
for (auto id : deleted_message_ids) { for (auto id : deleted_message_ids) {
d->deleted_message_ids.insert(MessageId{id}); d->deleted_message_ids.insert(MessageId{id});
} }
@ -9080,7 +9081,7 @@ void MessagesManager::delete_all_dialog_messages(Dialog *d, bool remove_from_dia
on_dialog_updated(d->dialog_id, "delete_all_dialog_messages"); on_dialog_updated(d->dialog_id, "delete_all_dialog_messages");
send_update_delete_messages(d->dialog_id, std::move(deleted_message_ids), is_permanent, false); send_update_delete_messages(d->dialog_id, std::move(deleted_message_ids), is_permanently_deleted, false);
} }
void MessagesManager::delete_dialog(DialogId dialog_id) { void MessagesManager::delete_dialog(DialogId dialog_id) {
@ -12553,15 +12554,15 @@ unique_ptr<MessagesManager::Message> MessagesManager::do_delete_message(Dialog *
update_message_count_by_index(d, -1, result.get()); update_message_count_by_index(d, -1, result.get());
} }
on_message_deleted(d, result.get(), source); on_message_deleted(d, result.get(), is_permanently_deleted, source);
return result; return result;
} }
void MessagesManager::on_message_deleted(Dialog *d, Message *m, const char *source) { void MessagesManager::on_message_deleted(Dialog *d, Message *m, bool is_permanently_deleted, const char *source) {
// also called for unloaded messages // also called for unloaded messages
cancel_send_deleted_message(d->dialog_id, m); cancel_send_deleted_message(d->dialog_id, m, is_permanently_deleted);
CHECK(m->message_id.is_valid()); CHECK(m->message_id.is_valid());
switch (d->dialog_id.get_type()) { switch (d->dialog_id.get_type()) {
@ -12626,13 +12627,13 @@ unique_ptr<MessagesManager::Message> MessagesManager::do_delete_scheduled_messag
CHECK(erased != 0); CHECK(erased != 0);
} }
cancel_send_deleted_message(d->dialog_id, result.get()); cancel_send_deleted_message(d->dialog_id, result.get(), is_permanently_deleted);
return result; return result;
} }
void MessagesManager::do_delete_all_dialog_messages(Dialog *d, unique_ptr<Message> &message, void MessagesManager::do_delete_all_dialog_messages(Dialog *d, unique_ptr<Message> &message,
vector<int64> &deleted_message_ids) { bool is_permanently_deleted, vector<int64> &deleted_message_ids) {
if (message == nullptr) { if (message == nullptr) {
return; return;
} }
@ -12647,13 +12648,13 @@ void MessagesManager::do_delete_all_dialog_messages(Dialog *d, unique_ptr<Messag
LOG(INFO) << "Delete " << message_id; LOG(INFO) << "Delete " << message_id;
deleted_message_ids.push_back(message_id.get()); deleted_message_ids.push_back(message_id.get());
do_delete_all_dialog_messages(d, message->right, deleted_message_ids); do_delete_all_dialog_messages(d, message->right, is_permanently_deleted, deleted_message_ids);
do_delete_all_dialog_messages(d, message->left, deleted_message_ids); do_delete_all_dialog_messages(d, message->left, is_permanently_deleted, deleted_message_ids);
delete_active_live_location(d->dialog_id, m); delete_active_live_location(d->dialog_id, m);
remove_message_file_sources(d->dialog_id, m); remove_message_file_sources(d->dialog_id, m);
on_message_deleted(d, message.get(), "do_delete_all_dialog_messages"); on_message_deleted(d, message.get(), is_permanently_deleted, "do_delete_all_dialog_messages");
message = nullptr; message = nullptr;
} }
@ -17719,10 +17720,10 @@ void MessagesManager::cancel_send_message_query(DialogId dialog_id, Message *m)
} }
} }
void MessagesManager::cancel_send_deleted_message(DialogId dialog_id, Message *m) { void MessagesManager::cancel_send_deleted_message(DialogId dialog_id, Message *m, bool is_permanently_deleted) {
if (m->message_id.is_yet_unsent()) { if (m->message_id.is_yet_unsent()) {
cancel_send_message_query(dialog_id, m); cancel_send_message_query(dialog_id, m);
} else { } else if (is_permanently_deleted || !m->message_id.is_scheduled()) {
cancel_edit_message_media(dialog_id, m, "Message was deleted"); cancel_edit_message_media(dialog_id, m, "Message was deleted");
} }
} }

View File

@ -1620,15 +1620,16 @@ class MessagesManager : public Actor {
unique_ptr<Message> do_delete_scheduled_message(Dialog *d, MessageId message_id, bool is_permanently_deleted, unique_ptr<Message> do_delete_scheduled_message(Dialog *d, MessageId message_id, bool is_permanently_deleted,
const char *source); const char *source);
void on_message_deleted(Dialog *d, Message *m, const char *source); void on_message_deleted(Dialog *d, Message *m, bool is_permanently_deleted, const char *source);
int32 get_unload_dialog_delay() const; int32 get_unload_dialog_delay() const;
void unload_dialog(DialogId dialog_id); void unload_dialog(DialogId dialog_id);
void delete_all_dialog_messages(Dialog *d, bool remove_from_dialog_list, bool is_permanent); void delete_all_dialog_messages(Dialog *d, bool remove_from_dialog_list, bool is_permanently_deleted);
void do_delete_all_dialog_messages(Dialog *d, unique_ptr<Message> &message, vector<int64> &deleted_message_ids); void do_delete_all_dialog_messages(Dialog *d, unique_ptr<Message> &message, bool is_permanently_deleted,
vector<int64> &deleted_message_ids);
void delete_message_from_server(DialogId dialog_id, MessageId message_ids, bool revoke); void delete_message_from_server(DialogId dialog_id, MessageId message_ids, bool revoke);
@ -2125,7 +2126,7 @@ class MessagesManager : public Actor {
void cancel_send_message_query(DialogId dialog_id, Message *m); void cancel_send_message_query(DialogId dialog_id, Message *m);
void cancel_send_deleted_message(DialogId dialog_id, Message *m); void cancel_send_deleted_message(DialogId dialog_id, Message *m, bool is_permanently_deleted);
static int32 get_message_flags(const Message *m); static int32 get_message_flags(const Message *m);