diff --git a/README.md b/README.md index 3f5c7ba..abea43e 100644 --- a/README.md +++ b/README.md @@ -54,17 +54,6 @@ Get the member list of a supergroup or channel ###### Returns `ChatMember` -##### Method `deleteMessages` -Delete all the messages with message_id in range between `start` and `end`. -The `start` parameter MUST be less than the `end` parameter -Both `start` and `end` must be positive non zero numbers -The method will always return `true` as a result, even if the messages cannot be deleted -This method does not work on private chat or normal groups -It is not suggested to delete more than 200 messages per call - -**NOTE** -The maximum number of messages to be deleted in a single batch is determined by the `max-batch-operations` parameter and is 10000 by default - ###### Parameters - `chat_id` Chat id - `start` First message id to delete @@ -122,6 +111,17 @@ _For Docker containers, `$TELEGRAM_VERBOSITY` can be set._ ##### Method `getChat` The command `getChat` will also try to resolve the username online, if it can't be found locally +##### Method `deleteMessages` +The command `deleteMessages` can also delete all the messages with message_id in range between `start` and `end`. +The `start` parameter MUST be less than the `end` parameter +Both `start` and `end` must be positive non-zero numbers +The method will always return `true` as a result, even if the messages cannot be deleted +This method does not work on private chat or normal groups +It is not suggested to delete more than 200 messages per call + +**NOTE** +The maximum number of messages to be deleted in a single batch is determined by the `max-batch-operations` parameter and is 10000 by default + ##### Object `Message` The `Message` object now has two new fields: - `views`: how many views has the message (usually the views are shown only for channel messages) diff --git a/tdlight-api-openapi.yaml b/tdlight-api-openapi.yaml index b438f32..4ac7668 100644 --- a/tdlight-api-openapi.yaml +++ b/tdlight-api-openapi.yaml @@ -544,6 +544,115 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' + /deleteMessages: + post: + tags: + - modified + description: |- + Use this method to delete multiple messages simultaneously. + This method can delete a set of message ids, or a range of message ids. + + If you specify "message_ids", this method tries to delete the specified set of ids: + If some of the specified messages can't be found, they are skipped. + Returns True on success. + + If you specify "start" and "end", this method deletes all the messages with message_id in range between start and end: + The start parameter MUST be less than the end parameter + Both start and end must be positive non zero numbers + The method will always return true as a result, even if the messages cannot be deleted + This method does not work on private chat or normal groups It is not suggested to delete more than 200 messages per call. + + *NOTE* + The maximum number of messages to be deleted in a single batch is determined by the max-batch-operations parameter and is 10000 by default. + requestBody: + content: + application/x-www-form-urlencoded: + schema: + type: object + properties: + chat_id: + description: Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) + anyOf: + - type: integer + - type: string + message_ids: + type: array + items: + type: integer + start: + description: First message id to delete + type: integer + end: + description: Last message id to delete + type: integer + required: + - chat_id + multipart/form-data: + schema: + type: object + properties: + chat_id: + description: Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) + anyOf: + - type: integer + - type: string + message_ids: + type: array + items: + type: integer + start: + description: First message id to delete + type: integer + end: + description: Last message id to delete + type: integer + required: + - chat_id + application/json: + schema: + type: object + properties: + chat_id: + description: Unique identifier for the target chat or username of the target channel (in the format `@channelusername`) + anyOf: + - type: integer + - type: string + message_ids: + type: array + items: + type: integer + start: + description: First message id to delete + type: integer + end: + description: Last message id to delete + type: integer + required: + - chat_id + required: true + responses: + '200': + description: 'Request was successful, the result is returned.' + content: + application/json: + schema: + type: object + properties: + ok: + default: true + type: boolean + result: + default: true + type: boolean + required: + - ok + - result + default: + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Error' /ping: post: tags: diff --git a/telegram-bot-api/Client.cpp b/telegram-bot-api/Client.cpp index 04ff8f8..c17d8ef 100644 --- a/telegram-bot-api/Client.cpp +++ b/telegram-bot-api/Client.cpp @@ -10592,6 +10592,10 @@ td::Status Client::process_delete_message_query(PromisedQueryPtr &query) { } td::Status Client::process_delete_messages_query(PromisedQueryPtr &query) { + auto is_range_delete_query = query->arg("start").empty() && query->arg("end").empty(); + if (is_range_delete_query) { + return process_delete_messages_range_query(query); + } auto chat_id = query->arg("chat_id"); TRY_RESULT(message_ids, get_message_ids(query.get(), 100)); if (message_ids.empty()) { @@ -11975,6 +11979,48 @@ td::Status Client::process_disable_proxy_query(PromisedQueryPtr &query) { td::make_unique(std::move(query))); return td::Status::OK(); } + +td::Status Client::process_delete_messages_range_query(PromisedQueryPtr &query) { + auto chat_id = query->arg("chat_id"); + + if (chat_id.empty()) { + return td::Status::Error(400, "Chat identifier is not specified"); + } + + auto start = as_client_message_id(get_message_id(query.get(), "start")); + auto end = as_client_message_id(get_message_id(query.get(), "end")); + + if (start == 0 || end == 0) { + return td::Status::Error(400, "Message identifier is not specified"); + } + + if (start >= end) { + return td::Status::Error(400, "Initial message identifier is not lower than last message identifier"); + } + + if (static_cast(end-start) > parameters_->max_batch_operations) { + return td::Status::Error(400, PSLICE() << "Too many operations: maximum number of batch operation is " << parameters_->max_batch_operations); + } + + check_chat(chat_id, AccessRights::Write, std::move(query), [this, start, end](int64 chat_id, PromisedQueryPtr query) { + if (get_chat_type(chat_id) != ChatType::Supergroup) { + return fail_query(400, "Bad Request: method is available only for supergroups", std::move(query)); + } + + td::vector ids; + ids.reserve(end-start+1); + for (td::int32 i = start; i <= end; i++) { + ids.push_back(as_tdlib_message_id(i)); + } + + if (!ids.empty()) { + send_request(make_object(chat_id, std::move(ids), true), + td::make_unique(std::move(query))); + } + }); + + return td::Status::OK(); +} //end custom methods impl //start custom user methods impl diff --git a/telegram-bot-api/Client.h b/telegram-bot-api/Client.h index ef7ec91..1c38639 100644 --- a/telegram-bot-api/Client.h +++ b/telegram-bot-api/Client.h @@ -762,6 +762,7 @@ class Client final : public WebhookActor::Callback { td::Status process_delete_proxy_query(PromisedQueryPtr &query); td::Status process_enable_proxy_query(PromisedQueryPtr &query); td::Status process_disable_proxy_query(PromisedQueryPtr &query); + td::Status process_delete_messages_range_query(PromisedQueryPtr &query); //custom user methods td::Status process_get_chats_query(PromisedQueryPtr &query);