From 062421598811fe214ad55edaf9228a8e89334f1f Mon Sep 17 00:00:00 2001 From: Giuseppe Marino Date: Tue, 10 Nov 2020 22:17:31 +0100 Subject: [PATCH] Implemented getParticipants - method `getParticipants` : `chat_id`, `type` -- `type` is string, possible values are `members`, `parameters`, `admins`, `administators`, `restricted`, `banned`, `bots` -- return type: array of `ChatMember` - edits to the `ChatMember` type: -- now the full bot list is returned -- new `joined_date` field (type integer) -- new `inviter` field (type User) --- telegram-bot-api/Client.cpp | 92 +++++++++++++++++++++++++++++++------ 1 file changed, 79 insertions(+), 13 deletions(-) diff --git a/telegram-bot-api/Client.cpp b/telegram-bot-api/Client.cpp index 3bb4011..5fc1574 100644 --- a/telegram-bot-api/Client.cpp +++ b/telegram-bot-api/Client.cpp @@ -2046,6 +2046,16 @@ class Client::JsonChatMember : public Jsonable { auto object = scope->enter_object(); object("user", JsonUser(member_->user_id_, client_)); object("status", Client::get_chat_member_status(member_->status_)); + + object("joined_date", member_->joined_chat_date_); + if (member_->inviter_user_id_ > 0) { + object("inviter", JsonUser(member_->inviter_user_id_, client_)); + } + + if (member_->bot_info_ != nullptr) { + //for the future + } + switch (member_->status_->get_id()) { case td_api::chatMemberStatusCreator::ID: { auto creator = static_cast(member_->status_.get()); @@ -2123,9 +2133,11 @@ class Client::JsonChatMembers : public Jsonable { is_member_bot = true; } } + /* if (is_member_bot && member->user_id_ != client_->my_id_) { continue; } + */ if (administrators_only_) { auto status = Client::get_chat_member_status(member->status_); if (status != "creator" && status != "administrator") { @@ -7378,30 +7390,84 @@ td::Status Client::process_get_file_query(PromisedQueryPtr &query) { //start custom methods impl td::Status Client::process_get_message_info_query(PromisedQueryPtr &query) { - auto chat_id = query->arg("chat_id"); - auto message_id = get_message_id(query.get(), "message_id"); - check_message(chat_id, message_id, false, AccessRights::Read, "message", std::move(query),[this] (int64 chat_id, int64 message_id, PromisedQueryPtr query) { - auto message = get_message(chat_id, message_id); - answer_query(JsonMessage(message, false, "get message info", this), std::move(query)); - }); + auto chat_id = query->arg("chat_id"); + auto message_id = get_message_id(query.get(), "message_id"); + check_message(chat_id, message_id, false, AccessRights::Read, "message", std::move(query),[this] (int64 chat_id, int64 message_id, PromisedQueryPtr query) { + auto message = get_message(chat_id, message_id); + answer_query(JsonMessage(message, false, "get message info", this), std::move(query)); + }); - return Status::OK(); + return Status::OK(); } td::Status Client::process_get_participants_query(PromisedQueryPtr &query) { - answer_query(td::JsonFalse(), std::move(query), "Not implemented"); + auto chat_id = query->arg("chat_id"); + + + check_chat(chat_id, AccessRights::Read, std::move(query), [this](int64 chat_id, PromisedQueryPtr query) { + auto chat_info = get_chat(chat_id); + CHECK(chat_info != nullptr); + td::int32 offset = get_integer_arg(query.get(), "offset", 0); + td::int32 limit = get_integer_arg(query.get(), "limit", 200, 0, 200); + + + switch (chat_info->type) { + case ChatInfo::Type::Private: + return fail_query(400, "Bad Request: there are no participants in the private chat", std::move(query)); + case ChatInfo::Type::Group: { + /* + auto group_info = get_group_info(chat_info->group_id); + CHECK(group_info != nullptr); + return send_request(make_object(chat_info->group_id), + std::make_unique(this, true, std::move(query))) + */ + return fail_query(400, "Bad Request: method not available for group chats", std::move(query)); + + } + case ChatInfo::Type::Supergroup: { + td_api::object_ptr filter; + td::string type = "members"; + if (query->has_arg("type")) { + type = td::to_lower(query->arg("type")); + + } + + + if (type == "members" || type == "participants") { + filter = td_api::make_object(); + } else if (type == "banned") { + filter = td_api::make_object(); + } else if (type == "restricted") { + filter = td_api::make_object(); + } else if (type == "bots") { + filter = td_api::make_object(); + } else if (type == "admins" || type == "administrators") { + filter = td_api::make_object(); + } else { + fail_query_with_error(std::move(query), 400, "Invalid member type"); + return; + } + + return send_request( + make_object(chat_info->supergroup_id, std::move(filter), offset, limit), + std::make_unique(this, get_chat_type(chat_id), std::move(query))); + } + case ChatInfo::Type::Unknown: + default: + UNREACHABLE(); + } + }); return Status::OK(); } td::Status Client::process_delete_messages_query(PromisedQueryPtr &query) { - answer_query(td::JsonFalse(), std::move(query), "Not implemented"); - return Status::OK(); - + answer_query(td::JsonFalse(), std::move(query), "Not implemented"); + return Status::OK(); } td::Status Client::process_toggle_group_invites_query(PromisedQueryPtr &query) { - answer_query(td::JsonFalse(), std::move(query), "Not implemented"); - return Status::OK(); + answer_query(td::JsonFalse(), std::move(query), "Not implemented"); + return Status::OK(); } //end custom methods impl