diff options
| author | levlam <levlam@telegram.org> | 2026-06-30 18:31:06 +0300 |
|---|---|---|
| committer | levlam <levlam@telegram.org> | 2026-06-30 18:31:06 +0300 |
| commit | 836e5cc75410bfbcbfe786bb0a22091a2aaebf32 (patch) | |
| tree | c012633991ade07dd036729850cf5778bb827aea | |
| parent | 54b8afa9b28591c63701045fc3ac1bbff10d4dc4 (diff) | |
Support sending replies to ephemeral messages.
| -rw-r--r-- | td/telegram/BusinessConnectionManager.cpp | 1 | ||||
| -rw-r--r-- | td/telegram/MessageInputReplyTo.cpp | 3 | ||||
| -rw-r--r-- | td/telegram/MessageInputReplyTo.h | 9 | ||||
| -rw-r--r-- | td/telegram/MessageInputReplyTo.hpp | 10 | ||||
| -rw-r--r-- | td/telegram/MessagesManager.cpp | 11 | ||||
| -rw-r--r-- | td/telegram/MessagesManager.h | 2 | ||||
| -rw-r--r-- | td/telegram/RepliedMessageInfo.cpp | 4 |
7 files changed, 30 insertions, 10 deletions
diff --git a/td/telegram/BusinessConnectionManager.cpp b/td/telegram/BusinessConnectionManager.cpp index 3cb82c309..d410090f8 100644 --- a/td/telegram/BusinessConnectionManager.cpp +++ b/td/telegram/BusinessConnectionManager.cpp @@ -1180,6 +1180,7 @@ MessageInputReplyTo BusinessConnectionManager::create_business_message_input_rep reply_to_message->poll_option_id_.clear(); } return MessageInputReplyTo{message_id, + {}, DialogId(), MessageQuote(td_, std::move(reply_to_message->quote_)), max(0, reply_to_message->checklist_task_id_), diff --git a/td/telegram/MessageInputReplyTo.cpp b/td/telegram/MessageInputReplyTo.cpp index ed2af677e..883edb128 100644 --- a/td/telegram/MessageInputReplyTo.cpp +++ b/td/telegram/MessageInputReplyTo.cpp @@ -111,6 +111,9 @@ telegram_api::object_ptr<telegram_api::InputReplyTo> MessageInputReplyTo::get_in story_full_id_.get_story_id().get()); } CHECK(!message_topic.is_saved_messages()); + if (ephemeral_message_id_ != 0) { + return telegram_api::make_object<telegram_api::inputReplyToEphemeralMessage>(ephemeral_message_id_); + } auto reply_to_message_id = message_id_; if (reply_to_message_id == MessageId()) { if (message_topic.is_monoforum()) { diff --git a/td/telegram/MessageInputReplyTo.h b/td/telegram/MessageInputReplyTo.h index d83b42511..14cf4b693 100644 --- a/td/telegram/MessageInputReplyTo.h +++ b/td/telegram/MessageInputReplyTo.h @@ -26,6 +26,7 @@ class Td; class MessageInputReplyTo { MessageId message_id_; + int32 ephemeral_message_id_ = 0; DialogId dialog_id_; MessageQuote quote_; int32 todo_item_id_ = 0; @@ -48,9 +49,10 @@ class MessageInputReplyTo { MessageInputReplyTo &operator=(MessageInputReplyTo &&) = default; ~MessageInputReplyTo(); - MessageInputReplyTo(MessageId message_id, DialogId dialog_id, MessageQuote quote, int32 todo_item_id, - const string &poll_option_id, const char *debug_source) + MessageInputReplyTo(MessageId message_id, int32 ephemeral_message_id, DialogId dialog_id, MessageQuote quote, + int32 todo_item_id, const string &poll_option_id, const char *debug_source) : message_id_(message_id) + , ephemeral_message_id_(ephemeral_message_id) , dialog_id_(dialog_id) , quote_(std::move(quote)) , todo_item_id_(todo_item_id) @@ -98,7 +100,8 @@ class MessageInputReplyTo { if (story_full_id_.is_valid()) { return MessageInputReplyTo(story_full_id_); } - return MessageInputReplyTo(message_id_, dialog_id_, quote_.clone(), todo_item_id_, poll_option_id_, debug_source_); + return MessageInputReplyTo(message_id_, ephemeral_message_id_, dialog_id_, quote_.clone(), todo_item_id_, + poll_option_id_, debug_source_); } void add_dependencies(Dependencies &dependencies) const; diff --git a/td/telegram/MessageInputReplyTo.hpp b/td/telegram/MessageInputReplyTo.hpp index e80570736..5bd66ae51 100644 --- a/td/telegram/MessageInputReplyTo.hpp +++ b/td/telegram/MessageInputReplyTo.hpp @@ -24,6 +24,7 @@ void MessageInputReplyTo::store(StorerT &storer) const { bool has_quote = !quote_.is_empty(); bool has_todo_item_id = todo_item_id_ != 0; bool has_poll_option_id = !poll_option_id_.empty(); + bool has_ephemeral_message_id = ephemeral_message_id_ != 0; BEGIN_STORE_FLAGS(); STORE_FLAG(has_message_id); STORE_FLAG(has_story_full_id); @@ -33,6 +34,7 @@ void MessageInputReplyTo::store(StorerT &storer) const { STORE_FLAG(has_quote); STORE_FLAG(has_todo_item_id); STORE_FLAG(has_poll_option_id); + STORE_FLAG(has_ephemeral_message_id); END_STORE_FLAGS(); if (has_message_id) { td::store(message_id_, storer); @@ -52,6 +54,9 @@ void MessageInputReplyTo::store(StorerT &storer) const { if (has_poll_option_id) { td::store(poll_option_id_, storer); } + if (has_ephemeral_message_id) { + td::store(ephemeral_message_id_, storer); + } } template <class ParserT> @@ -64,6 +69,7 @@ void MessageInputReplyTo::parse(ParserT &parser) { bool has_quote; bool has_todo_item_id; bool has_poll_option_id; + bool has_ephemeral_message_id; BEGIN_PARSE_FLAGS(); PARSE_FLAG(has_message_id); PARSE_FLAG(has_story_full_id); @@ -73,6 +79,7 @@ void MessageInputReplyTo::parse(ParserT &parser) { PARSE_FLAG(has_quote); PARSE_FLAG(has_todo_item_id); PARSE_FLAG(has_poll_option_id); + PARSE_FLAG(has_ephemeral_message_id); END_PARSE_FLAGS(); if (has_message_id) { td::parse(message_id_, parser); @@ -103,6 +110,9 @@ void MessageInputReplyTo::parse(ParserT &parser) { if (has_poll_option_id) { td::parse(poll_option_id_, parser); } + if (has_ephemeral_message_id) { + td::parse(ephemeral_message_id_, parser); + } } } // namespace td diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 79ab4ab3c..c2166d893 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -20899,7 +20899,7 @@ MessageId MessagesManager::get_persistent_message_id(const Dialog *d, MessageId MessageInputReplyTo MessagesManager::create_message_input_reply_to( Dialog *d, const MessageTopic &message_topic, td_api::object_ptr<td_api::InputMessageReplyTo> &&reply_to, - bool for_draft) { + bool for_draft, bool for_ephemeral_message) { CHECK(d != nullptr); auto implicit_reply_to_message_id = message_topic.get_implicit_reply_to_message_id(td_); if (implicit_reply_to_message_id.is_valid() && @@ -20915,7 +20915,7 @@ MessageInputReplyTo MessagesManager::create_message_input_reply_to( } switch (reply_to->get_id()) { case td_api::inputMessageReplyToStory::ID: { - if (for_draft) { + if (for_draft || for_ephemeral_message) { return {}; } auto reply_to_story = td_api::move_object_as<td_api::inputMessageReplyToStory>(reply_to); @@ -20950,7 +20950,7 @@ MessageInputReplyTo MessagesManager::create_message_input_reply_to( reply_to_message->poll_option_id_.clear(); } const Message *m = get_message_force(d, message_id, "create_message_input_reply_to 2"); - if (!can_reply_to_message(d, message_id, m)) { + if (!can_reply_to_message(d, message_id, m) || (!for_ephemeral_message && is_ephemeral_message(m))) { message_id = {}; m = nullptr; } @@ -20961,6 +20961,7 @@ MessageInputReplyTo MessagesManager::create_message_input_reply_to( message_id <= d->notification_info->max_push_notification_message_id_)) { // allow to reply to yet unreceived server message in the same chat return MessageInputReplyTo{message_id, + {}, DialogId(), MessageQuote{td_, std::move(reply_to_message->quote_)}, checklist_task_id, @@ -21004,6 +21005,7 @@ MessageInputReplyTo MessagesManager::create_message_input_reply_to( reply_to_message->poll_option_id_.clear(); } return MessageInputReplyTo{m->message_id, + m->ephemeral_message_id, DialogId(), MessageQuote{td_, std::move(reply_to_message->quote_)}, checklist_task_id, @@ -21012,7 +21014,7 @@ MessageInputReplyTo MessagesManager::create_message_input_reply_to( } case td_api::inputMessageReplyToExternalMessage::ID: { auto reply_to_message = td_api::move_object_as<td_api::inputMessageReplyToExternalMessage>(reply_to); - if (d->dialog_id.get_type() == DialogType::SecretChat) { + if (d->dialog_id.get_type() == DialogType::SecretChat || for_ephemeral_message) { return {}; } auto reply_dialog_id = DialogId(reply_to_message->chat_id_); @@ -21036,6 +21038,7 @@ MessageInputReplyTo MessagesManager::create_message_input_reply_to( reply_to_message->poll_option_id_.clear(); } return MessageInputReplyTo{m->message_id, + {}, reply_dialog_id, MessageQuote{td_, std::move(reply_to_message->quote_)}, checklist_task_id, diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index a437c875c..3d5f524a3 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -1786,7 +1786,7 @@ class MessagesManager final : public Actor { MessageInputReplyTo create_message_input_reply_to(Dialog *d, const MessageTopic &message_topic, td_api::object_ptr<td_api::InputMessageReplyTo> &&reply_to, - bool for_draft); + bool for_draft, bool for_ephemeral_message = false); static const MessageInputReplyTo *get_message_input_reply_to(const Message *m); diff --git a/td/telegram/RepliedMessageInfo.cpp b/td/telegram/RepliedMessageInfo.cpp index c084673b5..22381b151 100644 --- a/td/telegram/RepliedMessageInfo.cpp +++ b/td/telegram/RepliedMessageInfo.cpp @@ -372,8 +372,8 @@ td_api::object_ptr<td_api::messageReplyToMessage> RepliedMessageInfo::get_messag MessageInputReplyTo RepliedMessageInfo::get_message_input_reply_to() const { CHECK(!is_external()); if (message_id_.is_valid() || message_id_.is_valid_scheduled()) { - return MessageInputReplyTo(message_id_, dialog_id_, quote_.clone(true), todo_item_id_, poll_option_id_, - "RepliedMessageInfo"); + return MessageInputReplyTo{message_id_, {}, dialog_id_, quote_.clone(true), todo_item_id_, poll_option_id_, + "RepliedMessageInfo"}; } return {}; } |
