#include "Snapshot.h" #include #include #include #include #include #include #include #include #include "Killmail.h" #include "Owner.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) Snapshot::Snapshot(const char* filename) : m_killmails {}, m_teams {} { 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]; int team = 0; for (const auto& members : dump.at("teams")) { for (const auto& entry : members) { const auto id = entry.get(); m_teams[id] = team; } ++team; } UnloadFileText(text); } std::vector Snapshot::killmails() const { return m_killmails; } int Snapshot::team(const Owner& owner) const { auto find = [this](long int id) -> int { if (id < 0) return -1; const auto search = m_teams.find(id); if (search == m_teams.end()) return -1; return search->second; }; int id; if ((id = find(owner.faction)) != -1) return id; if ((id = find(owner.alliance)) != -1) return id; if ((id = find(owner.corporation)) != -1) return id; return -1; } 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); }