diff --git a/td/generate/scheme/td_api.tl b/td/generate/scheme/td_api.tl index 2c4c02c97..2bd065098 100644 --- a/td/generate/scheme/td_api.tl +++ b/td/generate/scheme/td_api.tl @@ -4942,6 +4942,12 @@ joinChatByInviteLink invite_link:string = Chat; //@limit The maximum number of chat join requests to return getChatJoinRequests chat_id:int53 invite_link:string query:string offset_request:chatJoinRequest limit:int32 = ChatJoinRequests; +//@description Approves pending join request in a chat @chat_id Chat identifier @user_id Identifier of the user, which request will be approved +approveChatJoinRequest chat_id:int53 user_id:int53 = Ok; + +//@description Declines pending join request in a chat @chat_id Chat identifier @user_id Identifier of the user, which request will be declined +declineChatJoinRequest chat_id:int53 user_id:int53 = Ok; + //@description Creates a new call @user_id Identifier of the user to be called @protocol Description of the call protocols supported by the application @is_video True, if a video call needs to be created createCall user_id:int53 protocol:callProtocol is_video:Bool = CallId; diff --git a/td/telegram/ContactsManager.cpp b/td/telegram/ContactsManager.cpp index 942bde066..beb963220 100644 --- a/td/telegram/ContactsManager.cpp +++ b/td/telegram/ContactsManager.cpp @@ -2023,6 +2023,51 @@ class GetChatJoinRequestsQuery final : public Td::ResultHandler { } }; +class HideChatJoinRequestQuery final : public Td::ResultHandler { + Promise promise_; + DialogId dialog_id_; + + public: + explicit HideChatJoinRequestQuery(Promise &&promise) : promise_(std::move(promise)) { + } + + void send(DialogId dialog_id, UserId user_id, bool is_approved) { + dialog_id_ = dialog_id; + auto input_peer = td->messages_manager_->get_input_peer(dialog_id, AccessRights::Write); + if (input_peer == nullptr) { + return on_error(0, Status::Error(400, "Can't access the chat")); + } + + auto input_user = td->contacts_manager_->get_input_user(user_id); + if (input_user == nullptr) { + return on_error(0, Status::Error(400, "Can't find user")); + } + + int32 flags = 0; + if (is_approved) { + flags |= telegram_api::messages_hideChatJoinRequest::APPROVED_MASK; + } + send_query(G()->net_query_creator().create(telegram_api::messages_hideChatJoinRequest( + flags, false /*ignored*/, std::move(input_peer), std::move(input_user)))); + } + + void on_result(uint64 id, BufferSlice packet) final { + auto result_ptr = fetch_result(packet); + if (result_ptr.is_error()) { + return on_error(id, result_ptr.move_as_error()); + } + + auto result = result_ptr.move_as_ok(); + LOG(INFO) << "Receive result for HideChatJoinRequestQuery: " << to_string(result); + td->updates_manager_->on_get_updates(std::move(result), std::move(promise_)); + } + + void on_error(uint64 id, Status status) final { + td->messages_manager_->on_get_dialog_error(dialog_id_, status, "HideChatJoinRequestQuery"); + promise_.set_error(std::move(status)); + } +}; + class RevokeChatInviteLinkQuery final : public Td::ResultHandler { Promise> promise_; DialogId dialog_id_; @@ -7503,6 +7548,12 @@ void ContactsManager::get_dialog_join_requests(DialogId dialog_id, const string ->send(dialog_id, invite_link, query, offset_date, offset_user_id, limit); } +void ContactsManager::process_dialog_join_requests(DialogId dialog_id, UserId user_id, bool is_approved, + Promise &&promise) { + TRY_STATUS_PROMISE(promise, can_manage_dialog_invite_links(dialog_id)); + td_->create_handler(std::move(promise))->send(dialog_id, user_id, is_approved); +} + void ContactsManager::revoke_dialog_invite_link(DialogId dialog_id, const string &invite_link, Promise> &&promise) { TRY_STATUS_PROMISE(promise, can_manage_dialog_invite_links(dialog_id)); diff --git a/td/telegram/ContactsManager.h b/td/telegram/ContactsManager.h index 111a1e638..a3e549a9b 100644 --- a/td/telegram/ContactsManager.h +++ b/td/telegram/ContactsManager.h @@ -408,6 +408,8 @@ class ContactsManager final : public Actor { td_api::object_ptr offset_request, int32 limit, Promise> &&promise); + void process_dialog_join_requests(DialogId dialog_id, UserId user_id, bool is_approved, Promise &&promise); + void revoke_dialog_invite_link(DialogId dialog_id, const string &link, Promise> &&promise); diff --git a/td/telegram/Td.cpp b/td/telegram/Td.cpp index 42f267c0e..ca2d8bbbb 100644 --- a/td/telegram/Td.cpp +++ b/td/telegram/Td.cpp @@ -6341,6 +6341,18 @@ void Td::on_request(uint64 id, td_api::getChatJoinRequests &request) { std::move(request.offset_request_), request.limit_, std::move(promise)); } +void Td::on_request(uint64 id, const td_api::approveChatJoinRequest &request) { + CREATE_OK_REQUEST_PROMISE(); + contacts_manager_->process_dialog_join_requests(DialogId(request.chat_id_), UserId(request.user_id_), true, + std::move(promise)); +} + +void Td::on_request(uint64 id, const td_api::declineChatJoinRequest &request) { + CREATE_OK_REQUEST_PROMISE(); + contacts_manager_->process_dialog_join_requests(DialogId(request.chat_id_), UserId(request.user_id_), false, + std::move(promise)); +} + void Td::on_request(uint64 id, td_api::revokeChatInviteLink &request) { CLEAN_INPUT_STRING(request.invite_link_); CREATE_REQUEST_PROMISE(); diff --git a/td/telegram/Td.h b/td/telegram/Td.h index de63f13bc..964a71d8d 100644 --- a/td/telegram/Td.h +++ b/td/telegram/Td.h @@ -872,6 +872,10 @@ class Td final : public Actor { void on_request(uint64 id, td_api::getChatJoinRequests &request); + void on_request(uint64 id, const td_api::approveChatJoinRequest &request); + + void on_request(uint64 id, const td_api::declineChatJoinRequest &request); + void on_request(uint64 id, td_api::revokeChatInviteLink &request); void on_request(uint64 id, td_api::deleteRevokedChatInviteLink &request); diff --git a/td/telegram/cli.cpp b/td/telegram/cli.cpp index b930c080f..d90918443 100644 --- a/td/telegram/cli.cpp +++ b/td/telegram/cli.cpp @@ -2998,6 +2998,16 @@ class CliClient final : public Actor { as_chat_id(chat_id), invite_link, query, td_api::make_object(as_user_id(offset_user_id), offset_date, string()), as_limit(limit))); + } else if (op == "acjr") { + string chat_id; + string user_id; + get_args(args, chat_id, user_id); + send_request(td_api::make_object(as_chat_id(chat_id), as_user_id(user_id))); + } else if (op == "dcjr") { + string chat_id; + string user_id; + get_args(args, chat_id, user_id); + send_request(td_api::make_object(as_chat_id(chat_id), as_user_id(user_id))); } else if (op == "drcil") { string chat_id; string invite_link;