diff --git a/telegram-bot-api/Client.cpp b/telegram-bot-api/Client.cpp index 76ef68c..16b7ecf 100644 --- a/telegram-bot-api/Client.cpp +++ b/telegram-bot-api/Client.cpp @@ -4195,18 +4195,15 @@ void Client::send(PromisedQueryPtr query) { auto update_per_minute = static_cast(stat->get_minute_update_count(td::Time::now()) * 60); if (stat->get_active_request_count() > 500 + update_per_minute) { LOG(INFO) << "Fail a query, because there are too many active queries: " << *query; - flood_limited_query_count_++; - return query->set_retry_after_error(60); + return fail_query_flood_limit_exceeded(std::move(query)); } if (stat->get_active_file_upload_bytes() > (static_cast(1) << 32) && !query->files().empty()) { LOG(INFO) << "Fail a query, because the total size of active file uploads is too big: " << *query; - flood_limited_query_count_++; - return query->set_retry_after_error(60); + return fail_query_flood_limit_exceeded(std::move(query)); } if (stat->get_active_file_upload_count() > 100 + update_per_minute / 5 && !query->files().empty()) { LOG(INFO) << "Fail a query, because there are too many active file uploads: " << *query; - flood_limited_query_count_++; - return query->set_retry_after_error(60); + return fail_query_flood_limit_exceeded(std::move(query)); } } } @@ -7580,8 +7577,7 @@ td::Status Client::process_send_message_query(PromisedQueryPtr &query) { // fast path auto it = yet_unsent_message_count_.find(r_chat_id.ok()); if (it != yet_unsent_message_count_.end() && it->second >= MAX_CONCURRENTLY_SENT_CHAT_MESSAGES) { - flood_limited_query_count_++; - query->set_retry_after_error(60); + fail_query_flood_limit_exceeded(std::move(query)); return Status::OK(); } } @@ -7889,8 +7885,7 @@ td::Status Client::process_send_media_group_query(PromisedQueryPtr &query) { PromisedQueryPtr query) mutable { auto &count = yet_unsent_message_count_[chat_id]; if (count >= MAX_CONCURRENTLY_SENT_CHAT_MESSAGES) { - flood_limited_query_count_++; - return query->set_retry_after_error(60); + return fail_query_flood_limit_exceeded(std::move(query)); } auto message_count = input_message_contents.size(); count += static_cast(message_count); @@ -9527,8 +9522,7 @@ void Client::do_send_message(object_ptr input_messa int64 reply_to_message_id, PromisedQueryPtr query) mutable { auto &count = yet_unsent_message_count_[chat_id]; if (count >= MAX_CONCURRENTLY_SENT_CHAT_MESSAGES) { - flood_limited_query_count_++; - return query->set_retry_after_error(60); + return fail_query_flood_limit_exceeded(std::move(query)); } count++; @@ -9616,6 +9610,15 @@ void Client::fail_query_closing(PromisedQueryPtr &&query) { } } +void Client::fail_query_flood_limit_exceeded(PromisedQueryPtr &&query) { + flood_limited_query_count_++; + td::create_actor( + "FailQueryFloodLimitExceededActor", 3.0, + td::PromiseCreator::lambda( + [query = std::move(query)](td::Result result) mutable { query->set_retry_after_error(60); })) + .release(); +} + Client::ClosingError Client::get_closing_error() { ClosingError result; result.retry_after = 0; diff --git a/telegram-bot-api/Client.h b/telegram-bot-api/Client.h index 1925f87..5a0d620 100644 --- a/telegram-bot-api/Client.h +++ b/telegram-bot-api/Client.h @@ -618,6 +618,8 @@ class Client final : public WebhookActor::Callback { void fail_query_closing(PromisedQueryPtr &&query); + void fail_query_flood_limit_exceeded(PromisedQueryPtr &&query); + void fail_query_conflict(Slice message, PromisedQueryPtr &&query); struct ClosingError {