Keep initial sender when resending messages if possible.

This commit is contained in:
levlam 2021-11-25 17:01:54 +03:00
parent 6f835c12ee
commit 4084b30a52
2 changed files with 28 additions and 14 deletions

View File

@ -23457,9 +23457,11 @@ tl_object_ptr<td_api::MessageSendingState> MessagesManager::get_message_sending_
}
if (m->is_failed_to_send) {
auto can_retry = can_resend_message(m);
auto need_another_sender = can_retry && m->send_error_code == 400 && m->send_error_message == CSlice("SEND_AS_PEER_INVALID");
return td_api::make_object<td_api::messageSendingStateFailed>(
m->send_error_code, m->send_error_message, can_retry, need_another_sender, max(m->try_resend_at - Time::now(), 0.0));
auto need_another_sender =
can_retry && m->send_error_code == 400 && m->send_error_message == CSlice("SEND_AS_PEER_INVALID");
return td_api::make_object<td_api::messageSendingStateFailed>(m->send_error_code, m->send_error_message, can_retry,
need_another_sender,
max(m->try_resend_at - Time::now(), 0.0));
}
return nullptr;
}
@ -23669,7 +23671,7 @@ int64 MessagesManager::generate_new_random_id() {
unique_ptr<MessagesManager::Message> MessagesManager::create_message_to_send(
Dialog *d, MessageId top_thread_message_id, MessageId reply_to_message_id, const MessageSendOptions &options,
unique_ptr<MessageContent> &&content, bool suppress_reply_info, unique_ptr<MessageForwardInfo> forward_info,
bool is_copy) const {
bool is_copy, DialogId send_as_dialog_id) const {
CHECK(d != nullptr);
CHECK(!reply_to_message_id.is_scheduled());
CHECK(content != nullptr);
@ -23689,7 +23691,13 @@ unique_ptr<MessagesManager::Message> MessagesManager::create_message_to_send(
}
m->sender_dialog_id = dialog_id;
} else {
if (d->default_send_message_as_dialog_id.is_valid()) {
if (send_as_dialog_id.is_valid()) {
if (send_as_dialog_id.get_type() == DialogType::User) {
m->sender_user_id = send_as_dialog_id.get_user_id();
} else {
m->sender_dialog_id = send_as_dialog_id;
}
} else if (d->default_send_message_as_dialog_id.is_valid()) {
if (d->default_send_message_as_dialog_id.get_type() == DialogType::User) {
m->sender_user_id = my_id;
} else {
@ -23782,11 +23790,11 @@ unique_ptr<MessagesManager::Message> MessagesManager::create_message_to_send(
MessagesManager::Message *MessagesManager::get_message_to_send(
Dialog *d, MessageId top_thread_message_id, MessageId reply_to_message_id, const MessageSendOptions &options,
unique_ptr<MessageContent> &&content, bool *need_update_dialog_pos, bool suppress_reply_info,
unique_ptr<MessageForwardInfo> forward_info, bool is_copy) {
unique_ptr<MessageForwardInfo> forward_info, bool is_copy, DialogId send_as_dialog_id) {
d->was_opened = true;
auto message = create_message_to_send(d, top_thread_message_id, reply_to_message_id, options, std::move(content),
suppress_reply_info, std::move(forward_info), is_copy);
suppress_reply_info, std::move(forward_info), is_copy, send_as_dialog_id);
MessageId message_id = options.schedule_date != 0 ? get_next_yet_unsent_scheduled_message_id(d, options.schedule_date)
: get_next_yet_unsent_message_id(d);
@ -27110,7 +27118,8 @@ Result<td_api::object_ptr<td_api::messages>> MessagesManager::forward_messages(
Message *m;
if (only_preview) {
message = create_message_to_send(to_dialog, MessageId(), MessageId(), message_send_options, std::move(content),
j + 1 != forwarded_message_contents.size(), std::move(forward_info), false);
j + 1 != forwarded_message_contents.size(), std::move(forward_info), false,
DialogId());
MessageId new_message_id =
message_send_options.schedule_date != 0
? get_next_yet_unsent_scheduled_message_id(to_dialog, message_send_options.schedule_date)
@ -27145,9 +27154,9 @@ Result<td_api::object_ptr<td_api::messages>> MessagesManager::forward_messages(
unique_ptr<Message> message;
Message *m;
if (only_preview) {
message =
create_message_to_send(to_dialog, copied_message.top_thread_message_id, copied_message.reply_to_message_id,
message_send_options, std::move(copied_message.content), false, nullptr, true);
message = create_message_to_send(to_dialog, copied_message.top_thread_message_id,
copied_message.reply_to_message_id, message_send_options,
std::move(copied_message.content), false, nullptr, true, DialogId());
MessageId new_message_id =
message_send_options.schedule_date != 0
? get_next_yet_unsent_scheduled_message_id(to_dialog, message_send_options.schedule_date)
@ -27267,12 +27276,15 @@ Result<vector<MessageId>> MessagesManager::resend_messages(DialogId dialog_id, v
CHECK(message != nullptr);
send_update_delete_messages(dialog_id, {message->message_id.get()}, true, false);
auto need_another_sender =
message->send_error_code == 400 && message->send_error_message == CSlice("SEND_AS_PEER_INVALID");
MessageSendOptions options(message->disable_notification, message->from_background,
get_message_schedule_date(message.get()));
Message *m = get_message_to_send(
d, message->top_thread_message_id,
get_reply_to_message_id(d, message->top_thread_message_id, message->reply_to_message_id, false), options,
std::move(new_contents[i]), &need_update_dialog_pos, false, nullptr, message->is_copy);
std::move(new_contents[i]), &need_update_dialog_pos, false, nullptr, message->is_copy,
need_another_sender ? DialogId() : get_message_sender(message.get()));
m->reply_markup = std::move(message->reply_markup);
m->via_bot_user_id = message->via_bot_user_id;
m->disable_web_page_preview = message->disable_web_page_preview;
@ -27281,6 +27293,7 @@ Result<vector<MessageId>> MessagesManager::resend_messages(DialogId dialog_id, v
m->is_content_secret = message->is_content_secret;
m->media_album_id = new_media_album_ids[message->media_album_id].first;
m->send_emoji = message->send_emoji;
m->has_explicit_sender |= message->has_explicit_sender;
save_send_message_log_event(dialog_id, m);
do_send_message(dialog_id, m);

View File

@ -1815,12 +1815,13 @@ class MessagesManager final : public Actor {
unique_ptr<Message> create_message_to_send(Dialog *d, MessageId top_thread_message_id, MessageId reply_to_message_id,
const MessageSendOptions &options, unique_ptr<MessageContent> &&content,
bool suppress_reply_info, unique_ptr<MessageForwardInfo> forward_info,
bool is_copy) const;
bool is_copy, DialogId send_as_dialog_id) const;
Message *get_message_to_send(Dialog *d, MessageId top_thread_message_id, MessageId reply_to_message_id,
const MessageSendOptions &options, unique_ptr<MessageContent> &&content,
bool *need_update_dialog_pos, bool suppress_reply_info = false,
unique_ptr<MessageForwardInfo> forward_info = nullptr, bool is_copy = false);
unique_ptr<MessageForwardInfo> forward_info = nullptr, bool is_copy = false,
DialogId sender_dialog_id = DialogId());
int64 begin_send_message(DialogId dialog_id, const Message *m);