#pragma once #include #include #include #include #include #include #include #include #include "datadragonimagecache.h" #include "champcache.h" #include "memoryimagecache.h" #include "restclient.h" class DataDragon : public RestClient { public: using notifyImgfunc_t = std::function; DataDragon(const std::string& locale); ~DataDragon(); DataDragon(const DataDragon&) = delete; DataDragon& operator=(const DataDragon&) = delete; struct ChampData { public: ChampData(); ChampData(const QJsonObject& source); std::string name; std::string id; int key = 0; std::string partype; std::string title; }; enum class ImageType { SQUARE = 0, LOADING = 1, SPLASH = 2 }; // might block until version is available const std::string& getVersion(); // might block until champ data is available const std::vector& getChamps(); // might block until image is downloaded QPixmap getImage(const std::string& champid, ImageType imgtype = ImageType::SQUARE, bool writeMemcache = true); void getImageAsnyc(const std::string& champid, notifyImgfunc_t func, ImageType imgtype = ImageType::SQUARE); // might block until champ data is available const ChampData& getBestMatchingChamp(const std::string& name, int* count = nullptr); std::vector getMatchingChamp(const std::string& name, uint32_t limit = 25); const ChampData* getChampByID(uint32_t id); std::vector resolveChampIDs(const std::vector& champnames); static const ChampData EMPTYCHAMP; protected: std::string getImageUrl(const std::string& champid, ImageType type); std::string getCDNString() const; void prefetchChampImage(const std::string& champid, ImageType imgtype = ImageType::SQUARE); void getVersionInternal(); void getChampsInternal(); void startThread(); void stopThread(); void stopAndJoinThread(); void threadLoop(); std::string locale; std::string version; std::vector champs; std::mutex cachedatamutex; std::condition_variable cachedatacv; std::set notDownloadedImages; // the champions of which the square image is not downloaded yet. Is used to download them on idle private: struct Task { std::string champid; notifyImgfunc_t func; ImageType type; }; DataDragonImageCache cache[3]; ChampCache champCache; MemoryImageCache memcache; std::list tasks; std::mutex tasksmutex; std::condition_variable tasksnotemptycv; std::thread bgthread; bool shouldrun = true; }; std::ostream& operator<<(std::ostream& str, const DataDragon::ChampData& cd);