aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--td/telegram/CallbackQueriesManager.cpp56
-rw-r--r--td/telegram/MessagesManager.cpp5
-rw-r--r--td/telegram/MessagesManager.h2
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);