Add td_api::getChatJoinRequests.

This commit is contained in:
levlam 2021-10-13 22:33:31 +03:00
parent 90fea23dd7
commit 1a7f4b4d3e
6 changed files with 132 additions and 0 deletions

View File

@ -599,6 +599,12 @@ chatInviteLinkMembers total_count:int32 members:vector<chatInviteLinkMember> = C
//@is_public True, if the chat is a public supergroup or channel, i.e. it has a username or it is a location-based supergroup
chatInviteLinkInfo chat_id:int53 accessible_for:int32 type:ChatType title:string photo:chatPhotoInfo description:string member_count:int32 member_user_ids:vector<int53> requires_approval:Bool is_public:Bool = ChatInviteLinkInfo;
//@description Describes a user waiting administrator approval to join a chat @user_id User identifier @request_date Point in time (Unix timestamp) when the user sent the chat join request @bio A short bio of the user
chatJoinRequest user_id:int53 request_date:int32 bio:string = ChatJoinRequest;
//@description Contains a list of chat join requests @total_count Approximate total count of requests found @requests List of the requests
chatJoinRequests total_count:int32 requests:vector<chatJoinRequest> = ChatJoinRequests;
//@description Represents a basic group of 0-200 users (must be upgraded to a supergroup to accommodate more than 200 users)
//@id Group identifier
@ -4928,6 +4934,14 @@ checkChatInviteLink invite_link:string = ChatInviteLinkInfo;
//@description Uses an invite link to add the current user to the chat if possible @invite_link Invite link to use
joinChatByInviteLink invite_link:string = Chat;
//@description Returns pending join requests in a chat
//@chat_id Chat identifier
//@invite_link Invite link for which to return join requests. If empty, all join requests will be returned. Requires administrator privileges and can_invite_users right in the chat for own links and owner privileges for other links
//@query A query to search for in the first names, last names and usernames of the users to return
//@offset_request A chat join request from which to return next requests; pass null to get results from the beginning
//@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 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;

View File

@ -1952,6 +1952,77 @@ class GetChatInviteImportersQuery final : public Td::ResultHandler {
}
};
class GetChatJoinRequestsQuery final : public Td::ResultHandler {
Promise<td_api::object_ptr<td_api::chatJoinRequests>> promise_;
DialogId dialog_id_;
public:
explicit GetChatJoinRequestsQuery(Promise<td_api::object_ptr<td_api::chatJoinRequests>> &&promise)
: promise_(std::move(promise)) {
}
void send(DialogId dialog_id, const string &invite_link, const string &query, int32 offset_date,
UserId offset_user_id, int32 limit) {
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(offset_user_id);
if (input_user == nullptr) {
input_user = make_tl_object<telegram_api::inputUserEmpty>();
}
int32 flags = telegram_api::messages_getChatInviteImporters::REQUESTED_MASK;
if (!invite_link.empty()) {
flags |= telegram_api::messages_getChatInviteImporters::LINK_MASK;
}
if (!query.empty()) {
flags |= telegram_api::messages_getChatInviteImporters::Q_MASK;
}
send_query(G()->net_query_creator().create(
telegram_api::messages_getChatInviteImporters(flags, false /*ignored*/, std::move(input_peer), invite_link,
query, offset_date, std::move(input_user), limit)));
}
void on_result(uint64 id, BufferSlice packet) final {
auto result_ptr = fetch_result<telegram_api::messages_getChatInviteImporters>(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 GetChatJoinRequestsQuery: " << to_string(result);
td->contacts_manager_->on_get_users(std::move(result->users_), "GetChatJoinRequestsQuery");
int32 total_count = result->count_;
if (total_count < static_cast<int32>(result->importers_.size())) {
LOG(ERROR) << "Receive wrong total count of join requests " << total_count << " in " << dialog_id_;
total_count = static_cast<int32>(result->importers_.size());
}
vector<td_api::object_ptr<td_api::chatJoinRequest>> join_requests;
for (auto &request : result->importers_) {
UserId user_id(request->user_id_);
UserId approver_user_id(request->approved_by_);
if (!user_id.is_valid() || approver_user_id.is_valid() || !request->requested_) {
LOG(ERROR) << "Receive invalid join request: " << to_string(request);
total_count--;
continue;
}
join_requests.push_back(td_api::make_object<td_api::chatJoinRequest>(
td->contacts_manager_->get_user_id_object(user_id, "chatJoinRequest"), request->date_, request->about_));
}
promise_.set_value(td_api::make_object<td_api::chatJoinRequests>(total_count, std::move(join_requests)));
}
void on_error(uint64 id, Status status) final {
td->messages_manager_->on_get_dialog_error(dialog_id_, status, "GetChatJoinRequestsQuery");
promise_.set_error(std::move(status));
}
};
class RevokeChatInviteLinkQuery final : public Td::ResultHandler {
Promise<td_api::object_ptr<td_api::chatInviteLinks>> promise_;
DialogId dialog_id_;
@ -7412,6 +7483,26 @@ void ContactsManager::get_dialog_invite_link_users(
->send(dialog_id, invite_link, offset_date, offset_user_id, limit);
}
void ContactsManager::get_dialog_join_requests(DialogId dialog_id, const string &invite_link, const string &query,
td_api::object_ptr<td_api::chatJoinRequest> offset_request, int32 limit,
Promise<td_api::object_ptr<td_api::chatJoinRequests>> &&promise) {
TRY_STATUS_PROMISE(promise, can_manage_dialog_invite_links(dialog_id));
if (limit <= 0) {
return promise.set_error(Status::Error(400, "Parameter limit must be positive"));
}
UserId offset_user_id;
int32 offset_date = 0;
if (offset_request != nullptr) {
offset_user_id = UserId(offset_request->user_id_);
offset_date = offset_request->request_date_;
}
td_->create_handler<GetChatJoinRequestsQuery>(std::move(promise))
->send(dialog_id, invite_link, query, offset_date, offset_user_id, limit);
}
void ContactsManager::revoke_dialog_invite_link(DialogId dialog_id, const string &invite_link,
Promise<td_api::object_ptr<td_api::chatInviteLinks>> &&promise) {
TRY_STATUS_PROMISE(promise, can_manage_dialog_invite_links(dialog_id));

View File

@ -404,6 +404,10 @@ class ContactsManager final : public Actor {
td_api::object_ptr<td_api::chatInviteLinkMember> offset_member, int32 limit,
Promise<td_api::object_ptr<td_api::chatInviteLinkMembers>> &&promise);
void get_dialog_join_requests(DialogId dialog_id, const string &invite_link, const string &query,
td_api::object_ptr<td_api::chatJoinRequest> offset_request, int32 limit,
Promise<td_api::object_ptr<td_api::chatJoinRequests>> &&promise);
void revoke_dialog_invite_link(DialogId dialog_id, const string &link,
Promise<td_api::object_ptr<td_api::chatInviteLinks>> &&promise);

View File

@ -6332,6 +6332,15 @@ void Td::on_request(uint64 id, td_api::getChatInviteLinkMembers &request) {
std::move(promise));
}
void Td::on_request(uint64 id, td_api::getChatJoinRequests &request) {
CHECK_IS_USER();
CLEAN_INPUT_STRING(request.invite_link_);
CLEAN_INPUT_STRING(request.query_);
CREATE_REQUEST_PROMISE();
contacts_manager_->get_dialog_join_requests(DialogId(request.chat_id_), request.invite_link_, request.query_,
std::move(request.offset_request_), request.limit_, std::move(promise));
}
void Td::on_request(uint64 id, td_api::revokeChatInviteLink &request) {
CLEAN_INPUT_STRING(request.invite_link_);
CREATE_REQUEST_PROMISE();

View File

@ -870,6 +870,8 @@ class Td final : public Actor {
void on_request(uint64 id, td_api::getChatInviteLinkMembers &request);
void on_request(uint64 id, td_api::getChatJoinRequests &request);
void on_request(uint64 id, td_api::revokeChatInviteLink &request);
void on_request(uint64 id, td_api::deleteRevokedChatInviteLink &request);

View File

@ -2986,6 +2986,18 @@ class CliClient final : public Actor {
as_chat_id(chat_id), invite_link,
td_api::make_object<td_api::chatInviteLinkMember>(as_user_id(offset_user_id), offset_date, 0),
as_limit(limit)));
} else if (op == "gcjr") {
string chat_id;
string invite_link;
string query;
string offset_user_id;
int32 offset_date;
string limit;
get_args(args, chat_id, invite_link, query, offset_user_id, offset_date, limit);
send_request(td_api::make_object<td_api::getChatJoinRequests>(
as_chat_id(chat_id), invite_link, query,
td_api::make_object<td_api::chatJoinRequest>(as_user_id(offset_user_id), offset_date, string()),
as_limit(limit)));
} else if (op == "drcil") {
string chat_id;
string invite_link;