public void HandleProfile(JObject profile) { // Obtain the current ship from the profile Ship profileCurrentShip = FrontierApi.ShipFromJson((JObject)profile["ship"]); // Obtain the shipyard from the profile List <Ship> profileShipyard = FrontierApi.ShipyardFromJson(profileCurrentShip, profile); if (profileCurrentShip != null) { currentProfileId = profileCurrentShip.LocalId; if (currentShipId == null) { // This means that we don't have any info so far; set our active ship currentShipId = profileCurrentShip.LocalId; } Logging.Debug("Current Ship Id is: " + currentShipId + ", Profile Ship Id is: " + profileCurrentShip.LocalId); if (currentShipId == profileCurrentShip.LocalId) { Ship ship = GetShip(currentShipId); if (ship == null) { // Information from the Frontier API can be out-of-date, use it to set our ship if we don't know what it already is ship = profileCurrentShip; AddShip(ship); } else { ship.raw = profileCurrentShip.raw; ship.launchbays = profileCurrentShip.launchbays; ship.paintjob = profileCurrentShip.paintjob; if (ship.cargohatch != null) { // Engineering info for each module isn't in the journal, but we only use this to pass on to Coriolis so don't // need to splice it in to our model. We do, however, have cargo hatch information from the journal that we // want to make avaialable to Coriolis so need to parse the raw data and add cargo hatch info as appropriate JObject cargoHatchModule = new JObject { { "on", ship.cargohatch.enabled }, { "priority", ship.cargohatch.priority }, { "value", ship.cargohatch.price }, { "health", ship.cargohatch.health }, { "name", "ModularCargoBayDoor" } }; JObject cargoHatchSlot = new JObject { { "module", cargoHatchModule } }; JObject parsedRaw = JObject.Parse(profileCurrentShip.raw); parsedRaw["modules"]["CargoHatch"] = cargoHatchSlot; ship.raw = parsedRaw.ToString(Formatting.None); } } Logging.Debug("Ship is: " + JsonConvert.SerializeObject(ship)); } } // Prune ships from the Shipyard that are not found in the Profile Shipyard List <int> idsToRemove = new List <int>(shipyard.Count); foreach (Ship ship in shipyard) { Ship profileShip = profileShipyard.FirstOrDefault(s => s.LocalId == ship.LocalId); if (profileShip == null) { idsToRemove.Add(ship.LocalId); } } _RemoveShips(idsToRemove); // Add ships from the Profile Shipyard that are not found in the Shipyard // Update name, ident and value of ships in the Shipyard foreach (Ship profileShip in profileShipyard) { Ship ship = GetShip(profileShip.LocalId); if (ship == null) { // This is a new ship, add it to the shipyard AddShip(profileShip); } } writeShips(); }
// Note: At a minimum, the API Profile data is required to update the current ship's launchbay status public void HandleProfile(JObject profile) { // Obtain the current ship from the profile Ship profileCurrentShip = FrontierApi.ShipFromJson((JObject)profile["ship"]); // Obtain the shipyard from the profile List <Ship> profileShipyard = FrontierApi.ShipyardFromJson(profileCurrentShip, profile); if (profileCurrentShip != null) { currentProfileId = profileCurrentShip.LocalId; if (currentShipId == null) { // This means that we don't have any info so far; set our active ship currentShipId = profileCurrentShip.LocalId; } Logging.Debug("Current Ship Id is: " + currentShipId + ", Profile Ship Id is: " + profileCurrentShip.LocalId); if (currentShipId == profileCurrentShip.LocalId) { Ship ship = GetShip(currentShipId); if (ship == null) { // Information from the Frontier API can be out-of-date, use it to set our ship if we don't know what it already is ship = profileCurrentShip; AddShip(ship); } // Ship launchbay data is exclusively from the API, always update. else { if (profileCurrentShip.launchbays == null || !profileCurrentShip.launchbays.Any()) { ship.launchbays.Clear(); } else { ship.launchbays = profileCurrentShip.launchbays; } } Logging.Debug("Ship is: " + JsonConvert.SerializeObject(ship)); } } // Prune ships from the Shipyard that are not found in the Profile Shipyard List <int> idsToRemove = new List <int>(shipyard.Count); foreach (Ship ship in shipyard) { Ship profileShip = profileShipyard.FirstOrDefault(s => s.LocalId == ship.LocalId); if (profileShip == null) { idsToRemove.Add(ship.LocalId); } } _RemoveShips(idsToRemove); // Add ships from the Profile Shipyard that are not found in the Shipyard // Update name, ident and value of ships in the Shipyard foreach (Ship profileShip in profileShipyard) { Ship ship = GetShip(profileShip.LocalId); if (ship == null) { // This is a new ship, add it to the shipyard AddShip(profileShip); } } writeShips(); }
public void HandleProfile(JObject profile) { // Obtain the current ship from the profile Ship profileCurrentShip = FrontierApi.ShipFromJson((JObject)profile["ship"]); // Obtain the shipyard from the profile List <Ship> profileShipyard = FrontierApi.ShipyardFromJson(profileCurrentShip, profile); // Information from the Frontier API can be out-of-date so we only use it to set our ship if we don't know what it already is if (currentShipId == null) { // This means that we don't have any info so far; set our active ship if (profileCurrentShip != null) { SetCurrentShip(profileCurrentShip.LocalId, profileCurrentShip.model); } } // Add the raw JSON for each known ship provided in the profile // TODO Rationalise companion API data - munge the JSON according to the compartment information, removing anything that is out-of-sync if (profileCurrentShip != null) { Ship ship = GetShip(profileCurrentShip.LocalId); if (ship == null) { // This means that we haven't seen the ship in the profile before. Add it to the shipyard ship = profileCurrentShip; AddShip(ship); } if (ship.model == null) { // We don't know this ship's model but can fill it from the info we have ship.model = profileCurrentShip.model; ship.Augment(); } // Obtain items that we can't obtain from the journal ship.value = profileCurrentShip.value; if (ship.cargohatch != null) { // Engineering info for each module isn't in the journal, but we only use this to pass on to Coriolis so don't // need to splice it in to our model. We do, however, have cargo hatch information from the journal that we // want to make avaialable to Coriolis so need to parse the raw data and add cargo hatch info as appropriate JObject cargoHatchModule = new JObject { { "on", ship.cargohatch.enabled }, { "priority", ship.cargohatch.priority }, { "value", ship.cargohatch.price }, { "health", ship.cargohatch.health }, { "name", "ModularCargoBayDoor" } }; JObject cargoHatchSlot = new JObject { { "module", cargoHatchModule } }; JObject parsedRaw = JObject.Parse(profileCurrentShip.raw); parsedRaw["modules"]["CargoHatch"] = cargoHatchSlot; ship.raw = parsedRaw.ToString(Formatting.None); } } // As of 2.3.0 Frontier no longer supplies module information for ships other than the active ship, so we // keep around the oldest information that we have available //foreach (Ship profileShip in profileShipyard) //{ // Ship ship = GetShip(profileShip.LocalId); // if (ship != null) // { // ship.raw = profileShip.raw; // if (ship.model == null) // { // // We don't know this ship's model but can fill it from the info we have // ship.model = profileShip.model; // ship.Augment(); // } // // Obtain items that we can't obtain from the journal // ship.value = profileShip.value; // } //} writeShips(); }