diff options
| author | levlam <levlam@telegram.org> | 2026-07-01 18:35:31 +0300 |
|---|---|---|
| committer | levlam <levlam@telegram.org> | 2026-07-01 18:35:31 +0300 |
| commit | 906e43d6512a0ca0e9f0b570cbe75fe9159d5593 (patch) | |
| tree | 0e9b43ec9f185a1b8423c44607aeaee880fb293c | |
| parent | a2fbcb0f391e1f9548395e635fbfe2ccb9ac3192 (diff) | |
Support callback queries from ephemeral messages.
| -rw-r--r-- | td/telegram/CallbackQueriesManager.cpp | 56 | ||||
| -rw-r--r-- | td/telegram/MessagesManager.cpp | 5 | ||||
| -rw-r--r-- | td/telegram/MessagesManager.h | 2 |
3 files changed, 61 insertions, 2 deletions
diff --git a/td/telegram/CallbackQueriesManager.cpp b/td/telegram/CallbackQueriesManager.cpp index 643b1989d..df8d0e271 100644 --- a/td/telegram/CallbackQueriesManager.cpp +++ b/td/telegram/CallbackQueriesManager.cpp @@ -98,6 +98,48 @@ class GetBotCallbackAnswerQuery final : public Td::ResultHandler { } }; +class GetEphemeralCallbackAnswerQuery final : public Td::ResultHandler { + Promise<td_api::object_ptr<td_api::callbackQueryAnswer>> promise_; + DialogId dialog_id_; + + public: + explicit GetEphemeralCallbackAnswerQuery(Promise<td_api::object_ptr<td_api::callbackQueryAnswer>> &&promise) + : promise_(std::move(promise)) { + } + + void send(DialogId dialog_id, EphemeralMessageId ephemeral_message_id, const string &data) { + dialog_id_ = dialog_id; + + auto input_peer = td_->dialog_manager_->get_input_peer(dialog_id, AccessRights::Read); + CHECK(input_peer != nullptr); + + int32 flags = telegram_api::ephemeral_getCallbackAnswer::DATA_MASK; + auto net_query = G()->net_query_creator().create(telegram_api::ephemeral_getCallbackAnswer( + flags, std::move(input_peer), ephemeral_message_id.get(), BufferSlice(data))); + net_query->need_resend_on_503_ = false; + send_query(std::move(net_query)); + } + + void on_result(BufferSlice packet) final { + auto result_ptr = fetch_result<telegram_api::ephemeral_getCallbackAnswer>(packet); + if (result_ptr.is_error()) { + return on_error(result_ptr.move_as_error()); + } + + auto answer = result_ptr.move_as_ok(); + promise_.set_value( + td_api::make_object<td_api::callbackQueryAnswer>(answer->message_, answer->alert_, answer->url_)); + } + + void on_error(Status status) final { + td_->dialog_manager_->on_get_dialog_error(dialog_id_, status, "GetEphemeralCallbackAnswerQuery"); + if (status.message() == "BOT_RESPONSE_TIMEOUT") { + status = Status::Error(502, "The bot is not responding"); + } + promise_.set_error(std::move(status)); + } +}; + class SetBotCallbackAnswerQuery final : public Td::ResultHandler { Promise<Unit> promise_; @@ -271,10 +313,20 @@ void CallbackQueriesManager::send_callback_query(MessageFullId message_full_id, if (!td_->messages_manager_->have_message_force(message_full_id, "send_callback_query")) { return promise.set_error(400, "Message not found"); } - if (message_full_id.get_message_id().is_valid_scheduled()) { + auto message_id = message_full_id.get_message_id(); + if (message_id.is_valid_scheduled()) { return promise.set_error(400, "Can't send callback queries from scheduled messages"); } - if (!message_full_id.get_message_id().is_server()) { + if (!message_id.is_server()) { + if (payload->get_id() == td_api::callbackQueryPayloadData::ID) { + auto ephemeral_message_id = td_->messages_manager_->get_ephemeral_message_id_of_message_id(message_full_id); + if (ephemeral_message_id.is_valid()) { + td_->create_handler<GetEphemeralCallbackAnswerQuery>(std::move(promise)) + ->send(dialog_id, ephemeral_message_id, + static_cast<td_api::callbackQueryPayloadData *>(payload.get())->data_); + return; + } + } return promise.set_error(400, "Wrong message identifier"); } diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 61f19a3e3..a326c73c0 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -4283,6 +4283,11 @@ MessageId MessagesManager::get_message_id_of_ephemeral_message_id(DialogId dialo return it->second; } +EphemeralMessageId MessagesManager::get_ephemeral_message_id_of_message_id(MessageFullId message_full_id) { + const auto *m = get_message_force(message_full_id, "get_ephemeral_message_id_of_message_id"); + return m == nullptr ? EphemeralMessageId() : m->ephemeral_message_id; +} + void MessagesManager::on_new_ephemeral_message(telegram_api::object_ptr<telegram_api::ephemeralMessage> &&message) { auto message_info = parse_ephemeral_message(td_, std::move(message), "on_new_ephemeral_message"); auto dialog_id = message_info.dialog_id; diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index d107d7ed4..70d9ed8c4 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -319,6 +319,8 @@ class MessagesManager final : public Actor { MessageId get_message_id_of_ephemeral_message_id(DialogId dialog_id, EphemeralMessageId ephemeral_message_id); + EphemeralMessageId get_ephemeral_message_id_of_message_id(MessageFullId message_full_id); + void on_new_ephemeral_message(telegram_api::object_ptr<telegram_api::ephemeralMessage> &&message); void on_edited_ephemeral_message(telegram_api::object_ptr<telegram_api::ephemeralMessage> &&message); |
