Skip to content

Commit 331a48a

Browse files
committed
Fix order of updates applying in secret chats.
GitOrigin-RevId: 3cf1c152c4faf21bc3d1f6cb58fcbce6417623ef
1 parent 4d827db commit 331a48a

File tree

2 files changed

+68
-9
lines changed

2 files changed

+68
-9
lines changed

td/telegram/MessagesManager.cpp

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9485,15 +9485,32 @@ void MessagesManager::on_send_secret_message_success(int64 random_id, MessageId
94859485

94869486
void MessagesManager::delete_secret_messages(SecretChatId secret_chat_id, std::vector<int64> random_ids,
94879487
Promise<> promise) {
9488-
LOG(INFO) << "Delete messages with random_ids " << random_ids << " in " << secret_chat_id;
9489-
promise.set_value(Unit()); // TODO: set after event is saved
9488+
LOG(DEBUG) << "On delete messages in " << secret_chat_id << " with random_ids " << random_ids;
9489+
CHECK(secret_chat_id.is_valid());
9490+
94909491
DialogId dialog_id(secret_chat_id);
9491-
Dialog *d = get_dialog_force(dialog_id);
9492-
if (d == nullptr) {
9492+
if (!have_dialog_force(dialog_id)) {
94939493
LOG(ERROR) << "Ignore delete secret messages in unknown " << dialog_id;
9494+
promise.set_value(Unit());
94949495
return;
94959496
}
94969497

9498+
auto pending_secret_message = make_unique<PendingSecretMessage>();
9499+
pending_secret_message->success_promise = std::move(promise);
9500+
pending_secret_message->type = PendingSecretMessage::Type::DeleteMessages;
9501+
pending_secret_message->dialog_id = dialog_id;
9502+
pending_secret_message->random_ids = std::move(random_ids);
9503+
9504+
add_secret_message(std::move(pending_secret_message));
9505+
}
9506+
9507+
void MessagesManager::finish_delete_secret_messages(DialogId dialog_id, std::vector<int64> random_ids,
9508+
Promise<> promise) {
9509+
LOG(INFO) << "Delete messages with random_ids " << random_ids << " in " << dialog_id;
9510+
promise.set_value(Unit()); // TODO: set after event is saved
9511+
9512+
Dialog *d = get_dialog(dialog_id);
9513+
CHECK(d != nullptr);
94979514
vector<MessageId> to_delete_message_ids;
94989515
for (auto &random_id : random_ids) {
94999516
auto message_id = get_message_id_by_random_id(d, random_id, "delete_secret_messages");
@@ -9514,14 +9531,32 @@ void MessagesManager::delete_secret_messages(SecretChatId secret_chat_id, std::v
95149531

95159532
void MessagesManager::delete_secret_chat_history(SecretChatId secret_chat_id, MessageId last_message_id,
95169533
Promise<> promise) {
9517-
promise.set_value(Unit()); // TODO: set after event is saved
9518-
auto dialog_id = DialogId(secret_chat_id);
9519-
Dialog *d = get_dialog_force(dialog_id);
9520-
if (d == nullptr) {
9521-
LOG(ERROR) << "Ignore delete secret chat history in unknown " << dialog_id;
9534+
LOG(DEBUG) << "On delete history in " << secret_chat_id << " up to " << last_message_id;
9535+
CHECK(secret_chat_id.is_valid());
9536+
9537+
DialogId dialog_id(secret_chat_id);
9538+
if (!have_dialog_force(dialog_id)) {
9539+
LOG(ERROR) << "Ignore delete history in unknown " << dialog_id;
9540+
promise.set_value(Unit());
95229541
return;
95239542
}
95249543

9544+
auto pending_secret_message = make_unique<PendingSecretMessage>();
9545+
pending_secret_message->success_promise = std::move(promise);
9546+
pending_secret_message->type = PendingSecretMessage::Type::DeleteHistory;
9547+
pending_secret_message->dialog_id = dialog_id;
9548+
pending_secret_message->last_message_id = last_message_id;
9549+
9550+
add_secret_message(std::move(pending_secret_message));
9551+
}
9552+
9553+
void MessagesManager::finish_delete_secret_chat_history(DialogId dialog_id, MessageId last_message_id,
9554+
Promise<> promise) {
9555+
LOG(DEBUG) << "Delete history in " << dialog_id << " up to " << last_message_id;
9556+
promise.set_value(Unit()); // TODO: set after event is saved
9557+
Dialog *d = get_dialog(dialog_id);
9558+
CHECK(d != nullptr);
9559+
95259560
// TODO: probably last_message_id is not needed
95269561
delete_all_dialog_messages(d, false, true);
95279562
}
@@ -9775,6 +9810,16 @@ void MessagesManager::finish_add_secret_message(unique_ptr<PendingSecretMessage>
97759810
return;
97769811
}
97779812

9813+
if (pending_secret_message->type == PendingSecretMessage::Type::DeleteMessages) {
9814+
return finish_delete_secret_messages(pending_secret_message->dialog_id,
9815+
std::move(pending_secret_message->random_ids),
9816+
std::move(pending_secret_message->success_promise));
9817+
}
9818+
if (pending_secret_message->type == PendingSecretMessage::Type::DeleteHistory) {
9819+
return finish_delete_secret_chat_history(pending_secret_message->dialog_id, pending_secret_message->last_message_id,
9820+
std::move(pending_secret_message->success_promise));
9821+
}
9822+
97789823
auto d = get_dialog(pending_secret_message->message_info.dialog_id);
97799824
CHECK(d != nullptr);
97809825
auto random_id = pending_secret_message->message_info.random_id;

td/telegram/MessagesManager.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1244,8 +1244,18 @@ class MessagesManager : public Actor {
12441244
};
12451245

12461246
struct PendingSecretMessage {
1247+
enum class Type { NewMessage, DeleteMessages, DeleteHistory };
1248+
Type type = Type::NewMessage;
1249+
1250+
// for NewMessage
12471251
MessageInfo message_info;
12481252
MultiPromiseActor load_data_multipromise{"LoadPendingSecretMessageDataMultiPromiseActor"};
1253+
1254+
// for DeleteMessages/DeleteHistory
1255+
DialogId dialog_id;
1256+
vector<int64> random_ids;
1257+
MessageId last_message_id;
1258+
12491259
Promise<> success_promise;
12501260
};
12511261

@@ -1337,6 +1347,10 @@ class MessagesManager : public Actor {
13371347

13381348
void finish_add_secret_message(unique_ptr<PendingSecretMessage> pending_secret_message);
13391349

1350+
void finish_delete_secret_messages(DialogId dialog_id, std::vector<int64> random_ids, Promise<> promise);
1351+
1352+
void finish_delete_secret_chat_history(DialogId dialog_id, MessageId last_message_id, Promise<> promise);
1353+
13401354
void fix_message_info_dialog_id(MessageInfo &message_info) const;
13411355

13421356
MessageInfo parse_telegram_api_message(tl_object_ptr<telegram_api::Message> message_ptr, const char *source) const;

0 commit comments

Comments
 (0)