diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index a69d0e5c6..34f6d2ad2 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -5418,7 +5418,7 @@ toggleSupergroupIsAllHistoryAvailable supergroup_id:int53 is_all_history_availab //@description Upgrades supergroup to a broadcast group; requires owner privileges in the supergroup @supergroup_id Identifier of the supergroup toggleSupergroupIsBroadcastGroup supergroup_id:int53 = Ok; -//@description Reports some messages from a message sender in a supergroup as spam; requires administrator rights in the supergroup @supergroup_id Supergroup identifier @message_ids Identifiers of messages sent in the supergroup. All messages must be sent by the same sender. This list must be non-empty +//@description Reports messages in a supergroup as spam; requires administrator rights in the supergroup @supergroup_id Supergroup identifier @message_ids Identifiers of messages to report reportSupergroupSpam supergroup_id:int53 message_ids:vector = Ok; //@description Returns information about members or banned users in a supergroup or channel. Can be used only if supergroupFullInfo.can_get_members == true; additionally, administrator privileges may be required for some filters @supergroup_id Identifier of the supergroup or channel diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index 5579d20e4..654056843 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -6666,12 +6666,7 @@ void ContactsManager::report_channel_spam(ChannelId channel_id, const vector server_message_ids; + std::unordered_map, DialogIdHash> server_message_ids; for (auto &message_id : message_ids) { if (message_id.is_valid_scheduled()) { return promise.set_error(Status::Error(400, "Can't report scheduled messages")); @@ -6685,35 +6680,25 @@ void ContactsManager::report_channel_spam(ChannelId channel_id, const vectormessages_manager_->get_dialog_message_sender({DialogId(channel_id), message_id}); - if (!current_sender_dialog_id.is_valid()) { - continue; + auto sender_dialog_id = td_->messages_manager_->get_dialog_message_sender({DialogId(channel_id), message_id}); + if (sender_dialog_id.is_valid() && sender_dialog_id != DialogId(get_my_id()) && + td_->messages_manager_->have_input_peer(sender_dialog_id, AccessRights::Know)) { + server_message_ids[sender_dialog_id].push_back(message_id); } - if (sender_dialog_id.is_valid()) { - if (current_sender_dialog_id != sender_dialog_id) { - return promise.set_error(Status::Error(400, "All messages nust be from the same sender")); - } - } else { - sender_dialog_id = current_sender_dialog_id; - } - - server_message_ids.push_back(message_id); } if (server_message_ids.empty()) { return promise.set_value(Unit()); } - CHECK(sender_dialog_id.is_valid()); - if (!td_->messages_manager_->have_input_peer(sender_dialog_id, AccessRights::Know)) { - return promise.set_error(Status::Error(400, "Have no access to the user")); - } - if (sender_dialog_id == DialogId(get_my_id())) { - return promise.set_error(Status::Error(400, "Can't report self")); + MultiPromiseActorSafe mpas{"ReportSupergroupSpamMultiPromiseActor"}; + mpas.add_promise(std::move(promise)); + auto lock_promise = mpas.get_promise(); + + for (auto &it : server_message_ids) { + td_->create_handler(mpas.get_promise())->send(channel_id, it.first, it.second); } - td_->create_handler(std::move(promise)) - ->send(channel_id, sender_dialog_id, server_message_ids); + lock_promise.set_value(Unit()); } void ContactsManager::delete_chat(ChatId chat_id, Promise &&promise) {