aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorlevlam <levlam@telegram.org>2026-06-30 18:31:06 +0300
committerlevlam <levlam@telegram.org>2026-06-30 18:31:06 +0300
commit836e5cc75410bfbcbfe786bb0a22091a2aaebf32 (patch)
treec012633991ade07dd036729850cf5778bb827aea
parent54b8afa9b28591c63701045fc3ac1bbff10d4dc4 (diff)
Support sending replies to ephemeral messages.
-rw-r--r--td/telegram/BusinessConnectionManager.cpp1
-rw-r--r--td/telegram/MessageInputReplyTo.cpp3
-rw-r--r--td/telegram/MessageInputReplyTo.h9
-rw-r--r--td/telegram/MessageInputReplyTo.hpp10
-rw-r--r--td/telegram/MessagesManager.cpp11
-rw-r--r--td/telegram/MessagesManager.h2
-rw-r--r--td/telegram/RepliedMessageInfo.cpp4
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 {};
}