#include "DumpSource.h" #include #include #include #include #include #include #include #include "Killmail.h" using json = nlohmann::json; using tm = std::tm; void from_json(const json& j, tm& d); void from_json(const json& j, Killmail& km); NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(LongVector3, x, y, z) DumpSource::DumpSource(const char* filename) : m_killmails {} { if (!FileExists(filename)) throw "File does not exist"; char* text = LoadFileText(filename); auto dump = json::parse(text); std::unordered_map group_lookup; for (const auto& item : dump["types"]) { const auto type_id = item["type_id"].get(); item["group_id"].get_to(group_lookup[type_id]); } dump.at("killmails").get_to(m_killmails); for (auto& km : m_killmails) km.group = group_lookup[km.ship]; UnloadFileText(text); } std::vector DumpSource::killmails() const { return m_killmails; } void from_json(const json& j, tm& d) { std::istringstream str(j.get()); str >> std::get_time(&d, "%Y-%m-%dT%H:%M:%SZ"); } void from_json(const json& j, Killmail& km) { j.at("solar_system_id").get_to(km.location); j.at("victim").at("ship_type_id").get_to(km.ship); j.at("victim").at("position").get_to(km.position); if (j.at("victim").contains("character_id")) j.at("victim").at("character_id").get_to(km.owner.character); j.at("victim").at("corporation_id").get_to(km.owner.corporation); if (j.at("victim").contains("alliance_id")) j.at("victim").at("alliance_id").get_to(km.owner.alliance); if (j.at("victim").contains("faction_id")) j.at("victim").at("faction_id").get_to(km.owner.faction); auto calendar = j.at("killmail_time").get(); km.time = std::mktime(&calendar); }