diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 5fb3d53e..504e8ca7 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -17869,6 +17869,7 @@ Result MessagesManager::send_message(DialogId dialog_id, MessageId re TRY_RESULT(message_reply_markup, get_dialog_reply_markup(dialog_id, std::move(reply_markup))); TRY_RESULT(message_content, process_input_message_content(dialog_id, std::move(input_message_content))); TRY_RESULT(send_message_options, process_send_message_options(dialog_id, std::move(options))); + TRY_STATUS(can_use_send_message_options(send_message_options, message_content)); // there must be no errors after get_message_to_send call @@ -17992,6 +17993,25 @@ Result MessagesManager::process_send_messag return result; } +Status MessagesManager::can_use_send_message_options(const SendMessageOptions &options, + const unique_ptr &content, int32 ttl) { + if (options.schedule_date != 0) { + if (ttl > 0) { + return Status::Error(400, "Can't send scheduled self-destructing messages"); + } + if (content->get_type() == MessageContentType::LiveLocation) { + return Status::Error(400, "Can't send scheduled live location messages"); + } + } + + return Status::OK(); +} + +Status MessagesManager::can_use_send_message_options(const SendMessageOptions &options, + const InputMessageContent &content) { + return can_use_send_message_options(options, content.content, content.ttl); +} + int64 MessagesManager::generate_new_media_album_id() { int64 media_album_id = 0; do { @@ -18021,6 +18041,7 @@ Result> MessagesManager::send_message_group( vector, int32>> message_contents; for (auto &input_message_content : input_message_contents) { TRY_RESULT(message_content, process_input_message_content(dialog_id, std::move(input_message_content))); + TRY_STATUS(can_use_send_message_options(send_message_options, message_content)); if (!is_allowed_media_group_content(message_content.content->get_type())) { return Status::Error(5, "Wrong message content type"); } @@ -18772,6 +18793,7 @@ Result MessagesManager::send_inline_query_result_message(DialogId dia return Status::Error(5, "Inline query result not found"); } + TRY_STATUS(can_use_send_message_options(send_message_options, content->message_content, 0)); TRY_STATUS(can_send_message_content(dialog_id, content->message_content.get(), false, true)); bool need_update_dialog_pos = false; @@ -20280,6 +20302,12 @@ Result> MessagesManager::forward_messages(DialogId to_dialog_i continue; } + auto can_use_options_status = can_use_send_message_options(send_message_options, content, 0); + if (can_use_options_status.is_error()) { + LOG(INFO) << "Can't forward " << message_id << ": " << can_send_status.message(); + continue; + } + auto content_type = content->get_type(); bool is_game = content_type == MessageContentType::Game; if (need_copy) { diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index e001e0eb..4a73ec88 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -1501,6 +1501,10 @@ class MessagesManager : public Actor { Result process_send_message_options(DialogId dialog_id, tl_object_ptr &&options) const; + static Status can_use_send_message_options(const SendMessageOptions &options, + const unique_ptr &content, int32 ttl); + static Status can_use_send_message_options(const SendMessageOptions &options, const InputMessageContent &content); + Message *get_message_to_send(Dialog *d, MessageId reply_to_message_id, const SendMessageOptions &options, unique_ptr &&content, bool *need_update_dialog_pos, unique_ptr forward_info = nullptr);