Endgame-Analyzer/src/download.cpp

49 lines
1.6 KiB
C++
Raw Normal View History

#include <boost/json/src.hpp>
2023-08-12 19:43:22 +02:00
#include <cpr/cpr.h>
#include "parse_game.h"
#include "make_state.h"
#include "download.h"
namespace Download {
std::optional<boost::json::object> download_game_json(int game_id) {
std::string request_str = "https://hanab.live/export/" + std::to_string(game_id);
cpr::Response r = cpr::Get(cpr::Url(request_str));
if (r.header["content-type"] != "application/json; charset=utf-8") {
return std::nullopt;
}
return boost::json::parse(r.text).as_object();
}
std::optional<boost::json::object> open_game_json(const char *filename) {
std::ifstream file(filename);
if (!file.is_open()) {
return std::nullopt;
}
std::string game_json((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
return boost::json::parse(game_json).as_object();
}
Hanabi::Game get_game(std::variant<int, std::string> game_spec, std::optional<uint8_t> score_goal){
const std::optional<boost::json::object> game_json_opt = [&game_spec]() {
if (game_spec.index() == 0) {
return download_game_json(std::get<int>(game_spec));
} else {
return open_game_json(std::get<std::string>(game_spec).c_str());
}
}();
if (!game_json_opt.has_value() or game_json_opt.value().empty()) {
2023-11-15 23:23:21 +01:00
return {nullptr, {}};
}
2023-11-15 23:23:21 +01:00
Hanabi::GameInfo game_info = Parsing::parse_game(game_json_opt.value());
return {make_game_state(game_info.num_suits, game_info.num_players, game_info.deck, score_goal), game_info};
}
} // namespace Download