diff --git a/td/telegram/MessageOrigin.cpp b/td/telegram/MessageOrigin.cpp index 34654d443..a55597e1d 100644 --- a/td/telegram/MessageOrigin.cpp +++ b/td/telegram/MessageOrigin.cpp @@ -103,6 +103,13 @@ bool MessageOrigin::is_sender_hidden() const { return sender_dialog_id_ == hidden_sender_dialog_id && !author_signature_.empty() && !message_id_.is_valid(); } +MessageFullId MessageOrigin::get_message_full_id() const { + if (!message_id_.is_valid() || !sender_dialog_id_.is_valid() || is_sender_hidden()) { + return MessageFullId(); + } + return {sender_dialog_id_, message_id_}; +} + DialogId MessageOrigin::get_sender() const { if (is_sender_hidden()) { return DialogId(); diff --git a/td/telegram/MessageOrigin.h b/td/telegram/MessageOrigin.h index b753348bd..27f176be7 100644 --- a/td/telegram/MessageOrigin.h +++ b/td/telegram/MessageOrigin.h @@ -8,6 +8,7 @@ #include "td/telegram/ChannelId.h" #include "td/telegram/DialogId.h" +#include "td/telegram/MessageFullId.h" #include "td/telegram/MessageId.h" #include "td/telegram/td_api.h" #include "td/telegram/telegram_api.h" @@ -48,6 +49,8 @@ struct MessageOrigin { bool is_sender_hidden() const; + MessageFullId get_message_full_id() const; + bool is_channel_post() const { return message_id_.is_valid(); } diff --git a/td/telegram/MessageOrigin.hpp b/td/telegram/MessageOrigin.hpp index 96848932c..6239db6ce 100644 --- a/td/telegram/MessageOrigin.hpp +++ b/td/telegram/MessageOrigin.hpp @@ -63,6 +63,7 @@ void MessageOrigin::parse(ParserT &parser) { } if (has_sender_dialog_id) { td::parse(sender_dialog_id_, parser); + CHECK(sender_dialog_id_.get_type() == DialogType::Channel); } if (has_message_id) { td::parse(message_id_, parser); diff --git a/td/telegram/MessagesManager.cpp b/td/telegram/MessagesManager.cpp index d78c1fbb8..f26db7ab0 100644 --- a/td/telegram/MessagesManager.cpp +++ b/td/telegram/MessagesManager.cpp @@ -18460,10 +18460,12 @@ Status MessagesManager::can_get_media_timestamp_link(DialogId dialog_id, const M if (dialog_id.get_type() != DialogType::Channel) { auto forward_info = m->forward_info.get(); if (!can_message_content_have_media_timestamp(m->content.get()) || forward_info == nullptr || - forward_info->is_imported || is_forward_info_sender_hidden(forward_info) || - !forward_info->origin.message_id_.is_valid() || !m->forward_info->origin.message_id_.is_server() || - !forward_info->origin.sender_dialog_id_.is_valid() || - forward_info->origin.sender_dialog_id_.get_type() != DialogType::Channel) { + forward_info->is_imported) { + return Status::Error(400, "Message links are available only for messages in supergroups and channel chats"); + } + auto origin_message_full_id = forward_info->origin.get_message_full_id(); + auto origin_message_id = origin_message_full_id.get_message_id(); + if (!origin_message_id.is_valid() || !origin_message_id.is_server()) { return Status::Error(400, "Message links are available only for messages in supergroups and channel chats"); } return Status::OK(); @@ -18525,13 +18527,14 @@ Result> MessagesManager::get_message_link(MessageFullId auto message_id = m->message_id; if (dialog_id.get_type() != DialogType::Channel) { CHECK(m->forward_info != nullptr); - CHECK(m->forward_info->origin.sender_dialog_id_.get_type() == DialogType::Channel); - dialog_id = m->forward_info->origin.sender_dialog_id_; - message_id = m->forward_info->origin.message_id_; + auto origin_message_full_id = m->forward_info->origin.get_message_full_id(); + dialog_id = origin_message_full_id.get_dialog_id(); + message_id = origin_message_full_id.get_message_id(); + CHECK(dialog_id.get_type() == DialogType::Channel); for_group = false; in_message_thread = false; - auto channel_message = get_message({dialog_id, message_id}); + auto channel_message = get_message(origin_message_full_id); if (channel_message != nullptr && channel_message->media_album_id == 0) { for_group = true; // default is true } @@ -38875,20 +38878,26 @@ void MessagesManager::update_top_dialogs(DialogId dialog_id, const Message *m) { } void MessagesManager::update_forward_count(DialogId dialog_id, const Message *m) { - if (!td_->auth_manager_->is_bot() && m->forward_info != nullptr && - m->forward_info->origin.sender_dialog_id_.is_valid() && m->forward_info->origin.message_id_.is_valid() && - (!is_discussion_message(dialog_id, m) || - m->forward_info->origin.sender_dialog_id_ != m->forward_info->from_dialog_id || - m->forward_info->origin.message_id_ != m->forward_info->from_message_id)) { - update_forward_count(m->forward_info->origin.sender_dialog_id_, m->forward_info->origin.message_id_, m->date); + if (td_->auth_manager_->is_bot() || m->forward_info == nullptr) { + return; } + auto origin_message_full_id = m->forward_info->origin.get_message_full_id(); + if (!origin_message_full_id.get_message_id().is_valid()) { + return; + } + if (is_discussion_message(dialog_id, m) && + origin_message_full_id == MessageFullId(m->forward_info->from_dialog_id, m->forward_info->from_message_id)) { + return; + } + update_forward_count(origin_message_full_id, m->date); } -void MessagesManager::update_forward_count(DialogId dialog_id, MessageId message_id, int32 update_date) { +void MessagesManager::update_forward_count(MessageFullId message_full_id, int32 update_date) { CHECK(!td_->auth_manager_->is_bot()); + auto dialog_id = message_full_id.get_dialog_id(); Dialog *d = get_dialog(dialog_id); CHECK(d != nullptr); - Message *m = get_message_force(d, message_id, "update_forward_count"); + Message *m = get_message_force(d, message_full_id.get_message_id(), "update_forward_count"); if (m != nullptr && !m->message_id.is_scheduled() && m->message_id.is_server() && m->view_count > 0 && m->interaction_info_update_date < update_date) { if (m->forward_count == 0) { diff --git a/td/telegram/MessagesManager.h b/td/telegram/MessagesManager.h index 57b247702..e424719ff 100644 --- a/td/telegram/MessagesManager.h +++ b/td/telegram/MessagesManager.h @@ -3140,7 +3140,7 @@ class MessagesManager final : public Actor { void update_forward_count(DialogId dialog_id, const Message *m); - void update_forward_count(DialogId dialog_id, MessageId message_id, int32 update_date); + void update_forward_count(MessageFullId message_full_id, int32 update_date); void update_has_outgoing_messages(DialogId dialog_id, const Message *m);