lolautoaccept/include/datadragon.h

90 lines
2.1 KiB
C++

#pragma once
#include <condition_variable>
#include <functional>
#include <mutex>
#include <string>
#include <thread>
#include <vector>
#include <QPixmap>
#include "datadragonimagecache.h"
#include "memoryimagecache.h"
#include "restclient.h"
class DataDragon : public RestClient {
public:
using notifyImgfunc_t = std::function<void(QPixmap)>;
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;
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<ChampData>& getChamps();
// might block until image is downloaded
QPixmap getImage(const std::string& champid, ImageType imgtype = ImageType::SQUARE);
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<const ChampData*> getMatchingChamp(const std::string& name, uint32_t limit = 25);
static const ChampData EMPTYCHAMP;
protected:
std::string getImageUrl(const std::string& champid, ImageType type);
std::string getCDNString() const;
void getVersionInternal();
void getChampsInternal();
void startThread();
void stopThread();
void stopAndJoinThread();
void threadLoop();
std::string locale;
std::string version;
std::vector<ChampData> champs;
std::mutex cachedatamutex;
std::condition_variable cachedatacv;
private:
struct Task {
std::string champid;
notifyImgfunc_t func;
ImageType type;
};
DataDragonImageCache cache[3];
MemoryImageCache memcache;
std::list<Task> tasks;
std::mutex tasksmutex;
std::condition_variable tasksnotemptycv;
std::thread bgthread;
bool shouldrun = true;
};
std::ostream& operator<<(std::ostream& str, const DataDragon::ChampData& cd);