// // Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2019 // // 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 "td/telegram/td_api.h" #include "td/telegram/telegram_api.h" #include "td/actor/actor.h" #include "td/actor/PromiseFuture.h" #include "td/telegram/net/NetQuery.h" #include "td/utils/common.h" #include "td/utils/Container.h" #include "td/utils/Status.h" #include namespace td { class PrivacyManager : public NetQueryCallback { public: explicit PrivacyManager(ActorShared<> parent) : parent_(std::move(parent)) { } void get_privacy(tl_object_ptr key, Promise> promise); void set_privacy(tl_object_ptr key, tl_object_ptr rules, Promise promise); void update_privacy(tl_object_ptr update); private: class UserPrivacySetting { public: enum class Type : int32 { UserState, ChatInvite, Call, Size }; static Result from_td_api(tl_object_ptr key); explicit UserPrivacySetting(const telegram_api::PrivacyKey &key); tl_object_ptr as_td_api() const; tl_object_ptr as_telegram_api() const; Type type() const { return type_; } private: Type type_; explicit UserPrivacySetting(const td_api::UserPrivacySetting &key); }; class UserPrivacySettingRule { public: UserPrivacySettingRule() = default; static Result from_telegram_api(tl_object_ptr rule); explicit UserPrivacySettingRule(const td_api::UserPrivacySettingRule &rule); tl_object_ptr as_td_api() const; tl_object_ptr as_telegram_api() const; bool operator==(const UserPrivacySettingRule &other) const { return type_ == other.type_ && user_ids_ == other.user_ids_; } private: enum class Type : int32 { AllowContacts, AllowAll, AllowUsers, RestrictContacts, RestrictAll, RestrictUsers } type_ = Type::RestrictAll; vector user_ids_; vector user_ids_as_td_api() const; vector> user_ids_as_telegram_api() const; explicit UserPrivacySettingRule(const telegram_api::PrivacyRule &rule); }; class UserPrivacySettingRules { public: UserPrivacySettingRules() = default; static Result from_telegram_api(tl_object_ptr rules); static Result from_telegram_api(vector> rules); static Result from_td_api(tl_object_ptr rules); tl_object_ptr as_td_api() const; vector> as_telegram_api() const; bool operator==(const UserPrivacySettingRules &other) const { return rules_ == other.rules_; } private: vector rules_; }; ActorShared<> parent_; struct PrivacyInfo { UserPrivacySettingRules rules; vector>> get_promises; bool has_set_query = false; bool is_synchronized = false; }; std::array(UserPrivacySetting::Type::Size)> info_; PrivacyInfo &get_info(UserPrivacySetting key) { return info_[static_cast(key.type())]; } void on_get_result(UserPrivacySetting user_privacy_setting, Result privacy_rules); void do_update_privacy(UserPrivacySetting user_privacy_setting, UserPrivacySettingRules &&privacy_rules, bool from_update); void on_result(NetQueryPtr query) override; Container> container_; void send_with_promise(NetQueryPtr query, Promise promise); void hangup() override; }; } // namespace td