Use request promise in td_api::getCallbackQueryAnswer implementation.
This commit is contained in:
parent
a04423ad66
commit
36cbba4d2c
@ -28,18 +28,17 @@
|
||||
namespace td {
|
||||
|
||||
class GetBotCallbackAnswerQuery final : public Td::ResultHandler {
|
||||
Promise<Unit> promise_;
|
||||
int64 result_id_;
|
||||
Promise<td_api::object_ptr<td_api::callbackQueryAnswer>> promise_;
|
||||
DialogId dialog_id_;
|
||||
MessageId message_id_;
|
||||
|
||||
public:
|
||||
explicit GetBotCallbackAnswerQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) {
|
||||
explicit GetBotCallbackAnswerQuery(Promise<td_api::object_ptr<td_api::callbackQueryAnswer>> &&promise)
|
||||
: promise_(std::move(promise)) {
|
||||
}
|
||||
|
||||
void send(DialogId dialog_id, MessageId message_id, const tl_object_ptr<td_api::CallbackQueryPayload> &payload,
|
||||
tl_object_ptr<telegram_api::InputCheckPasswordSRP> &&password, int64 result_id) {
|
||||
result_id_ = result_id;
|
||||
tl_object_ptr<telegram_api::InputCheckPasswordSRP> &&password) {
|
||||
dialog_id_ = dialog_id;
|
||||
message_id_ = message_id;
|
||||
|
||||
@ -80,8 +79,7 @@ class GetBotCallbackAnswerQuery final : public Td::ResultHandler {
|
||||
return on_error(id, result_ptr.move_as_error());
|
||||
}
|
||||
|
||||
td->callback_queries_manager_->on_get_callback_query_answer(result_id_, result_ptr.move_as_ok());
|
||||
promise_.set_value(Unit());
|
||||
td->callback_queries_manager_->on_get_callback_query_answer(result_ptr.move_as_ok(), std::move(promise_));
|
||||
}
|
||||
|
||||
void on_error(uint64 id, Status status) final {
|
||||
@ -90,8 +88,11 @@ class GetBotCallbackAnswerQuery final : public Td::ResultHandler {
|
||||
} else if (status.message() == "BOT_RESPONSE_TIMEOUT") {
|
||||
status = Status::Error(502, "The bot is not responding");
|
||||
}
|
||||
if (status.code() == 502 && td->messages_manager_->is_message_edited_recently({dialog_id_, message_id_}, 31)) {
|
||||
return promise_.set_value(td_api::make_object<td_api::callbackQueryAnswer>());
|
||||
}
|
||||
|
||||
td->messages_manager_->on_get_dialog_error(dialog_id_, status, "GetBotCallbackAnswerQuery");
|
||||
td->callback_queries_manager_->on_get_callback_query_answer(result_id_, nullptr);
|
||||
promise_.set_error(std::move(status));
|
||||
}
|
||||
};
|
||||
@ -226,71 +227,57 @@ void CallbackQueriesManager::on_new_inline_query(
|
||||
std::move(payload)));
|
||||
}
|
||||
|
||||
int64 CallbackQueriesManager::send_callback_query(FullMessageId full_message_id,
|
||||
tl_object_ptr<td_api::CallbackQueryPayload> &&payload,
|
||||
Promise<Unit> &&promise) {
|
||||
void CallbackQueriesManager::send_callback_query(FullMessageId full_message_id,
|
||||
tl_object_ptr<td_api::CallbackQueryPayload> &&payload,
|
||||
Promise<td_api::object_ptr<td_api::callbackQueryAnswer>> &&promise) {
|
||||
if (td_->auth_manager_->is_bot()) {
|
||||
promise.set_error(Status::Error(400, "Bot can't send callback queries to other bot"));
|
||||
return 0;
|
||||
return promise.set_error(Status::Error(400, "Bot can't send callback queries to other bot"));
|
||||
}
|
||||
|
||||
if (payload == nullptr) {
|
||||
promise.set_error(Status::Error(400, "Payload must be non-empty"));
|
||||
return 0;
|
||||
return promise.set_error(Status::Error(400, "Payload must be non-empty"));
|
||||
}
|
||||
|
||||
auto dialog_id = full_message_id.get_dialog_id();
|
||||
td_->messages_manager_->have_dialog_force(dialog_id, "send_callback_query");
|
||||
if (!td_->messages_manager_->have_input_peer(dialog_id, AccessRights::Read)) {
|
||||
promise.set_error(Status::Error(400, "Can't access the chat"));
|
||||
return 0;
|
||||
return promise.set_error(Status::Error(400, "Can't access the chat"));
|
||||
}
|
||||
|
||||
if (!td_->messages_manager_->have_message_force(full_message_id, "send_callback_query")) {
|
||||
promise.set_error(Status::Error(400, "Message not found"));
|
||||
return 0;
|
||||
return promise.set_error(Status::Error(400, "Message not found"));
|
||||
}
|
||||
if (full_message_id.get_message_id().is_valid_scheduled()) {
|
||||
promise.set_error(Status::Error(400, "Can't send callback queries from scheduled messages"));
|
||||
return 0;
|
||||
return promise.set_error(Status::Error(400, "Can't send callback queries from scheduled messages"));
|
||||
}
|
||||
if (!full_message_id.get_message_id().is_server()) {
|
||||
promise.set_error(Status::Error(400, "Bad message identifier"));
|
||||
return 0;
|
||||
return promise.set_error(Status::Error(400, "Bad message identifier"));
|
||||
}
|
||||
|
||||
int64 result_id;
|
||||
do {
|
||||
result_id = Random::secure_int64();
|
||||
} while (callback_query_answers_.find(result_id) != callback_query_answers_.end());
|
||||
callback_query_answers_[result_id]; // reserve place for result
|
||||
|
||||
if (payload->get_id() == td_api::callbackQueryPayloadDataWithPassword::ID) {
|
||||
auto password = static_cast<const td_api::callbackQueryPayloadDataWithPassword *>(payload.get())->password_;
|
||||
send_closure(td_->password_manager_, &PasswordManager::get_input_check_password_srp, std::move(password),
|
||||
PromiseCreator::lambda(
|
||||
[this, full_message_id, payload = std::move(payload), result_id, promise = std::move(promise)](
|
||||
Result<tl_object_ptr<telegram_api::InputCheckPasswordSRP>> result) mutable {
|
||||
if (result.is_error()) {
|
||||
return promise.set_error(result.move_as_error());
|
||||
}
|
||||
if (G()->close_flag()) {
|
||||
return promise.set_error(Status::Error(500, "Request aborted"));
|
||||
}
|
||||
|
||||
send_get_callback_answer_query(full_message_id, std::move(payload), result.move_as_ok(),
|
||||
result_id, std::move(promise));
|
||||
}));
|
||||
send_closure(
|
||||
td_->password_manager_, &PasswordManager::get_input_check_password_srp, std::move(password),
|
||||
PromiseCreator::lambda([this, full_message_id, payload = std::move(payload), promise = std::move(promise)](
|
||||
Result<tl_object_ptr<telegram_api::InputCheckPasswordSRP>> result) mutable {
|
||||
if (result.is_error()) {
|
||||
return promise.set_error(result.move_as_error());
|
||||
}
|
||||
send_get_callback_answer_query(full_message_id, std::move(payload), result.move_as_ok(), std::move(promise));
|
||||
}));
|
||||
} else {
|
||||
send_get_callback_answer_query(full_message_id, std::move(payload), nullptr, result_id, std::move(promise));
|
||||
send_get_callback_answer_query(full_message_id, std::move(payload), nullptr, std::move(promise));
|
||||
}
|
||||
|
||||
return result_id;
|
||||
}
|
||||
|
||||
void CallbackQueriesManager::send_get_callback_answer_query(
|
||||
FullMessageId full_message_id, tl_object_ptr<td_api::CallbackQueryPayload> &&payload,
|
||||
tl_object_ptr<telegram_api::InputCheckPasswordSRP> &&password, int64 result_id, Promise<Unit> &&promise) {
|
||||
tl_object_ptr<telegram_api::InputCheckPasswordSRP> &&password,
|
||||
Promise<td_api::object_ptr<td_api::callbackQueryAnswer>> &&promise) {
|
||||
if (G()->close_flag()) {
|
||||
return promise.set_error(Status::Error(500, "Request aborted"));
|
||||
}
|
||||
|
||||
auto dialog_id = full_message_id.get_dialog_id();
|
||||
if (!td_->messages_manager_->have_input_peer(dialog_id, AccessRights::Read)) {
|
||||
return promise.set_error(Status::Error(400, "Can't access the chat"));
|
||||
@ -300,33 +287,15 @@ void CallbackQueriesManager::send_get_callback_answer_query(
|
||||
}
|
||||
|
||||
td_->create_handler<GetBotCallbackAnswerQuery>(std::move(promise))
|
||||
->send(dialog_id, full_message_id.get_message_id(), payload, std::move(password), result_id);
|
||||
->send(dialog_id, full_message_id.get_message_id(), payload, std::move(password));
|
||||
}
|
||||
|
||||
void CallbackQueriesManager::on_get_callback_query_answer(
|
||||
int64 result_id, tl_object_ptr<telegram_api::messages_botCallbackAnswer> &&answer) {
|
||||
LOG(INFO) << "Receive answer for callback query " << result_id;
|
||||
auto it = callback_query_answers_.find(result_id);
|
||||
CHECK(it != callback_query_answers_.end());
|
||||
CHECK(it->second.text.empty());
|
||||
if (answer == nullptr) {
|
||||
callback_query_answers_.erase(it);
|
||||
return;
|
||||
}
|
||||
|
||||
LOG(INFO) << to_string(answer);
|
||||
it->second = CallbackQueryAnswer{(answer->flags_ & BOT_CALLBACK_ANSWER_FLAG_NEED_SHOW_ALERT) != 0, answer->message_,
|
||||
answer->url_};
|
||||
}
|
||||
|
||||
tl_object_ptr<td_api::callbackQueryAnswer> CallbackQueriesManager::get_callback_query_answer_object(int64 result_id) {
|
||||
auto it = callback_query_answers_.find(result_id);
|
||||
CHECK(it != callback_query_answers_.end());
|
||||
bool show_alert = it->second.show_alert;
|
||||
auto text = std::move(it->second.text);
|
||||
auto url = std::move(it->second.url);
|
||||
callback_query_answers_.erase(it);
|
||||
return make_tl_object<td_api::callbackQueryAnswer>(text, show_alert, url);
|
||||
tl_object_ptr<telegram_api::messages_botCallbackAnswer> &&answer,
|
||||
Promise<td_api::object_ptr<td_api::callbackQueryAnswer>> &&promise) {
|
||||
CHECK(answer != nullptr);
|
||||
bool show_alert = (answer->flags_ & BOT_CALLBACK_ANSWER_FLAG_NEED_SHOW_ALERT) != 0;
|
||||
promise.set_value(td_api::make_object<td_api::callbackQueryAnswer>(answer->message_, show_alert, answer->url_));
|
||||
}
|
||||
|
||||
} // namespace td
|
||||
|
@ -39,33 +39,24 @@ class CallbackQueriesManager {
|
||||
tl_object_ptr<telegram_api::InputBotInlineMessageID> &&inline_message_id, BufferSlice &&data,
|
||||
int64 chat_instance, string &&game_short_name);
|
||||
|
||||
int64 send_callback_query(FullMessageId full_message_id, tl_object_ptr<td_api::CallbackQueryPayload> &&payload,
|
||||
Promise<Unit> &&promise);
|
||||
void send_callback_query(FullMessageId full_message_id, tl_object_ptr<td_api::CallbackQueryPayload> &&payload,
|
||||
Promise<td_api::object_ptr<td_api::callbackQueryAnswer>> &&promise);
|
||||
|
||||
void on_get_callback_query_answer(int64 result_id, tl_object_ptr<telegram_api::messages_botCallbackAnswer> &&answer);
|
||||
|
||||
tl_object_ptr<td_api::callbackQueryAnswer> get_callback_query_answer_object(int64 result_id);
|
||||
void on_get_callback_query_answer(tl_object_ptr<telegram_api::messages_botCallbackAnswer> &&answer,
|
||||
Promise<td_api::object_ptr<td_api::callbackQueryAnswer>> &&promise);
|
||||
|
||||
private:
|
||||
static constexpr int32 BOT_CALLBACK_ANSWER_FLAG_HAS_MESSAGE = 1 << 0;
|
||||
static constexpr int32 BOT_CALLBACK_ANSWER_FLAG_NEED_SHOW_ALERT = 1 << 1;
|
||||
static constexpr int32 BOT_CALLBACK_ANSWER_FLAG_HAS_URL = 1 << 2;
|
||||
|
||||
struct CallbackQueryAnswer {
|
||||
bool show_alert;
|
||||
string text;
|
||||
string url;
|
||||
};
|
||||
|
||||
tl_object_ptr<td_api::CallbackQueryPayload> get_query_payload(int32 flags, BufferSlice &&data,
|
||||
string &&game_short_name);
|
||||
|
||||
void send_get_callback_answer_query(FullMessageId full_message_id,
|
||||
tl_object_ptr<td_api::CallbackQueryPayload> &&payload,
|
||||
tl_object_ptr<telegram_api::InputCheckPasswordSRP> &&password, int64 result_id,
|
||||
Promise<Unit> &&promise);
|
||||
|
||||
std::unordered_map<int64, CallbackQueryAnswer> callback_query_answers_;
|
||||
tl_object_ptr<telegram_api::InputCheckPasswordSRP> &&password,
|
||||
Promise<td_api::object_ptr<td_api::callbackQueryAnswer>> &&promise);
|
||||
|
||||
Td *td_;
|
||||
};
|
||||
|
@ -2713,38 +2713,6 @@ class GetInlineQueryResultsRequest final : public RequestOnceActor {
|
||||
}
|
||||
};
|
||||
|
||||
class GetCallbackQueryAnswerRequest final : public RequestOnceActor {
|
||||
FullMessageId full_message_id_;
|
||||
tl_object_ptr<td_api::CallbackQueryPayload> payload_;
|
||||
|
||||
int64 result_id_;
|
||||
|
||||
void do_run(Promise<Unit> &&promise) final {
|
||||
result_id_ =
|
||||
td->callback_queries_manager_->send_callback_query(full_message_id_, std::move(payload_), std::move(promise));
|
||||
}
|
||||
|
||||
void do_send_result() final {
|
||||
send_result(td->callback_queries_manager_->get_callback_query_answer_object(result_id_));
|
||||
}
|
||||
|
||||
void do_send_error(Status &&status) final {
|
||||
if (status.code() == 502 && td->messages_manager_->is_message_edited_recently(full_message_id_, 31)) {
|
||||
return send_result(make_tl_object<td_api::callbackQueryAnswer>());
|
||||
}
|
||||
send_error(std::move(status));
|
||||
}
|
||||
|
||||
public:
|
||||
GetCallbackQueryAnswerRequest(ActorShared<Td> td, uint64 request_id, int64 dialog_id, int64 message_id,
|
||||
tl_object_ptr<td_api::CallbackQueryPayload> payload)
|
||||
: RequestOnceActor(std::move(td), request_id)
|
||||
, full_message_id_(DialogId(dialog_id), MessageId(message_id))
|
||||
, payload_(std::move(payload))
|
||||
, result_id_(0) {
|
||||
}
|
||||
};
|
||||
|
||||
class GetSupportUserRequest final : public RequestActor<> {
|
||||
UserId user_id_;
|
||||
|
||||
@ -7698,7 +7666,9 @@ void Td::on_request(uint64 id, td_api::answerInlineQuery &request) {
|
||||
|
||||
void Td::on_request(uint64 id, td_api::getCallbackQueryAnswer &request) {
|
||||
CHECK_IS_USER();
|
||||
CREATE_REQUEST(GetCallbackQueryAnswerRequest, request.chat_id_, request.message_id_, std::move(request.payload_));
|
||||
CREATE_REQUEST_PROMISE();
|
||||
callback_queries_manager_->send_callback_query({DialogId(request.chat_id_), MessageId(request.message_id_)},
|
||||
std::move(request.payload_), std::move(promise));
|
||||
}
|
||||
|
||||
void Td::on_request(uint64 id, td_api::answerCallbackQuery &request) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user