Add td_api::addQuickReplyShortcutInlineQueryResultMessage.

This commit is contained in:
levlam 2024-04-18 22:13:39 +03:00
parent 0af52ba4fd
commit 4354d4c5f4
6 changed files with 154 additions and 6 deletions

View File

@ -8165,6 +8165,15 @@ deleteQuickReplyShortcutMessages shortcut_id:int32 message_ids:vector<int53> = O
//@input_message_content The content of the message to be added; inputMessagePoll, inputMessageForwarded and inputMessageLocation with live_period aren't supported
addQuickReplyShortcutMessage shortcut_name:string reply_to_message_id:int53 input_message_content:InputMessageContent = QuickReplyMessage;
//@description Adds a message to a quick reply shortcut. If shortcut doesn't exist and there are less than getOption("quick_reply_shortcut_count_max") shortcuts, then a new shortcut is created.
//-The shortcut must not contain more than getOption("quick_reply_shortcut_message_count_max") messages after adding the new message. Returns the added message
//@shortcut_name Name of the target shortcut
//@reply_to_message_id Identifier of a quick reply message in the same shortcut to be replied; pass 0 if none
//@query_id Identifier of the inline query
//@result_id Identifier of the inline query result
//@hide_via_bot Pass true to hide the bot, via which the message is sent. Can be used only for bots getOption("animation_search_bot_username"), getOption("photo_search_bot_username"), and getOption("venue_search_bot_username")
addQuickReplyShortcutInlineQueryResultMessage shortcut_name:string reply_to_message_id:int53 query_id:int64 result_id:string hide_via_bot:Bool = Message;
//@description Returns list of custom emojis, which can be used as forum topic icon by all users
getForumTopicDefaultIcons = Stickers;

View File

@ -14,6 +14,7 @@
#include "td/telegram/FileReferenceManager.h"
#include "td/telegram/files/FileManager.h"
#include "td/telegram/Global.h"
#include "td/telegram/InlineQueriesManager.h"
#include "td/telegram/logevent/LogEvent.h"
#include "td/telegram/logevent/LogEventHelper.h"
#include "td/telegram/MessageContent.h"
@ -281,6 +282,55 @@ class QuickReplyManager::SendQuickReplyMessageQuery final : public Td::ResultHan
}
};
class QuickReplyManager::SendQuickReplyInlineMessageQuery final : public Td::ResultHandler {
int64 random_id_;
QuickReplyShortcutId shortcut_id_;
public:
void send(const QuickReplyMessage *m) {
random_id_ = m->random_id;
shortcut_id_ = m->shortcut_id;
int32 flags = telegram_api::messages_sendInlineBotResult::QUICK_REPLY_SHORTCUT_MASK;
if (m->hide_via_bot) {
flags |= telegram_api::messages_sendInlineBotResult::HIDE_VIA_MASK;
}
auto reply_to =
MessageInputReplyTo(m->reply_to_message_id, DialogId(), Auto(), 0).get_input_reply_to(td_, MessageId());
if (reply_to != nullptr) {
flags |= telegram_api::messages_sendInlineBotResult::REPLY_TO_MASK;
}
send_query(G()->net_query_creator().create(
telegram_api::messages_sendInlineBotResult(
flags, false /*ignored*/, false /*ignored*/, false /*ignored*/, false /*ignored*/,
telegram_api::make_object<telegram_api::inputPeerSelf>(), std::move(reply_to), m->random_id,
m->inline_query_id, m->inline_result_id, 0, nullptr,
td_->quick_reply_manager_->get_input_quick_reply_shortcut(m->shortcut_id)),
{{"me"}}));
}
void on_result(BufferSlice packet) final {
auto result_ptr = fetch_result<telegram_api::messages_sendInlineBotResult>(packet);
if (result_ptr.is_error()) {
return on_error(result_ptr.move_as_error());
}
auto ptr = result_ptr.move_as_ok();
LOG(INFO) << "Receive result for SendQuickReplyInlineMessageQuery for " << random_id_ << ": " << to_string(ptr);
td_->quick_reply_manager_->process_send_quick_reply_updates(shortcut_id_, std::move(ptr), {random_id_});
}
void on_error(Status status) final {
LOG(INFO) << "Receive error for SendQuickReplyInlineMessageQuery: " << status;
if (G()->close_flag()) {
// do not send error, message will be re-sent after restart
return;
}
td_->quick_reply_manager_->on_failed_send_quick_reply_messages(shortcut_id_, {random_id_}, std::move(status));
}
};
class QuickReplyManager::SendQuickReplyMediaQuery final : public Td::ResultHandler {
int64 random_id_;
QuickReplyShortcutId shortcut_id_;
@ -313,7 +363,7 @@ class QuickReplyManager::SendQuickReplyMediaQuery final : public Td::ResultHandl
vector<telegram_api::object_ptr<telegram_api::MessageEntity>> entities;
const FormattedText *message_text = get_message_content_text(m->content.get());
if (message_text != nullptr) {
entities = get_input_message_entities(td_->user_manager_.get(), message_text, "SendQuickReplyMessageQuery");
entities = get_input_message_entities(td_->user_manager_.get(), message_text, "SendQuickReplyMediaQuery");
if (!entities.empty()) {
flags |= telegram_api::messages_sendMedia::ENTITIES_MASK;
}
@ -434,6 +484,8 @@ void QuickReplyManager::QuickReplyMessage::store(StorerT &storer) const {
bool has_try_resend_at = !is_server && try_resend_at != 0;
bool has_media_album_id = media_album_id != 0;
bool has_reply_markup = reply_markup != nullptr;
bool has_inline_query_id = inline_query_id != 0;
bool has_inline_result_id = !inline_result_id.empty();
BEGIN_STORE_FLAGS();
STORE_FLAG(has_edit_date);
STORE_FLAG(has_random_id);
@ -452,6 +504,8 @@ void QuickReplyManager::QuickReplyMessage::store(StorerT &storer) const {
STORE_FLAG(has_try_resend_at);
STORE_FLAG(has_media_album_id);
STORE_FLAG(has_reply_markup);
STORE_FLAG(has_inline_query_id);
STORE_FLAG(has_inline_result_id);
END_STORE_FLAGS();
td::store(message_id, storer);
td::store(shortcut_id, storer);
@ -489,6 +543,12 @@ void QuickReplyManager::QuickReplyMessage::store(StorerT &storer) const {
if (has_reply_markup) {
td::store(reply_markup, storer);
}
if (has_inline_query_id) {
td::store(inline_query_id, storer);
}
if (has_inline_result_id) {
td::store(inline_result_id, storer);
}
}
template <class ParserT>
@ -504,6 +564,8 @@ void QuickReplyManager::QuickReplyMessage::parse(ParserT &parser) {
bool has_try_resend_at;
bool has_media_album_id;
bool has_reply_markup;
bool has_inline_query_id;
bool has_inline_result_id;
BEGIN_PARSE_FLAGS();
PARSE_FLAG(has_edit_date);
PARSE_FLAG(has_random_id);
@ -522,6 +584,8 @@ void QuickReplyManager::QuickReplyMessage::parse(ParserT &parser) {
PARSE_FLAG(has_try_resend_at);
PARSE_FLAG(has_media_album_id);
PARSE_FLAG(has_reply_markup);
PARSE_FLAG(has_inline_query_id);
PARSE_FLAG(has_inline_result_id);
END_PARSE_FLAGS();
td::parse(message_id, parser);
td::parse(shortcut_id, parser);
@ -559,6 +623,12 @@ void QuickReplyManager::QuickReplyMessage::parse(ParserT &parser) {
if (has_reply_markup) {
td::parse(reply_markup, parser);
}
if (has_inline_query_id) {
td::parse(inline_query_id, parser);
}
if (has_inline_result_id) {
td::parse(inline_result_id, parser);
}
}
QuickReplyManager::Shortcut::~Shortcut() = default;
@ -824,9 +894,6 @@ bool QuickReplyManager::can_resend_quick_reply_message(const QuickReplyMessage *
if (m->send_error_code != 429) {
return false;
}
if (m->via_bot_user_id.is_valid() || m->hide_via_bot) {
return false;
}
return true;
}
@ -1669,11 +1736,53 @@ Result<td_api::object_ptr<td_api::quickReplyMessage>> QuickReplyManager::send_me
return get_quick_reply_message_object(m, "send_message");
}
Result<td_api::object_ptr<td_api::quickReplyMessage>> QuickReplyManager::send_inline_query_result_message(
const string &shortcut_name, MessageId reply_to_message_id, int64 query_id, const string &result_id,
bool hide_via_bot) {
const InlineMessageContent *message_content =
td_->inline_queries_manager_->get_inline_message_content(query_id, result_id);
if (message_content == nullptr || query_id == 0) {
return Status::Error(400, "Inline query result not found");
}
TRY_RESULT(s, create_new_local_shortcut(shortcut_name, 1));
bool is_new = s->messages_.empty();
reply_to_message_id = get_input_reply_to_message_id(s, reply_to_message_id);
UserId via_bot_user_id;
if (!hide_via_bot) {
via_bot_user_id = td_->inline_queries_manager_->get_inline_bot_user_id(query_id);
}
auto content =
dup_message_content(td_, td_->dialog_manager_->get_my_dialog_id(), message_content->message_content.get(),
MessageContentDupType::SendViaBot, MessageCopyOptions());
auto *m = add_local_message(s, reply_to_message_id, std::move(content), message_content->invert_media,
via_bot_user_id, hide_via_bot, message_content->disable_web_page_preview, string());
m->reply_markup = dup_reply_markup(message_content->message_reply_markup);
m->inline_query_id = query_id;
m->inline_result_id = result_id;
send_update_quick_reply_shortcut(s, "send_inline_query_result_message");
send_update_quick_reply_shortcut_messages(s, "send_inline_query_result_message");
if (is_new) {
send_update_quick_reply_shortcuts();
}
save_quick_reply_shortcuts();
do_send_message(m);
return get_quick_reply_message_object(m, "send_inline_query_result_message");
}
void QuickReplyManager::do_send_message(const QuickReplyMessage *m, vector<int> bad_parts) {
bool is_edit = m->message_id.is_server();
auto message_full_id = QuickReplyMessageFullId(m->shortcut_id, m->message_id);
LOG(INFO) << "Do " << (is_edit ? "edit" : "send") << ' ' << message_full_id;
if (!is_edit && m->inline_query_id != 0) {
td_->create_handler<SendQuickReplyInlineMessageQuery>()->send(m);
return;
}
auto content = m->content.get();
CHECK(content != nullptr);
auto content_type = content->get_type();

View File

@ -63,6 +63,12 @@ class QuickReplyManager final : public Actor {
const string &shortcut_name, MessageId reply_to_message_id,
td_api::object_ptr<td_api::InputMessageContent> &&input_message_content);
Result<td_api::object_ptr<td_api::quickReplyMessage>> send_inline_query_result_message(const string &shortcut_name,
MessageId reply_to_message_id,
int64 query_id,
const string &result_id,
bool hide_via_bot);
void reload_quick_reply_shortcuts();
void reload_quick_reply_messages(QuickReplyShortcutId shortcut_id, Promise<Unit> &&promise);
@ -105,6 +111,9 @@ class QuickReplyManager final : public Actor {
string send_emoji; // for send_message
int64 inline_query_id = 0; // for send_message
string inline_result_id; // for send_message
UserId via_bot_user_id;
bool is_failed_to_send = false;
@ -171,6 +180,7 @@ class QuickReplyManager final : public Actor {
class SendQuickReplyMessageQuery;
class SendQuickReplyMediaQuery;
class SendQuickReplyInlineMessageQuery;
class UploadMediaCallback;
class UploadThumbnailCallback;

View File

@ -5889,6 +5889,19 @@ void Td::on_request(uint64 id, td_api::addQuickReplyShortcutMessage &request) {
}
}
void Td::on_request(uint64 id, td_api::addQuickReplyShortcutInlineQueryResultMessage &request) {
CLEAN_INPUT_STRING(request.shortcut_name_);
CLEAN_INPUT_STRING(request.result_id_);
auto r_sent_message = quick_reply_manager_->send_inline_query_result_message(
request.shortcut_name_, MessageId(request.reply_to_message_id_), request.query_id_, request.result_id_,
request.hide_via_bot_);
if (r_sent_message.is_error()) {
send_closure(actor_id(this), &Td::send_error, id, r_sent_message.move_as_error());
} else {
send_closure(actor_id(this), &Td::send_result, id, r_sent_message.move_as_ok());
}
}
void Td::on_request(uint64 id, const td_api::getStory &request) {
CHECK_IS_USER();
CREATE_REQUEST_PROMISE();

View File

@ -901,6 +901,8 @@ class Td final : public Actor {
void on_request(uint64 id, td_api::addQuickReplyShortcutMessage &request);
void on_request(uint64 id, td_api::addQuickReplyShortcutInlineQueryResultMessage &request);
void on_request(uint64 id, const td_api::getStory &request);
void on_request(uint64 id, const td_api::getChatsToSendStories &request);

View File

@ -5066,8 +5066,13 @@ class CliClient final : public Actor {
int64 query_id;
string result_id;
get_args(args, chat_id, query_id, result_id);
send_request(td_api::make_object<td_api::sendInlineQueryResultMessage>(
chat_id, message_thread_id_, nullptr, default_message_send_options(), query_id, result_id, op == "siqrh"));
if (quick_reply_shortcut_name_.empty()) {
send_request(td_api::make_object<td_api::sendInlineQueryResultMessage>(
chat_id, message_thread_id_, nullptr, default_message_send_options(), query_id, result_id, op == "siqrh"));
} else {
send_request(td_api::make_object<td_api::addQuickReplyShortcutInlineQueryResultMessage>(
quick_reply_shortcut_name_, reply_message_id_, query_id, result_id, op == "siqrh"));
}
} else if (op == "gcqa") {
ChatId chat_id;
MessageId message_id;