// // Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2020 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #pragma once #include "telegram-bot-api/Client.h" #include "telegram-bot-api/Query.h" #include "telegram-bot-api/Stats.h" #include "td/actor/actor.h" #include "td/actor/PromiseFuture.h" #include "td/utils/buffer.h" #include "td/utils/common.h" #include "td/utils/Container.h" #include "td/utils/FloodControlFast.h" #include "td/utils/Slice.h" #include #include #include namespace telegram_bot_api { struct ClientParameters; struct SharedData; class ClientManager final : public td::Actor { public: struct TokenRange { td::uint64 rem; td::uint64 mod; bool operator()(td::uint64 x) { return x % mod == rem; } }; ClientManager(std::shared_ptr parameters, TokenRange token_range) : parameters_(std::move(parameters)), token_range_(token_range) { } void send(PromisedQueryPtr query); void get_stats(td::PromiseActor promise, td::vector> args); void close(td::Promise &&promise); private: class ClientInfo { public: BotStatActor stat_; td::string token_; td::ActorOwn client_; }; td::Container clients_; BotStatActor stat_{td::ActorId()}; std::shared_ptr parameters_; TokenRange token_range_; std::unordered_map token_to_id_; std::unordered_map flood_controls_; bool close_flag_ = false; td::vector> close_promises_; static td::int64 get_tqueue_id(td::int64 user_id, bool is_test_dc); static PromisedQueryPtr get_webhook_restore_query(td::Slice token, td::Slice webhook_info, std::shared_ptr shared_data); void start_up() override; void hangup_shared() override; void close_db(); void finish_close(); }; } // namespace telegram_bot_api