diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index e9c774c82..eae8fee0c 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -3784,7 +3784,8 @@ storyInteractions total_count:int32 total_forward_count:int32 total_reaction_cou //@via_bot_user_id If non-zero, the user identifier of the bot through which this message was sent //@media_album_id Unique identifier of an album this message belongs to. Only audios, documents, photos and videos can be grouped together in albums //@content Content of the message -quickReplyMessage id:int53 sending_state:MessageSendingState can_be_edited:Bool reply_to_message_id:int53 via_bot_user_id:int53 media_album_id:int64 content:MessageContent = QuickReplyMessage; +//@reply_markup Inline keyboard reply markup for the message; may be null if none +quickReplyMessage id:int53 sending_state:MessageSendingState can_be_edited:Bool reply_to_message_id:int53 via_bot_user_id:int53 media_album_id:int64 content:MessageContent reply_markup:ReplyMarkup = QuickReplyMessage; //@description Describes a shortcut that can be used for a quick reply //@id Unique shortcut identifier diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 9767c1a21..a2d27d10f 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -26690,6 +26690,7 @@ Result> MessagesManager::send_quick_reply_s Message *m = get_message_to_send(d, MessageId(), std::move(input_reply_to), message_send_options, std::move(content.content_), content.invert_media_, &need_update_dialog_pos, false, nullptr, DialogId(), true); + m->reply_markup = std::move(content.reply_markup_); m->disable_web_page_preview = content.disable_web_page_preview_; m->media_album_id = content.media_album_id_; original_message_id_to_new_message_id.emplace(content.original_message_id_, m->message_id); diff --git a/td/telegram/QuickReplyManager.cpp b/td/telegram/QuickReplyManager.cpp index b37eb4dda..9402c91ff 100644 --- a/td/telegram/QuickReplyManager.cpp +++ b/td/telegram/QuickReplyManager.cpp @@ -21,6 +21,8 @@ #include "td/telegram/MessageSelfDestructType.h" #include "td/telegram/misc.h" #include "td/telegram/RepliedMessageInfo.h" +#include "td/telegram/ReplyMarkup.h" +#include "td/telegram/ReplyMarkup.hpp" #include "td/telegram/Td.h" #include "td/telegram/Version.h" @@ -223,6 +225,7 @@ void QuickReplyManager::QuickReplyMessage::store(StorerT &storer) const { bool has_send_error_message = !is_server && !send_error_message.empty(); 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; BEGIN_STORE_FLAGS(); STORE_FLAG(has_edit_date); STORE_FLAG(has_random_id); @@ -240,6 +243,7 @@ void QuickReplyManager::QuickReplyMessage::store(StorerT &storer) const { STORE_FLAG(has_send_error_message); STORE_FLAG(has_try_resend_at); STORE_FLAG(has_media_album_id); + STORE_FLAG(has_reply_markup); END_STORE_FLAGS(); td::store(message_id, storer); td::store(shortcut_id, storer); @@ -274,6 +278,9 @@ void QuickReplyManager::QuickReplyMessage::store(StorerT &storer) const { td::store(media_album_id, storer); } store_message_content(content.get(), storer); + if (has_reply_markup) { + td::store(reply_markup, storer); + } } template @@ -288,6 +295,7 @@ void QuickReplyManager::QuickReplyMessage::parse(ParserT &parser) { bool has_send_error_message; bool has_try_resend_at; bool has_media_album_id; + bool has_reply_markup; BEGIN_PARSE_FLAGS(); PARSE_FLAG(has_edit_date); PARSE_FLAG(has_random_id); @@ -305,6 +313,7 @@ void QuickReplyManager::QuickReplyMessage::parse(ParserT &parser) { PARSE_FLAG(has_send_error_message); PARSE_FLAG(has_try_resend_at); PARSE_FLAG(has_media_album_id); + PARSE_FLAG(has_reply_markup); END_PARSE_FLAGS(); td::parse(message_id, parser); td::parse(shortcut_id, parser); @@ -339,6 +348,9 @@ void QuickReplyManager::QuickReplyMessage::parse(ParserT &parser) { td::parse(media_album_id, parser); } parse_message_content(content, parser); + if (has_reply_markup) { + td::parse(reply_markup, parser); + } } QuickReplyManager::Shortcut::~Shortcut() = default; @@ -491,9 +503,8 @@ unique_ptr QuickReplyManager::create_messa message->fwd_from_ != nullptr || message->views_ != 0 || message->forwards_ != 0 || message->replies_ != nullptr || message->reactions_ != nullptr || message->ttl_period_ != 0 || !message->out_ || message->post_ || message->from_scheduled_ || message->pinned_ || message->noforwards_ || - message->mentioned_ || message->media_unread_ || message->reply_markup_ != nullptr || - !message->restriction_reason_.empty() || !message->post_author_.empty() || - message->from_boosts_applied_ != 0) { + message->mentioned_ || message->media_unread_ || !message->restriction_reason_.empty() || + !message->post_author_.empty() || message->from_boosts_applied_ != 0) { LOG(ERROR) << "Receive an invalid quick reply from " << source << ": " << to_string(message); } if (message->saved_peer_id_ != nullptr) { @@ -555,6 +566,8 @@ unique_ptr QuickReplyManager::create_messa result->legacy_layer = (message->legacy_ ? MTPROTO_LAYER : 0); result->invert_media = message->invert_media_; result->content = std::move(content); + result->reply_markup = + get_reply_markup(std::move(message->reply_markup_), td_->auth_manager_->is_bot(), true, false); if (media_album_id != 0) { if (!is_allowed_media_group_content(content_type)) { @@ -591,6 +604,7 @@ void QuickReplyManager::add_quick_reply_message_dependencies(Dependencies &depen auto is_bot = td_->auth_manager_->is_bot(); dependencies.add(m->via_bot_user_id); add_message_content_dependencies(dependencies, m->content.get(), is_bot); + add_reply_markup_dependencies(dependencies, m->reply_markup.get()); } bool QuickReplyManager::can_edit_quick_reply_message(const QuickReplyMessage *m) const { @@ -639,7 +653,8 @@ td_api::object_ptr QuickReplyManager::get_quick_reply return td_api::make_object( m->message_id.get(), get_message_sending_state_object(m), can_be_edited, m->reply_to_message_id.get(), td_->contacts_manager_->get_user_id_object(m->via_bot_user_id, "via_bot_user_id"), m->media_album_id, - get_quick_reply_message_message_content_object(m)); + get_quick_reply_message_message_content_object(m), + get_reply_markup_object(td_->contacts_manager_.get(), m->reply_markup)); } int32 QuickReplyManager::get_shortcut_message_count(const Shortcut *s) { @@ -1410,8 +1425,9 @@ Result> QuickReplyManager::g auto disable_web_page_preview = message->disable_web_page_preview && content->get_type() == MessageContentType::Text && !has_message_content_web_page(content.get()); - result.push_back({std::move(content), message->message_id, message->reply_to_message_id, message->media_album_id, - message->invert_media, disable_web_page_preview}); + result.push_back({std::move(content), message->message_id, message->reply_to_message_id, + dup_reply_markup(message->reply_markup), message->media_album_id, message->invert_media, + disable_web_page_preview}); } return std::move(result); diff --git a/td/telegram/QuickReplyManager.h b/td/telegram/QuickReplyManager.h index b827b58b1..8ad27d165 100644 --- a/td/telegram/QuickReplyManager.h +++ b/td/telegram/QuickReplyManager.h @@ -30,6 +30,7 @@ namespace td { class Dependencies; class MessageContent; +struct ReplyMarkup; class Td; class QuickReplyManager final : public Actor { @@ -65,6 +66,7 @@ class QuickReplyManager final : public Actor { unique_ptr content_; MessageId original_message_id_; MessageId original_reply_to_message_id_; + unique_ptr reply_markup_; int64 media_album_id_; bool invert_media_; bool disable_web_page_preview_; @@ -115,6 +117,7 @@ class QuickReplyManager final : public Actor { int64 media_album_id = 0; unique_ptr content; + unique_ptr reply_markup; mutable uint64 send_message_log_event_id = 0;