#pragma once #include "Common/Lockable.hpp" #include "Server/RemoteClient.hpp" #include #include #include #include #include #include #include #include "Abstract.hpp" namespace LV::Server { namespace fs = std::filesystem; class BinaryResourceManager : public AsyncObject { public: private: struct Resource { // Файл загруженный на диск std::shared_ptr Loaded; // Источник std::string Uri; bool IsLoading = false; std::string LastError; }; struct UriParse { std::string Orig, Protocol, Path; }; // Нулевой ресурс std::shared_ptr ZeroResource; // Домены поиска ресурсов std::unordered_map Domains; // Известные ресурсы std::map KnownResource; std::map> ResourcesInfo; // Последовательная регистрация ресурсов ResourceId_t NextId = 1; // Накапливаем идентификаторы готовых ресурсов Lockable> UpdatedResources; // Подготовленая таблица оповещения об изменениях ресурсов // Должна забираться сервером и отчищаться std::unordered_map> PreparedInformation; public: // Если ресурс будет обновлён или загружен будет вызвано onResourceUpdate BinaryResourceManager(asio::io_context &ioc, std::shared_ptr zeroResource); virtual ~BinaryResourceManager(); // Перепроверка изменений ресурсов void recheckResources(); // Домен мода -> путь к папке с ресурсами void setAssetsDomain(std::unordered_map &&domains) { Domains = std::move(domains); } // Идентификатор ресурса по его uri ResourceId_t mapUriToId(const std::string &uri); // Запросить ресурсы через onResourceUpdate void needResourceResponse(const std::vector &resources); // Серверный такт void update(float dtime); bool hasPreparedInformation() { return !PreparedInformation.empty(); } std::unordered_map> takePreparedInformation() { return std::move(PreparedInformation); } protected: UriParse parseUri(const std::string &uri); ResourceId_t getResource_Assets(std::string path); coro<> checkResource_Assets(ResourceId_t id, fs::path path, std::shared_ptr res); }; }