From 6198a6a842e09b79d9dfbf3c577a1f732b593c3c Mon Sep 17 00:00:00 2001 From: levlam Date: Sun, 2 Apr 2023 12:40:57 +0300 Subject: [PATCH] Add td_api::getChatFilterChatsToLeave. --- td/generate/scheme/td_api.tl | 3 ++ td/telegram/DialogFilterManager.cpp | 68 +++++++++++++++++++++++++++++ td/telegram/DialogFilterManager.h | 7 +++ td/telegram/Td.cpp | 7 +++ td/telegram/Td.h | 2 + td/telegram/cli.cpp | 4 ++ 6 files changed, 91 insertions(+) diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 5956e2ef6..ccf4badb4 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -6797,6 +6797,9 @@ editChatFilter chat_filter_id:int32 filter:chatFilter = ChatFilterInfo; //@description Deletes existing chat filter @chat_filter_id Chat filter identifier @leave_chat_ids Identifiers of the chats to leave. The chats must be pinned or always included by the filter deleteChatFilter chat_filter_id:int32 leave_chat_ids:vector = Ok; +//@description Returns identifiers of pinned or always included chats from a chat filter, which are suggested to be left when the chat filter is deleted @chat_filter_id Chat filter identifier +getChatFilterChatsToLeave chat_filter_id:int32 = Chats; + //@description Changes the order of chat filters @chat_filter_ids Identifiers of chat filters in the new correct order @main_chat_list_position Position of the main chat list among chat filters, 0-based. Can be non-zero only for Premium users reorderChatFilters chat_filter_ids:vector main_chat_list_position:int32 = Ok; diff --git a/td/telegram/DialogFilterManager.cpp b/td/telegram/DialogFilterManager.cpp index 36ea9c68c..52a40063b 100644 --- a/td/telegram/DialogFilterManager.cpp +++ b/td/telegram/DialogFilterManager.cpp @@ -278,6 +278,35 @@ class LeaveChatlistQuery final : public Td::ResultHandler { } }; +class GetLeaveChatlistSuggestionsQuery final : public Td::ResultHandler { + Promise>> promise_; + + public: + explicit GetLeaveChatlistSuggestionsQuery(Promise>> &&promise) + : promise_(std::move(promise)) { + } + + void send(DialogFilterId dialog_filter_id) { + send_query(G()->net_query_creator().create( + telegram_api::chatlists_getLeaveChatlistSuggestions(dialog_filter_id.get_input_chatlist()))); + } + + void on_result(BufferSlice packet) final { + auto result_ptr = fetch_result(packet); + if (result_ptr.is_error()) { + return on_error(result_ptr.move_as_error()); + } + + auto ptr = result_ptr.move_as_ok(); + LOG(INFO) << "Receive result for GetLeaveChatlistSuggestionsQuery: " << to_string(ptr); + promise_.set_value(std::move(ptr)); + } + + void on_error(Status status) final { + promise_.set_error(std::move(status)); + } +}; + class CheckChatlistInviteQuery final : public Td::ResultHandler { Promise> promise_; string invite_link_; @@ -1525,6 +1554,45 @@ void DialogFilterManager::on_delete_dialog_filter(DialogFilterId dialog_filter_i synchronize_dialog_filters(); } +void DialogFilterManager::get_leave_dialog_filter_suggestions(DialogFilterId dialog_filter_id, + Promise> &&promise) { + auto dialog_filter = get_dialog_filter(dialog_filter_id); + if (dialog_filter == nullptr) { + return promise.set_error(Status::Error(400, "Chat folder not found")); + } + if (!dialog_filter->is_shareable()) { + return promise.set_value(td_api::make_object()); + } + auto query_promise = + PromiseCreator::lambda([actor_id = actor_id(this), dialog_filter_id, promise = std::move(promise)]( + Result>> &&result) mutable { + if (result.is_error()) { + return promise.set_error(result.move_as_error()); + } + send_closure(actor_id, &DialogFilterManager::on_get_leave_dialog_filter_suggestions, dialog_filter_id, + result.move_as_ok(), std::move(promise)); + }); + td_->create_handler(std::move(query_promise))->send(dialog_filter_id); +} + +void DialogFilterManager::on_get_leave_dialog_filter_suggestions( + DialogFilterId dialog_filter_id, vector> peers, + Promise> &&promise) { + TRY_STATUS_PROMISE(promise, G()->close_status()); + + auto dialog_filter = get_dialog_filter(dialog_filter_id); + if (dialog_filter == nullptr) { + return promise.set_error(Status::Error(400, "Chat folder not found")); + } + if (!dialog_filter->is_shareable()) { + return promise.set_value(td_api::make_object()); + } + + auto dialog_ids = td_->messages_manager_->get_peers_dialog_ids(std::move(peers)); + td::remove_if(dialog_ids, [&](DialogId dialog_id) { return !dialog_filter->is_dialog_included(dialog_id); }); + promise.set_value(MessagesManager::get_chats_object(-1, dialog_ids)); +} + void DialogFilterManager::reorder_dialog_filters(vector dialog_filter_ids, int32 main_dialog_list_position, Promise &&promise) { CHECK(!td_->auth_manager_->is_bot()); diff --git a/td/telegram/DialogFilterManager.h b/td/telegram/DialogFilterManager.h index 066a4090c..52ff42182 100644 --- a/td/telegram/DialogFilterManager.h +++ b/td/telegram/DialogFilterManager.h @@ -68,6 +68,9 @@ class DialogFilterManager final : public Actor { void delete_dialog_filter(DialogFilterId dialog_filter_id, vector leave_dialog_ids, Promise &&promise); + void get_leave_dialog_filter_suggestions(DialogFilterId dialog_filter_id, + Promise> &&promise); + void reorder_dialog_filters(vector dialog_filter_ids, int32 main_dialog_list_position, Promise &&promise); @@ -156,6 +159,10 @@ class DialogFilterManager final : public Actor { void on_delete_dialog_filter(DialogFilterId dialog_filter_id, Status result); + void on_get_leave_dialog_filter_suggestions(DialogFilterId dialog_filter_id, + vector> peers, + Promise> &&promise); + void reorder_dialog_filters_on_server(vector dialog_filter_ids, int32 main_dialog_list_position); void on_reorder_dialog_filters(vector dialog_filter_ids, int32 main_dialog_list_position, diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index e1c4485a7..1d62ca43d 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -6145,6 +6145,13 @@ void Td::on_request(uint64 id, const td_api::deleteChatFilter &request) { DialogId::get_dialog_ids(request.leave_chat_ids_), std::move(promise)); } +void Td::on_request(uint64 id, const td_api::getChatFilterChatsToLeave &request) { + CHECK_IS_USER(); + CREATE_REQUEST_PROMISE(); + dialog_filter_manager_->get_leave_dialog_filter_suggestions(DialogFilterId(request.chat_filter_id_), + std::move(promise)); +} + void Td::on_request(uint64 id, const td_api::reorderChatFilters &request) { CHECK_IS_USER(); CREATE_OK_REQUEST_PROMISE(); diff --git a/td/telegram/Td.h b/td/telegram/Td.h index 9264dbe2a..5bea6133f 100644 --- a/td/telegram/Td.h +++ b/td/telegram/Td.h @@ -923,6 +923,8 @@ class Td final : public Actor { void on_request(uint64 id, const td_api::deleteChatFilter &request); + void on_request(uint64 id, const td_api::getChatFilterChatsToLeave &request); + void on_request(uint64 id, const td_api::reorderChatFilters &request); void on_request(uint64 id, td_api::createChatFilterInviteLink &request); diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index 71c5fb295..a33f51d49 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -4581,6 +4581,10 @@ class CliClient final : public Actor { string chat_ids; get_args(args, chat_filter_id, chat_ids); send_request(td_api::make_object(chat_filter_id, as_chat_ids(chat_ids))); + } else if (op == "gcfctl") { + ChatFilterId chat_filter_id; + get_args(args, chat_filter_id); + send_request(td_api::make_object(chat_filter_id)); } else if (op == "rcf") { int32 main_chat_list_position; string chat_filter_ids;