@@ -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
84708484void 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+
2542525477bool 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 }
0 commit comments