// // Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2021 // // 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/files/FileId.h" #include "td/telegram/files/FileSourceId.h" #include "td/telegram/Photo.h" #include "td/telegram/SecretInputMedia.h" #include "td/utils/buffer.h" #include "td/utils/common.h" #include "td/utils/Status.h" #include namespace td { class Td; class AnimationsManager final : public Actor { public: AnimationsManager(Td *td, ActorShared<> parent); void memory_cleanup(); void memory_stats(vector &output); int32 get_animation_duration(FileId file_id) const; tl_object_ptr get_animation_object(FileId file_id, const char *source); void create_animation(FileId file_id, string minithumbnail, PhotoSize thumbnail, AnimationSize animated_thumbnail, bool has_stickers, vector &&sticker_file_ids, string file_name, string mime_type, int32 duration, Dimensions dimensions, bool replace); tl_object_ptr get_input_media(FileId file_id, tl_object_ptr input_file, tl_object_ptr input_thumbnail) const; SecretInputMedia get_secret_input_media(FileId animation_file_id, tl_object_ptr input_file, const string &caption, BufferSlice thumbnail) const; FileId get_animation_thumbnail_file_id(FileId file_id) const; FileId get_animation_animated_thumbnail_file_id(FileId file_id) const; void delete_animation_thumbnail(FileId file_id); FileId dup_animation(FileId new_id, FileId old_id); bool merge_animations(FileId new_id, FileId old_id, bool can_delete_old); void on_update_animation_search_emojis(string animation_search_emojis); void on_update_animation_search_provider(string animation_search_provider); void on_update_saved_animations_limit(int32 saved_animations_limit); void reload_saved_animations(bool force); void repair_saved_animations(Promise &&promise); void on_get_saved_animations(bool is_repair, tl_object_ptr &&saved_animations_ptr); void on_get_saved_animations_failed(bool is_repair, Status error); vector get_saved_animations(Promise &&promise); FileSourceId get_saved_animations_file_source_id(); void send_save_gif_query(FileId animation_id, bool unsave, Promise &&promise); void add_saved_animation(const tl_object_ptr &input_file, Promise &&promise); void add_saved_animation_by_id(FileId animation_id); void remove_saved_animation(const tl_object_ptr &input_file, Promise &&promise); template void store_animation(FileId file_id, StorerT &storer) const; template FileId parse_animation(ParserT &parser); string get_animation_search_text(FileId file_id) const; void after_get_difference(); void get_current_state(vector> &updates) const; private: class Animation { public: string file_name; string mime_type; int32 duration = 0; Dimensions dimensions; string minithumbnail; PhotoSize thumbnail; AnimationSize animated_thumbnail; bool has_stickers = false; vector sticker_file_ids; FileId file_id; bool is_changed = true; }; void memory_cleanup(bool full); const Animation *get_animation(FileId file_id) const; FileId on_get_animation(unique_ptr new_animation, bool replace); int32 get_saved_animations_hash(const char *source) const; void add_saved_animation_impl(FileId animation_id, bool add_on_server, Promise &&promise); void load_saved_animations(Promise &&promise); void on_load_saved_animations_from_database(const string &value); void on_load_saved_animations_finished(vector &&saved_animation_ids, bool from_database = false); void try_send_update_animation_search_parameters() const; td_api::object_ptr get_update_animation_search_parameters_object() const; td_api::object_ptr get_update_saved_animations_object() const; void send_update_saved_animations(bool from_database = false); void save_saved_animations_to_database(); void tear_down() final; class AnimationListLogEvent; Td *td_; ActorShared<> parent_; std::unordered_map, FileIdHash> animations_; int32 saved_animations_limit_ = 200; vector saved_animation_ids_; vector saved_animation_file_ids_; double next_saved_animations_load_time_ = 0; bool are_saved_animations_being_loaded_ = false; bool are_saved_animations_loaded_ = false; vector> load_saved_animations_queries_; vector> repair_saved_animations_queries_; FileSourceId saved_animations_file_source_id_; string animation_search_emojis_; string animation_search_provider_; bool is_animation_search_emojis_inited_ = false; bool is_animation_search_provider_inited_ = false; }; } // namespace td