From 2590dd61794f0e2fdf5dd0f1bbf7f71791df8d0c Mon Sep 17 00:00:00 2001 From: lonkaars Date: Sat, 24 Dec 2022 13:37:21 +0100 Subject: downloading and parsing swshp set works --- oop2eindopdr/Pokedex.cpp | 18 ++++++++++++++-- oop2eindopdr/Pokedex.h | 2 ++ oop2eindopdr/PokemonCard.cpp | 41 +++++++++++++++++++++++++++++++++++- oop2eindopdr/PokemonCard.h | 9 ++++++-- oop2eindopdr/PokemonTCGAPIClient.cpp | 23 ++++++++++++++++++-- oop2eindopdr/PokemonTCGAPIClient.h | 2 ++ 6 files changed, 88 insertions(+), 7 deletions(-) (limited to 'oop2eindopdr') diff --git a/oop2eindopdr/Pokedex.cpp b/oop2eindopdr/Pokedex.cpp index 24de74b..a38cefd 100644 --- a/oop2eindopdr/Pokedex.cpp +++ b/oop2eindopdr/Pokedex.cpp @@ -1,11 +1,17 @@ #include +#include #include "CacheManager.h" #include "Pokedex.h" Pokedex::Pokedex() { this->cache = new CacheManager("./cache"); - this->load_collection_local(); + this->api = new PokemonTCGAPIClient(); + + if (this->cache->cache_exists("index")) + this->load_collection_local(); + else + this->load_collection_remote(); } Pokedex::~Pokedex() { @@ -13,14 +19,22 @@ Pokedex::~Pokedex() { } void Pokedex::load_collection_remote() { + std::cout << "no local cards found, building cache..." << std::endl; + std::vector remote_cards = api->get_set_cards("swshp"); + for (PokemonCard* card : remote_cards) { + card->set_cache(this->cache); + card->verify_files(); + this->cards.push_back(card); + } + cache->update_cache(); } void Pokedex::load_collection_local() { std::fstream& cache_collection = *cache->cache_get("index"); std::string card; while (std::getline(cache_collection, card)) { - this->cards.push_back(new PokemonCard::from_cache(cache, card)); + this->cards.push_back(new PokemonCard::from_cache(this->cache, card)); } } diff --git a/oop2eindopdr/Pokedex.h b/oop2eindopdr/Pokedex.h index 5e20367..e5730ee 100644 --- a/oop2eindopdr/Pokedex.h +++ b/oop2eindopdr/Pokedex.h @@ -5,6 +5,7 @@ #include "CacheManager.h" #include "PokemonCard.h" +#include "PokemonTCGAPIClient.h" /** @brief user pokedex class, handles caching and api access silently */ class Pokedex { @@ -21,6 +22,7 @@ private: /** @brief cache connection */ CacheManager* cache = nullptr; + PokemonTCGAPIClient* api = nullptr; public: Pokedex(); diff --git a/oop2eindopdr/PokemonCard.cpp b/oop2eindopdr/PokemonCard.cpp index 9c4b8a7..69a6e61 100644 --- a/oop2eindopdr/PokemonCard.cpp +++ b/oop2eindopdr/PokemonCard.cpp @@ -1,6 +1,7 @@ #include "PokemonCard.h" #include +#include #include #include @@ -18,7 +19,8 @@ std::ostream& operator << (std::ostream& output, const PokemonCard& card) { } PokemonCard::PokemonCard(CacheManager* cache_ref) { - + set_cache(cache_ref); + if (this->cache_ref == nullptr) return; } PokemonCard::~PokemonCard() { @@ -28,3 +30,40 @@ PokemonCard::~PokemonCard() { void PokemonCard::fetch_market_value() { } + +void PokemonCard::set_cache(CacheManager* cache_ref) { + this->cache_ref = cache_ref; +} + +void PokemonCard::verify_files() { + +} + +void PokemonCard::download_files() { + +} + +void PokemonCard::raw_load_json(nlohmann::json raw_data) { + this->id = raw_data["id"].get(); + this->name = raw_data["name"].get(); + try { + this->hp = std::stoul(raw_data["hp"].get()); + } catch (nlohmann::json::type_error) { + this->hp = 0; // some NPCs/auxiliary cards have hp = null + } + this->value = 0.f; // fetch using fetch_market_value + for (nlohmann::json raw_attack : raw_data["attacks"]) + this->attacks.push_back(raw_attack["name"]); +} + +void PokemonCard::raw_load_cache(const char* cache_path) { + std::string info_json_location = cache_path; + info_json_location.append("/info.json"); + this->verify_files(); + std::fstream& info_json_file = *this->cache_ref->cache_get(info_json_location.c_str()); + std::stringstream info_json_content; + info_json_content << info_json_file.rdbuf(); + + nlohmann::json raw_json = nlohmann::json::parse(info_json_content.str()); + this->raw_load_json(raw_json); +} diff --git a/oop2eindopdr/PokemonCard.h b/oop2eindopdr/PokemonCard.h index a19ef60..873d327 100644 --- a/oop2eindopdr/PokemonCard.h +++ b/oop2eindopdr/PokemonCard.h @@ -14,8 +14,10 @@ private: virtual void raw_load_json(nlohmann::json raw_data); virtual void raw_load_cache(const char* cache_path); + CacheManager* cache_ref = nullptr; + public: - PokemonCard(CacheManager* cache_ref); + PokemonCard(CacheManager* cache_ref = nullptr); virtual ~PokemonCard(); /** @brief string stream output (for printing card) */ @@ -37,10 +39,13 @@ public: struct from_json; // named constructors (defined below) struct from_cache; + + /** @brief set cache */ + virtual void set_cache(CacheManager* cache_ref); }; struct PokemonCard::from_json : public PokemonCard { - from_json(CacheManager* cache_ref, nlohmann::json json_data) : PokemonCard(cache_ref) { + from_json(nlohmann::json json_data) : PokemonCard() { PokemonCard::raw_load_json(json_data); } }; diff --git a/oop2eindopdr/PokemonTCGAPIClient.cpp b/oop2eindopdr/PokemonTCGAPIClient.cpp index 0c950fd..335c15c 100644 --- a/oop2eindopdr/PokemonTCGAPIClient.cpp +++ b/oop2eindopdr/PokemonTCGAPIClient.cpp @@ -19,15 +19,34 @@ nlohmann::json PokemonTCGAPIClient::raw_request(const char* endpoint, cpr::Param } nlohmann::json PokemonTCGAPIClient::raw_get_cards(const char* query) { - return raw_request("/cards", cpr::Parameters{{"q", query}}); + return raw_request("/cards", cpr::Parameters{{"q", query}, {"select", "id,name,hp,attacks,number,images"}}); } nlohmann::json PokemonTCGAPIClient::raw_get_sets(const char* query) { return raw_request("/sets", cpr::Parameters{{"q", query}}); } +nlohmann::json PokemonTCGAPIClient::raw_get_card(const char* id) { + std::string full_query = "id:"; + full_query.append(id); + return raw_request("/cards", cpr::Parameters{{"q", full_query}}); +} + std::vector PokemonTCGAPIClient::get_set_cards(const char* set_name) { - return {}; + std::string query = "set.id:"; + query.append(set_name); + nlohmann::json raw_data = raw_get_cards(query.c_str()); + std::vector out; + for (nlohmann::json card_json : raw_data["data"]) { + out.push_back(new PokemonCard::from_json(card_json)); + } + return out; +} + +PokemonCard* PokemonTCGAPIClient::get_full_card(const char* id) { + nlohmann::json raw_cards = raw_get_card(id); + if (raw_cards["data"].size() == 0) return nullptr; + return new PokemonCard::from_json(raw_cards["data"][0]); } std::vector PokemonTCGAPIClient::get_sets() { diff --git a/oop2eindopdr/PokemonTCGAPIClient.h b/oop2eindopdr/PokemonTCGAPIClient.h index 241586b..c6b6a23 100644 --- a/oop2eindopdr/PokemonTCGAPIClient.h +++ b/oop2eindopdr/PokemonTCGAPIClient.h @@ -15,10 +15,12 @@ private: const char* API_URL = "https://api.pokemontcg.io/v2"; virtual nlohmann::json raw_request(const char* endpoint, cpr::Parameters params); virtual nlohmann::json raw_get_cards(const char* query); + virtual nlohmann::json raw_get_card(const char* id); virtual nlohmann::json raw_get_sets(const char* query); public: virtual std::vector get_set_cards(const char* set_name); + virtual PokemonCard* get_full_card(const char* id); virtual std::vector get_sets(); }; -- cgit v1.2.3