From 06a432a373e183d871142c6ba8a73309765c2a01 Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 10 Jan 2023 16:20:30 +0300 Subject: [PATCH] Add td_api::messageChatChosen. --- td/generate/scheme/td_api.tl | 3 ++ td/telegram/DialogAction.cpp | 1 + td/telegram/MessageContent.cpp | 69 ++++++++++++++++++++++++++++-- td/telegram/MessageContent.h | 2 +- td/telegram/MessageContentType.cpp | 6 +++ td/telegram/MessageContentType.h | 3 +- td/telegram/MessagesManager.cpp | 3 +- 7 files changed, 81 insertions(+), 6 deletions(-) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 20becc72a..2a78b0672 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -2455,6 +2455,9 @@ messageGiftedPremium currency:string amount:int53 month_count:int32 sticker:stic //@description A contact has registered with Telegram messageContactRegistered = MessageContent; +//@description The user chosen a chat, which was requested by the bot @chat_id Identifier of the chosen chat @button_id Identifier of the keyboard button with the request +messageChatChosen chat_id:int53 button_id:int32 = MessageContent; + //@description The current user has connected a website by logging in using Telegram Login Widget on it @domain_name Domain name of the connected website messageWebsiteConnected domain_name:string = MessageContent; diff --git a/td/telegram/DialogAction.cpp b/td/telegram/DialogAction.cpp index 10cd3c0e2..65ae77e03 100644 --- a/td/telegram/DialogAction.cpp +++ b/td/telegram/DialogAction.cpp @@ -407,6 +407,7 @@ bool DialogAction::is_canceled_by_message_of_type(MessageContentType message_con case MessageContentType::TopicEdit: case MessageContentType::SuggestProfilePhoto: case MessageContentType::WriteAccessAllowed: + case MessageContentType::RequestedDialog: return false; default: UNREACHABLE(); diff --git a/td/telegram/MessageContent.cpp b/td/telegram/MessageContent.cpp index 58f29b60e..238bd7622 100644 --- a/td/telegram/MessageContent.cpp +++ b/td/telegram/MessageContent.cpp @@ -861,6 +861,20 @@ class MessageWriteAccessAllowed final : public MessageContent { } }; +class MessageRequestedDialog final : public MessageContent { + public: + DialogId dialog_id; + int32 button_id = 0; + + MessageRequestedDialog() = default; + MessageRequestedDialog(DialogId dialog_id, int32 button_id) : dialog_id(dialog_id), button_id(button_id) { + } + + MessageContentType get_type() const final { + return MessageContentType::RequestedDialog; + } +}; + template static void store(const MessageContent *content, StorerT &storer) { CHECK(content != nullptr); @@ -1224,6 +1238,12 @@ static void store(const MessageContent *content, StorerT &storer) { } case MessageContentType::WriteAccessAllowed: break; + case MessageContentType::RequestedDialog: { + const auto *m = static_cast(content); + store(m->dialog_id, storer); + store(m->button_id, storer); + break; + } default: UNREACHABLE(); } @@ -1723,6 +1743,13 @@ static void parse(unique_ptr &content, ParserT &parser) { case MessageContentType::WriteAccessAllowed: content = make_unique(); break; + case MessageContentType::RequestedDialog: { + auto m = make_unique(); + parse(m->dialog_id, parser); + parse(m->button_id, parser); + content = std::move(m); + break; + } default: LOG(FATAL) << "Have unknown message content type " << static_cast(content_type); } @@ -2349,6 +2376,7 @@ bool can_have_input_media(const Td *td, const MessageContent *content, bool is_s case MessageContentType::TopicEdit: case MessageContentType::SuggestProfilePhoto: case MessageContentType::WriteAccessAllowed: + case MessageContentType::RequestedDialog: return false; case MessageContentType::Animation: case MessageContentType::Audio: @@ -2474,6 +2502,7 @@ SecretInputMedia get_secret_input_media(const MessageContent *content, Td *td, case MessageContentType::TopicEdit: case MessageContentType::SuggestProfilePhoto: case MessageContentType::WriteAccessAllowed: + case MessageContentType::RequestedDialog: break; default: UNREACHABLE(); @@ -2599,6 +2628,7 @@ static tl_object_ptr get_input_media_impl( case MessageContentType::TopicEdit: case MessageContentType::SuggestProfilePhoto: case MessageContentType::WriteAccessAllowed: + case MessageContentType::RequestedDialog: break; default: UNREACHABLE(); @@ -2768,6 +2798,7 @@ void delete_message_content_thumbnail(MessageContent *content, Td *td) { case MessageContentType::TopicEdit: case MessageContentType::SuggestProfilePhoto: case MessageContentType::WriteAccessAllowed: + case MessageContentType::RequestedDialog: break; default: UNREACHABLE(); @@ -2954,6 +2985,7 @@ Status can_send_message_content(DialogId dialog_id, const MessageContent *conten case MessageContentType::TopicEdit: case MessageContentType::SuggestProfilePhoto: case MessageContentType::WriteAccessAllowed: + case MessageContentType::RequestedDialog: UNREACHABLE(); } return Status::OK(); @@ -3087,6 +3119,7 @@ static int32 get_message_content_media_index_mask(const MessageContent *content, case MessageContentType::TopicEdit: case MessageContentType::SuggestProfilePhoto: case MessageContentType::WriteAccessAllowed: + case MessageContentType::RequestedDialog: return 0; default: UNREACHABLE(); @@ -3878,6 +3911,14 @@ void merge_message_contents(Td *td, const MessageContent *old_content, MessageCo } case MessageContentType::WriteAccessAllowed: break; + case MessageContentType::RequestedDialog: { + const auto *old_ = static_cast(old_content); + const auto *new_ = static_cast(new_content); + if (old_->dialog_id != new_->dialog_id || old_->button_id != new_->button_id) { + need_update = true; + } + break; + } default: UNREACHABLE(); break; @@ -4014,6 +4055,7 @@ bool merge_message_content_file_id(Td *td, MessageContent *message_content, File case MessageContentType::TopicEdit: case MessageContentType::SuggestProfilePhoto: case MessageContentType::WriteAccessAllowed: + case MessageContentType::RequestedDialog: LOG(ERROR) << "Receive new file " << new_file_id << " in a sent message of the type " << content_type; break; default: @@ -5003,6 +5045,7 @@ unique_ptr dup_message_content(Td *td, DialogId dialog_id, const case MessageContentType::TopicEdit: case MessageContentType::SuggestProfilePhoto: case MessageContentType::WriteAccessAllowed: + case MessageContentType::RequestedDialog: return nullptr; default: UNREACHABLE(); @@ -5324,8 +5367,16 @@ unique_ptr get_action_message_content(Td *td, tl_object_ptr(); - case telegram_api::messageActionRequestedPeer::ID: - return td::make_unique(); + case telegram_api::messageActionRequestedPeer::ID: { + auto action = move_tl_object_as(action_ptr); + DialogId dialog_id(action->peer_); + if (!dialog_id.is_valid()) { + LOG(ERROR) << "Receive invalid " << oneline(to_string(action)); + break; + } + + return make_unique(dialog_id, action->button_id_); + } default: UNREACHABLE(); } @@ -5627,6 +5678,10 @@ tl_object_ptr get_message_content_object(const MessageCo } case MessageContentType::WriteAccessAllowed: return make_tl_object(); + case MessageContentType::RequestedDialog: { + const auto *m = static_cast(content); + return make_tl_object(m->dialog_id.get(), m->button_id); + } default: UNREACHABLE(); return nullptr; @@ -6024,6 +6079,7 @@ string get_message_content_search_text(const Td *td, const MessageContent *conte case MessageContentType::GiftPremium: case MessageContentType::SuggestProfilePhoto: case MessageContentType::WriteAccessAllowed: + case MessageContentType::RequestedDialog: return string(); default: UNREACHABLE(); @@ -6157,7 +6213,7 @@ void update_failed_to_send_message_content(Td *td, unique_ptr &c } } -void add_message_content_dependencies(Dependencies &dependencies, const MessageContent *message_content) { +void add_message_content_dependencies(Dependencies &dependencies, const MessageContent *message_content, bool is_bot) { switch (message_content->get_type()) { case MessageContentType::Text: { const auto *content = static_cast(message_content); @@ -6309,6 +6365,13 @@ void add_message_content_dependencies(Dependencies &dependencies, const MessageC break; case MessageContentType::WriteAccessAllowed: break; + case MessageContentType::RequestedDialog: { + const auto *content = static_cast(message_content); + if (!is_bot) { + dependencies.add_dialog_and_dependencies(content->dialog_id); + } + break; + } default: UNREACHABLE(); break; diff --git a/td/telegram/MessageContent.h b/td/telegram/MessageContent.h index 6b8d81f81..d9cebf0ec 100644 --- a/td/telegram/MessageContent.h +++ b/td/telegram/MessageContent.h @@ -254,7 +254,7 @@ void update_expired_message_content(unique_ptr &content); void update_failed_to_send_message_content(Td *td, unique_ptr &content); -void add_message_content_dependencies(Dependencies &dependencies, const MessageContent *message_content); +void add_message_content_dependencies(Dependencies &dependencies, const MessageContent *message_content, bool is_bot); void update_forum_topic_info_by_service_message_content(Td *td, const MessageContent *content, DialogId dialog_id, MessageId top_thread_message_id); diff --git a/td/telegram/MessageContentType.cpp b/td/telegram/MessageContentType.cpp index 49e4b95d7..868c8157b 100644 --- a/td/telegram/MessageContentType.cpp +++ b/td/telegram/MessageContentType.cpp @@ -118,6 +118,8 @@ StringBuilder &operator<<(StringBuilder &string_builder, MessageContentType cont return string_builder << "SuggestProfilePhoto"; case MessageContentType::WriteAccessAllowed: return string_builder << "WriteAccessAllowed"; + case MessageContentType::RequestedDialog: + return string_builder << "ChatChosen"; default: UNREACHABLE(); return string_builder; @@ -180,6 +182,7 @@ bool is_allowed_media_group_content(MessageContentType content_type) { case MessageContentType::TopicEdit: case MessageContentType::SuggestProfilePhoto: case MessageContentType::WriteAccessAllowed: + case MessageContentType::RequestedDialog: return false; default: UNREACHABLE(); @@ -250,6 +253,7 @@ bool is_secret_message_content(int32 ttl, MessageContentType content_type) { case MessageContentType::TopicEdit: case MessageContentType::SuggestProfilePhoto: case MessageContentType::WriteAccessAllowed: + case MessageContentType::RequestedDialog: return false; default: UNREACHABLE(); @@ -313,6 +317,7 @@ bool is_service_message_content(MessageContentType content_type) { case MessageContentType::TopicEdit: case MessageContentType::SuggestProfilePhoto: case MessageContentType::WriteAccessAllowed: + case MessageContentType::RequestedDialog: return true; default: UNREACHABLE(); @@ -376,6 +381,7 @@ bool can_have_message_content_caption(MessageContentType content_type) { case MessageContentType::TopicEdit: case MessageContentType::SuggestProfilePhoto: case MessageContentType::WriteAccessAllowed: + case MessageContentType::RequestedDialog: return false; default: UNREACHABLE(); diff --git a/td/telegram/MessageContentType.h b/td/telegram/MessageContentType.h index d6f224916..4bbe01be9 100644 --- a/td/telegram/MessageContentType.h +++ b/td/telegram/MessageContentType.h @@ -67,7 +67,8 @@ enum class MessageContentType : int32 { TopicCreate, TopicEdit, SuggestProfilePhoto, - WriteAccessAllowed + WriteAccessAllowed, + RequestedDialog }; StringBuilder &operator<<(StringBuilder &string_builder, MessageContentType content_type); diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index ee5f52193..b7f706e96 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -26074,7 +26074,7 @@ void MessagesManager::add_message_dependencies(Dependencies &dependencies, const m->reactions->add_min_channels(td_); m->reactions->add_dependencies(dependencies); } - add_message_content_dependencies(dependencies, m->content.get()); + add_message_content_dependencies(dependencies, m->content.get(), td_->auth_manager_->is_bot()); add_reply_markup_dependencies(dependencies, m->reply_markup.get()); } @@ -27705,6 +27705,7 @@ bool MessagesManager::can_edit_message(DialogId dialog_id, const Message *m, boo case MessageContentType::TopicEdit: case MessageContentType::SuggestProfilePhoto: case MessageContentType::WriteAccessAllowed: + case MessageContentType::RequestedDialog: return false; default: UNREACHABLE();