diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 4a4057b4c..c519e7985 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -3785,9 +3785,13 @@ sendChatSetTtlMessage chat_id:int53 ttl:int32 = Message; //@description Sends a notification about a screenshot taken in a chat. Supported only in private and secret chats @chat_id Chat identifier sendChatScreenshotTakenNotification chat_id:int53 = Ok; -//@description Adds a local message to a chat. The message is persistent across application restarts only if the message database is used. Returns the added message @chat_id Target chat @sender_user_id Identifier of the user who will be shown as the sender of the message; may be 0 for channel posts -//@reply_to_message_id Identifier of the message to reply to or 0 @disable_notification Pass true to disable notification for the message @input_message_content The content of the message to be added -addLocalMessage chat_id:int53 sender_user_id:int32 reply_to_message_id:int53 disable_notification:Bool input_message_content:InputMessageContent = Message; +//@description Adds a local message to a chat. The message is persistent across application restarts only if the message database is used. Returns the added message +//@chat_id Target chat +//@sender The sender sender of the message +//@reply_to_message_id Identifier of the message to reply to or 0 +//@disable_notification Pass true to disable notification for the message +//@input_message_content The content of the message to be added +addLocalMessage chat_id:int53 sender:MessageSender reply_to_message_id:int53 disable_notification:Bool input_message_content:InputMessageContent = Message; //@description Deletes messages @chat_id Chat identifier @message_ids Identifiers of the messages to be deleted @revoke Pass true to try to delete messages for all chat members. Always true for supergroups, channels and secret chats deleteMessages chat_id:int53 message_ids:vector revoke:Bool = Ok; diff --git a/td/generate/scheme/td_api.tlo b/td/generate/scheme/td_api.tlo index 05b1bb5f5..15383020d 100644 Binary files a/td/generate/scheme/td_api.tlo and b/td/generate/scheme/td_api.tlo differ diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index 8a254e148..c51ab9518 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -25459,8 +25459,8 @@ void MessagesManager::do_send_screenshot_taken_notification_message(DialogId dia } Result MessagesManager::add_local_message( - DialogId dialog_id, UserId sender_user_id, MessageId reply_to_message_id, bool disable_notification, - tl_object_ptr &&input_message_content) { + DialogId dialog_id, td_api::object_ptr &&sender, MessageId reply_to_message_id, + bool disable_notification, tl_object_ptr &&input_message_content) { if (input_message_content == nullptr) { return Status::Error(5, "Can't add local message without content"); } @@ -25486,8 +25486,38 @@ Result MessagesManager::add_local_message( } bool is_channel_post = is_broadcast_channel(dialog_id); - if (sender_user_id != UserId() && !td_->contacts_manager_->have_user_force(sender_user_id)) { - return Status::Error(400, "User not found"); + UserId sender_user_id; + DialogId sender_dialog_id; + if (sender != nullptr) { + switch (sender->get_id()) { + case td_api::messageSenderUser::ID: + sender_user_id = UserId(static_cast(sender.get())->user_id_); + if (!td_->contacts_manager_->have_user_force(sender_user_id)) { + return Status::Error(400, "Sender user not found"); + } + break; + case td_api::messageSenderChat::ID: + sender_dialog_id = DialogId(static_cast(sender.get())->chat_id_); + if (sender_dialog_id.get_type() != DialogType::Channel) { + return Status::Error(400, "Sender chat must be a supergroup or channel"); + } + if (!have_dialog_force(sender_dialog_id)) { + return Status::Error(400, "Sender chat not found"); + } + break; + default: + UNREACHABLE(); + } + } else if (is_channel_post) { + sender_dialog_id = dialog_id; + } else { + return Status::Error(400, "The message must have a sender"); + } + if (is_channel_post && sender_user_id.is_valid()) { + return Status::Error(400, "Channel post can't have a sender user"); + } + if (is_channel_post && sender_dialog_id != dialog_id) { + return Status::Error(400, "Channel post must have the channel as a sender"); } auto dialog_type = dialog_id.get_type(); @@ -25513,9 +25543,10 @@ Result MessagesManager::add_local_message( if (td_->contacts_manager_->get_channel_sign_messages(dialog_id.get_channel_id())) { m->author_signature = td_->contacts_manager_->get_user_title(sender_user_id); } - m->sender_dialog_id = dialog_id; + m->sender_dialog_id = sender_dialog_id; } else { m->sender_user_id = sender_user_id; + m->sender_dialog_id = sender_dialog_id; } m->date = G()->unix_time(); m->reply_to_message_id = get_reply_to_message_id(d, MessageId(), reply_to_message_id); diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 9e3743649..f935d818c 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -425,9 +425,10 @@ class MessagesManager : public Actor { Status send_screenshot_taken_notification_message(DialogId dialog_id); - Result add_local_message( - DialogId dialog_id, UserId sender_user_id, MessageId reply_to_message_id, bool disable_notification, - tl_object_ptr &&input_message_content) TD_WARN_UNUSED_RESULT; + Result add_local_message(DialogId dialog_id, td_api::object_ptr &&sender, + MessageId reply_to_message_id, bool disable_notification, + tl_object_ptr &&input_message_content) + TD_WARN_UNUSED_RESULT; void edit_message_text(FullMessageId full_message_id, tl_object_ptr &&reply_markup, tl_object_ptr &&input_message_content, Promise &&promise); diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index cea9d4a62..43591a47e 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -5710,8 +5710,8 @@ void Td::on_request(uint64 id, td_api::addLocalMessage &request) { DialogId dialog_id(request.chat_id_); auto r_new_message_id = messages_manager_->add_local_message( - dialog_id, UserId(request.sender_user_id_), MessageId(request.reply_to_message_id_), - request.disable_notification_, std::move(request.input_message_content_)); + dialog_id, std::move(request.sender_), MessageId(request.reply_to_message_id_), request.disable_notification_, + std::move(request.input_message_content_)); if (r_new_message_id.is_error()) { return send_closure(actor_id(this), &Td::send_error, id, r_new_message_id.move_as_error()); } diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index a2c5e6aa2..dd8f1ef3b 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -509,12 +509,12 @@ class CliClient final : public Actor { return as_message_id(str); } - td_api::object_ptr as_message_sender(Slice str) const { - str = trim(str); - if (str.empty() || str[0] != '-') { - return td_api::make_object(as_user_id(str)); + td_api::object_ptr as_message_sender(Slice sender_id) const { + sender_id = trim(sender_id); + if (sender_id.empty() || sender_id[0] != '-') { + return td_api::make_object(as_user_id(sender_id)); } else { - return td_api::make_object(as_chat_id(str)); + return td_api::make_object(as_chat_id(sender_id)); } } @@ -3024,18 +3024,18 @@ class CliClient final : public Actor { op == "sms", false, as_message_id(reply_to_message_id)); } else if (op == "alm" || op == "almr") { string chat_id; - string user_id; + string sender_id; string reply_to_message_id; string message; std::tie(chat_id, args) = split(args); - std::tie(user_id, message) = split(args); + std::tie(sender_id, message) = split(args); if (op == "almr") { std::tie(reply_to_message_id, message) = split(message); } send_request(td_api::make_object( - as_chat_id(chat_id), as_user_id(user_id), as_message_id(reply_to_message_id), false, + as_chat_id(chat_id), as_message_sender(sender_id), as_message_id(reply_to_message_id), false, td_api::make_object(as_formatted_text(message), false, true))); } else if (op == "smap" || op == "smapr") { string chat_id;