Skip to content

Commit a041566

Browse files
committed
Improve processing of sent ephemeral messages.
1 parent e3e3140 commit a041566

2 files changed

Lines changed: 70 additions & 13 deletions

File tree

td/telegram/MessagesManager.cpp

Lines changed: 64 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1526,6 +1526,7 @@ class SendMediaQuery final : public Td::ResultHandler {
15261526
vector<string> file_references_;
15271527
bool was_uploaded_ = false;
15281528
bool was_thumbnail_uploaded_ = false;
1529+
bool is_ephemeral_ = false;
15291530

15301531
public:
15311532
void send(vector<FileUploadId> file_upload_ids, vector<FileUploadId> thumbnail_file_upload_ids,
@@ -1553,6 +1554,7 @@ class SendMediaQuery final : public Td::ResultHandler {
15531554

15541555
auto reply_to = input_reply_to.get_input_reply_to(td_, message_topic, false, dialog_id, flags);
15551556
if (receiver_user_id != UserId()) {
1557+
is_ephemeral_ = true;
15561558
auto r_input_user = td_->user_manager_->get_input_user(receiver_user_id);
15571559
if (r_input_user.is_error()) {
15581560
return on_error(r_input_user.move_as_error());
@@ -1654,14 +1656,26 @@ class SendMediaQuery final : public Td::ResultHandler {
16541656
void on_result(BufferSlice packet) final {
16551657
static_assert(std::is_same<telegram_api::messages_sendMessage::ReturnType,
16561658
telegram_api::messages_sendMedia::ReturnType>::value);
1659+
static_assert(std::is_same<telegram_api::ephemeral_sendMessage::ReturnType,
1660+
telegram_api::messages_sendMedia::ReturnType>::value);
16571661
auto result_ptr = fetch_result<telegram_api::messages_sendMedia>(packet);
16581662
if (result_ptr.is_error()) {
16591663
return on_error(result_ptr.move_as_error());
16601664
}
16611665

16621666
auto ptr = result_ptr.move_as_ok();
16631667
LOG(INFO) << "Receive result for SendMediaQuery for " << random_id_ << ": " << to_string(ptr);
1664-
td_->messages_manager_->check_send_message_result(random_id_, dialog_id_, ptr.get(), "SendMedia");
1668+
if (!is_ephemeral_) {
1669+
td_->messages_manager_->check_send_message_result(random_id_, dialog_id_, ptr.get(), "SendMedia");
1670+
} else {
1671+
auto sent_messages = UpdatesManager::get_new_ephemeral_messages(ptr.get());
1672+
if (sent_messages.size() != 1u || DialogId(sent_messages[0]->peer_id_) != dialog_id_) {
1673+
LOG(ERROR) << "Receive wrong result for sending ephemeral message with random_id " << random_id_ << " to "
1674+
<< dialog_id_ << ": " << oneline(to_string(ptr));
1675+
} else {
1676+
td_->messages_manager_->on_update_ephemeral_message_id(random_id_, EphemeralMessageId(sent_messages[0]->id_));
1677+
}
1678+
}
16651679
td_->updates_manager_->on_get_updates(std::move(ptr), Promise<Unit>());
16661680

16671681
if (was_thumbnail_uploaded_) {
@@ -8468,7 +8482,11 @@ void MessagesManager::delete_messages(DialogId dialog_id, const vector<MessageId
84688482
}
84698483

84708484
void MessagesManager::delete_sent_message_on_server(DialogId dialog_id, MessageId message_id,
8471-
MessageId old_message_id) {
8485+
EphemeralMessageId ephemeral_message_id, MessageId old_message_id) {
8486+
if (ephemeral_message_id.is_valid()) {
8487+
// TODO
8488+
return;
8489+
}
84728490
// this would be a no-op, because replies have already been removed in cancel_send_message_query
84738491
// update_reply_to_message_id(dialog_id, old_message_id, message_id, false, "delete_sent_message_on_server");
84748492

@@ -11785,12 +11803,14 @@ MessageFullId MessagesManager::on_get_message(MessageInfo &&message_info, const
1178511803

1178611804
Dialog *d = get_dialog_force(dialog_id, source);
1178711805

11788-
MessageId old_message_id = update_message_ids_.get(dialog_id, message_id);
11806+
auto is_ephemeral = new_message->ephemeral_message_id.is_valid();
11807+
MessageId old_message_id = is_ephemeral ? update_ephemeral_message_ids_[dialog_id][new_message->ephemeral_message_id]
11808+
: update_message_ids_.get(dialog_id, message_id);
1178911809
bool is_sent_message = false;
1179011810
if (old_message_id.is_valid() || old_message_id.is_valid_scheduled()) {
1179111811
CHECK(d != nullptr);
1179211812

11793-
if (!from_update && !message_id.is_scheduled()) {
11813+
if (!from_update && message_id.is_server()) {
1179411814
if (message_id <= d->last_new_message_id || td_->auth_manager_->is_bot()) {
1179511815
if (get_message_force(d, message_id, "receive missed unsent message not from update") != nullptr) {
1179611816
LOG(ERROR) << "New " << old_message_id << "/" << message_id << " in " << dialog_id << " from " << source
@@ -11813,12 +11833,22 @@ MessageFullId MessagesManager::on_get_message(MessageInfo &&message_info, const
1181311833
}
1181411834
}
1181511835

11816-
auto erased_count = update_message_ids_.erase(dialog_id, message_id);
11817-
CHECK(erased_count > 0);
11836+
if (is_ephemeral) {
11837+
auto it = update_ephemeral_message_ids_.find(dialog_id);
11838+
CHECK(it != update_ephemeral_message_ids_.end());
11839+
auto erased_count = it->second.erase(new_message->ephemeral_message_id);
11840+
CHECK(erased_count > 0);
11841+
if (it->second.empty()) {
11842+
update_ephemeral_message_ids_.erase(it);
11843+
}
11844+
} else {
11845+
auto erased_count = update_message_ids_.erase(dialog_id, message_id);
11846+
CHECK(erased_count > 0);
11847+
}
1181811848

1181911849
if (!new_message->is_outgoing && dialog_id != td_->dialog_manager_->get_my_dialog_id()) {
1182011850
// sent message is not from me
11821-
LOG(ERROR) << "Sent in " << dialog_id << " " << message_id << " is sent by "
11851+
LOG(ERROR) << "Sent in " << dialog_id << ' ' << message_id << " is sent by "
1182211852
<< get_message_sender(new_message.get());
1182311853
return MessageFullId();
1182411854
}
@@ -11829,7 +11859,7 @@ MessageFullId MessagesManager::on_get_message(MessageInfo &&message_info, const
1182911859
being_readded_message_full_id_ = {dialog_id, old_message_id};
1183011860
auto old_message = delete_message(d, old_message_id, false, &need_update_dialog_pos, "add sent message");
1183111861
if (old_message == nullptr) {
11832-
delete_sent_message_on_server(dialog_id, message_id, old_message_id);
11862+
delete_sent_message_on_server(dialog_id, message_id, new_message->ephemeral_message_id, old_message_id);
1183311863
being_readded_message_full_id_ = MessageFullId();
1183411864
return MessageFullId();
1183511865
}
@@ -11850,7 +11880,7 @@ MessageFullId MessagesManager::on_get_message(MessageInfo &&message_info, const
1185011880
new_message->message_id = message_id;
1185111881
send_update_message_send_succeeded(d, old_message_id, new_message.get(), &need_update_dialog_pos);
1185211882

11853-
if (!message_id.is_scheduled()) {
11883+
if (message_id.is_server()) {
1185411884
is_sent_message = true;
1185511885
}
1185611886
}
@@ -11879,7 +11909,7 @@ MessageFullId MessagesManager::on_get_message(MessageInfo &&message_info, const
1187911909
if (need_update) {
1188011910
send_update_new_message(d, m);
1188111911
}
11882-
if (!td_->auth_manager_->is_bot() && !message_id.is_scheduled()) {
11912+
if (!td_->auth_manager_->is_bot() && message_id.is_server()) {
1188311913
auto it = awaited_message_full_ids_.find({dialog_id, message_id});
1188411914
if (it != awaited_message_full_ids_.end()) {
1188511915
auto promises = std::move(it->second);
@@ -25412,7 +25442,7 @@ bool MessagesManager::on_update_message_id(int64 random_id, MessageId new_messag
2541225442
being_sent_messages_.erase(it);
2541325443

2541425444
if (!have_message_force({dialog_id, old_message_id}, "on_update_message_id")) {
25415-
delete_sent_message_on_server(dialog_id, new_message_id, old_message_id);
25445+
delete_sent_message_on_server(dialog_id, new_message_id, {}, old_message_id);
2541625446
return true;
2541725447
}
2541825448

@@ -25422,6 +25452,28 @@ bool MessagesManager::on_update_message_id(int64 random_id, MessageId new_messag
2542225452
return true;
2542325453
}
2542425454

25455+
void MessagesManager::on_update_ephemeral_message_id(int64 random_id, EphemeralMessageId ephemeral_message_id) {
25456+
if (!ephemeral_message_id.is_valid()) {
25457+
LOG(ERROR) << "Receive " << ephemeral_message_id << " with random_id " << random_id;
25458+
return;
25459+
}
25460+
25461+
auto it = being_sent_messages_.find(random_id);
25462+
CHECK(it != being_sent_messages_.end());
25463+
auto dialog_id = it->second.get_dialog_id();
25464+
auto old_message_id = it->second.get_message_id();
25465+
being_sent_messages_.erase(it);
25466+
25467+
if (!have_message_force({dialog_id, old_message_id}, "on_update_ephemeral_message_id")) {
25468+
delete_sent_message_on_server(dialog_id, {}, ephemeral_message_id, old_message_id);
25469+
return;
25470+
}
25471+
25472+
LOG(INFO) << "Save correspondence from " << ephemeral_message_id << " in " << dialog_id << " to " << old_message_id;
25473+
CHECK(old_message_id.is_yet_unsent());
25474+
update_ephemeral_message_ids_[dialog_id][ephemeral_message_id] = old_message_id;
25475+
}
25476+
2542525477
bool MessagesManager::on_get_message_error(DialogId dialog_id, MessageId message_id, const Status &status,
2542625478
const char *source) {
2542725479
if (status.message() == "MSG_ID_INVALID" || status.message() == "MESSAGE_ID_INVALID" ||
@@ -27607,7 +27659,7 @@ MessageFullId MessagesManager::on_send_message_success(int64 random_id, MessageI
2760727659
being_readded_message_full_id_ = {dialog_id, old_message_id};
2760827660
auto sent_message = delete_message(d, old_message_id, false, &need_update_dialog_pos, source);
2760927661
if (sent_message == nullptr) {
27610-
delete_sent_message_on_server(dialog_id, new_message_id, old_message_id);
27662+
delete_sent_message_on_server(dialog_id, new_message_id, {}, old_message_id);
2761127663
being_readded_message_full_id_ = MessageFullId();
2761227664
return {};
2761327665
}

td/telegram/MessagesManager.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,8 @@ class MessagesManager final : public Actor {
264264

265265
bool on_update_message_id(int64 random_id, MessageId new_message_id, const char *source);
266266

267+
void on_update_ephemeral_message_id(int64 random_id, EphemeralMessageId ephemeral_message_id);
268+
267269
void on_update_dialog_draft_message(DialogId dialog_id, MessageId top_thread_message_id,
268270
telegram_api::object_ptr<telegram_api::DraftMessage> &&draft_message,
269271
int32 try_count = 0);
@@ -2051,7 +2053,8 @@ class MessagesManager final : public Actor {
20512053

20522054
void delete_all_dialog_messages(Dialog *d, bool remove_from_dialog_list, bool is_permanently_deleted);
20532055

2054-
void delete_sent_message_on_server(DialogId dialog_id, MessageId message_id, MessageId old_message_id);
2056+
void delete_sent_message_on_server(DialogId dialog_id, MessageId message_id, EphemeralMessageId ephemeral_message_id,
2057+
MessageId old_message_id);
20552058

20562059
static vector<MessageId> find_dialog_messages(const Dialog *d, const std::function<bool(const Message *)> &condition);
20572060

@@ -3263,6 +3266,8 @@ class MessagesManager final : public Actor {
32633266
FlatHashMap<int64, MessageFullId> being_sent_messages_; // message_random_id -> message
32643267

32653268
MessageHashMap<MessageId> update_message_ids_; // new_message_id -> temporary_id
3269+
FlatHashMap<DialogId, FlatHashMap<EphemeralMessageId, MessageId, EphemeralMessageIdHash>, DialogIdHash>
3270+
update_ephemeral_message_ids_;
32663271

32673272
FlatHashMap<MessageFullId, MessageId, MessageFullIdHash> messages_to_restore_; // new_message_id -> temporary_id
32683273

0 commit comments

Comments
 (0)