diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index e9f5ca63d..415f101ba 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -6799,12 +6799,19 @@ getChatFilterDefaultIconName filter:chatFilter = Text; //@description Creates a new invite link for a chat filter. A link can be created for a filter if it has only pinned and included chats //@chat_filter_id Chat filter identifier //@name Name of the link; 0-32 characters -//@chat_ids Identifiers of basic group, supergroup, or channel chats to be accessible by the invite link. The chats must be public, or the user must be able to invite new members by an invite link. Basic groups will be automatically converted to supergroups before link creation +//@chat_ids Identifiers of basic group, supergroup, or channel chats to be accessible by the invite link. The chats must be public, or the user must be able to invite new members to them by an invite link. Basic groups will be automatically converted to supergroups before link creation createChatFilterInviteLink chat_filter_id:int32 name:string chat_ids:vector = ChatFilterInviteLink; //@description Returns invite links created by the current user for a shareable chat filter @chat_filter_id Chat filter identifier getChatFilterInviteLinks chat_filter_id:int32 = ChatFilterInviteLinks; +//@description Edits an invite link for a chat filter +//@chat_filter_id Chat filter identifier +//@invite_link Invite link to be edited +//@name New name of the link; 0-32 characters +//@chat_ids New identifiers of basic group, supergroup, or channel chats to be accessible by the invite link. The chats must be public, or the user must be able to invite new members to them by an invite link. Basic groups will be automatically converted to supergroups before link editing +editChatFilterInviteLink chat_filter_id:int32 invite_link:string name:string chat_ids:vector = ChatFilterInviteLink; + //@description Changes the chat title. Supported only for basic groups, supergroups and channels. Requires can_change_info administrator right //@chat_id Chat identifier diff --git a/td/telegram/DialogFilterManager.cpp b/td/telegram/DialogFilterManager.cpp index d50a73a34..156ef3c5e 100644 --- a/td/telegram/DialogFilterManager.cpp +++ b/td/telegram/DialogFilterManager.cpp @@ -188,6 +188,38 @@ class GetExportedChatlistInvitesQuery final : public Td::ResultHandler { } }; +class EditExportedChatlistInviteQuery final : public Td::ResultHandler { + Promise> promise_; + + public: + explicit EditExportedChatlistInviteQuery(Promise> &&promise) + : promise_(std::move(promise)) { + } + + void send(DialogFilterId dialog_filter_id, const string &slug, const string &title, + vector> &&input_peers) { + int32 flags = + telegram_api::chatlists_editExportedInvite::TITLE_MASK | telegram_api::chatlists_editExportedInvite::PEERS_MASK; + send_query(G()->net_query_creator().create(telegram_api::chatlists_editExportedInvite( + flags, dialog_filter_id.get_input_chatlist(), slug, title, std::move(input_peers)))); + } + + 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 EditExportedChatlistInviteQuery: " << to_string(ptr); + promise_.set_value(DialogFilterInviteLink(td_, std::move(ptr)).get_chat_filter_invite_link_object()); + } + + void on_error(Status status) final { + promise_.set_error(std::move(status)); + } +}; + class GetDialogsQuery final : public Td::ResultHandler { Promise promise_; bool is_single_ = false; @@ -1526,6 +1558,29 @@ void DialogFilterManager::get_dialog_filter_invite_links( td_->create_handler(std::move(promise))->send(dialog_filter_id); } +void DialogFilterManager::edit_dialog_filter_invite_link( + DialogFilterId dialog_filter_id, string invite_link, string invite_link_name, vector dialog_ids, + 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")); + } + vector> input_peers; + input_peers.reserve(dialog_ids.size()); + for (auto &dialog_id : dialog_ids) { + auto input_peer = td_->messages_manager_->get_input_peer(dialog_id, AccessRights::Write); + if (input_peer == nullptr) { + return promise.set_error(Status::Error(400, "Have no access to the chat")); + } + input_peers.push_back(std::move(input_peer)); + } + if (input_peers.empty()) { + return promise.set_error(Status::Error(400, "At least one chat must be included")); + } + td_->create_handler(std::move(promise)) + ->send(dialog_filter_id, invite_link, invite_link_name, std::move(input_peers)); +} + void DialogFilterManager::get_current_state(vector> &updates) const { if (have_dialog_filters()) { updates.push_back(get_update_chat_filters_object()); diff --git a/td/telegram/DialogFilterManager.h b/td/telegram/DialogFilterManager.h index 419500e29..542a8472e 100644 --- a/td/telegram/DialogFilterManager.h +++ b/td/telegram/DialogFilterManager.h @@ -79,6 +79,10 @@ class DialogFilterManager final : public Actor { void get_dialog_filter_invite_links(DialogFilterId dialog_filter_id, Promise> promise); + void edit_dialog_filter_invite_link(DialogFilterId dialog_filter_id, string invite_link, string invite_link_name, + vector dialog_ids, + Promise> promise); + void on_get_dialog_filter(telegram_api::object_ptr filter); void get_recommended_dialog_filters(Promise> &&promise); diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index c53a00cf0..8d0041e4b 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -6167,6 +6167,16 @@ void Td::on_request(uint64 id, td_api::getChatFilterInviteLinks &request) { dialog_filter_manager_->get_dialog_filter_invite_links(DialogFilterId(request.chat_filter_id_), std::move(promise)); } +void Td::on_request(uint64 id, td_api::editChatFilterInviteLink &request) { + CHECK_IS_USER(); + CLEAN_INPUT_STRING(request.invite_link_); + CLEAN_INPUT_STRING(request.name_); + CREATE_REQUEST_PROMISE(); + dialog_filter_manager_->edit_dialog_filter_invite_link( + DialogFilterId(request.chat_filter_id_), std::move(request.invite_link_), std::move(request.name_), + DialogId::get_dialog_ids(request.chat_ids_), std::move(promise)); +} + void Td::on_request(uint64 id, td_api::setChatTitle &request) { CLEAN_INPUT_STRING(request.title_); CREATE_OK_REQUEST_PROMISE(); diff --git a/td/telegram/Td.h b/td/telegram/Td.h index 0d865d318..4236008e4 100644 --- a/td/telegram/Td.h +++ b/td/telegram/Td.h @@ -929,6 +929,8 @@ class Td final : public Actor { void on_request(uint64 id, td_api::getChatFilterInviteLinks &request); + void on_request(uint64 id, td_api::editChatFilterInviteLink &request); + void on_request(uint64 id, td_api::setChatTitle &request); void on_request(uint64 id, const td_api::setChatPhoto &request); diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index abfb2e4ab..255c26d9f 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -4597,6 +4597,14 @@ class CliClient final : public Actor { ChatFilterId chat_filter_id; get_args(args, chat_filter_id); send_request(td_api::make_object(chat_filter_id)); + } else if (op == "ecfil") { + ChatFilterId chat_filter_id; + string invite_link; + string name; + string chat_ids; + get_args(args, chat_filter_id, invite_link, name, chat_ids); + send_request(td_api::make_object(chat_filter_id, invite_link, name, + as_chat_ids(chat_ids))); } else if (op == "grcf") { send_request(td_api::make_object()); } else if (op == "gcfdin") {