public void Execute(CommandLineApplication command)
        {
            //public async System.Threading.Tasks.Task GetFileContent(string path, string container,string localFolder)
            command.Description = "Get attribute from terraform config";
            command.HelpOption("-?|-h|--help");
            var attribute = command.Argument("attribute", "Attribute from terraform resource");

            var tfstate = command.Option("-t|--tfstate", "Teraform state file", CommandOptionType.SingleValue);
            var res     = command.Option("-k|--resourcekey", "Teraform resource key file", CommandOptionType.SingleValue);
            var file    = command.Option("-s|--save", "Save as file", CommandOptionType.SingleValue);

            command.OnExecute(async() =>
            {
                var state          = new TerraformState(new StateFileContent(tfstate.HasValue() ? tfstate.Value() : null));
                var attributeValue = attribute.Value;
                if (res.HasValue())
                {
                    attributeValue = res.Value() + attribute.Value;
                }
                var content = state.GetResourceByPath(attributeValue);
                if (file.HasValue())
                {
                    await File.WriteAllTextAsync(file.Value(), content);
                }
                else
                {
                    Console.WriteLine(content);
                }
                return(0);
            });
        }
Exemple #2
0
        public void Execute(CommandLineApplication command)
        {
            //public async System.Threading.Tasks.Task GetFileContent(string path, string container,string localFolder)
            command.Description = "Replace wildcards in files with attributes from trerraform config. " +
                                  "All @#terraform.azurerm_function_app.test.storage_connection_string strings will be replaced with azurerm_function_app.test.storage_connection_string value taken fom terraform state file";

            command.HelpOption("-?|-h|--help");
            var files    = command.Argument("file", "Files to replace tags", multipleValues: true);
            var tfperfix = command.Option("-g|--tag", "Specify tag prefix if different than default @#terraform", CommandOptionType.SingleValue);
            var pattern  = command.Option("-p|--pattern", "Search pattern", CommandOptionType.SingleValue);
            var tfstate  = command.Option("-t|--tfstate", "Teraform state file", CommandOptionType.SingleValue);
            var res      = command.Option("-k|--resourcekey", "Teraform resource key file", CommandOptionType.SingleValue);
            var pipe     = command.Option("-o|--output", "If speficied, changes will be print on stdo instead of replacing the file", CommandOptionType.NoValue);


            command.OnExecute(() =>
            {
                var prefix = "@#terraform.";
                if (tfperfix.HasValue())
                {
                    prefix = tfperfix.Value();
                }
                var state = new TerraformState(new StateFileContent(tfstate.HasValue() ? tfstate.Value() : null));
                var fi    = new List <string>();

                foreach (var item in files.Values.Select(e => e.TrimEnd('/', '\\')))
                {
                    if (Directory.Exists(item))
                    {
                        if (pattern.HasValue())
                        {
                            pattern.Value().Split('|').ToList()
                            .ForEach(p =>
                            {
                                var f = Directory.EnumerateFiles(item, p, new EnumerationOptions {
                                    RecurseSubdirectories = true
                                });
                                fi.AddRange(f);
                            });
                        }
                        else
                        {
                            var f = Directory.EnumerateFiles(item, "*.*", new EnumerationOptions {
                                RecurseSubdirectories = true
                            });
                            fi.AddRange(f);
                        }
                    }
                    else
                    {
                        fi.Add(item);
                    }
                }
                fi.ForEach(e => Replace(e, state, prefix, pipe.HasValue()));
                return(0);
            });
        }
Exemple #3
0
        public string Build(string tfstate, string res)
        {
            var state = new TerraformState(new StateFileContent(tfstate));
            var sqlServerResourceId = state.GetDependencies(res).First(z => z.Contains("azurerm_sql_server"));
            var server       = state.GetResourceByPath(sqlServerResourceId + ".fully_qualified_domain_name");
            var user         = state.GetResourceByPath(sqlServerResourceId + ".administrator_login");
            var pwd          = state.GetResourceByPath(sqlServerResourceId + ".administrator_login_password");
            var databaseName = state.GetResourceByPath(res + ".name");

            return($"Server=tcp:{server},1433;Initial Catalog={databaseName};Persist Security Info=False;User ID={user};Password={pwd};MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;");
        }
Exemple #4
0
        private string GetConnectionString(CommandOption cs, CommandOption tfstate, CommandOption res)
        {
            string connectionString = null;

            if (res.HasValue())
            {
                var tfFile  = tfstate.HasValue() ? tfstate.Value() : null;
                var storage = new TerraformState(new StateFileContent(tfFile));
                connectionString = storage.GetBlobConnectionString(res.Value());
            }
            else
            {
                connectionString = cs.Value();
            }
            return(connectionString);
        }
Exemple #5
0
        public void Replace(string path, TerraformState state, string tag, bool print_on_output)
        {
            var file         = File.ReadAllText(path);
            var matches      = Regex.Matches(file, tag + "([0-9a-z_.-]*)");
            var replacements = new List <Tuple <string, string> >();

            if (matches.Count == 0)
            {
                return;
            }
            if (print_on_output == false)
            {
                Console.WriteLine("Replacing " + path);
            }
            string itemToReplace = "";

            foreach (Match item in matches)
            {
                try
                {
                    itemToReplace = item.Groups[1].Value;
                    var res = state.GetResourceByPath(itemToReplace);
                    replacements.Add(new Tuple <string, string>(tag + itemToReplace, res));
                }catch (Exception exc)
                {
                    if (print_on_output == false)
                    {
                        Console.WriteLine($"Provided key = {itemToReplace} doesn't exists");
                    }
                }
            }
            foreach (var rep in replacements)
            {
                file = file.Replace(rep.Item1, rep.Item2);
            }
            if (print_on_output == false)
            {
                File.WriteAllText(path, file);
            }
        }
Exemple #6
0
        private Body ParseStarMapBody(JObject body, string systemName)
        {
            // General items
            long?    bodyId            = (long?)body["bodyId"];
            long?    EDSMID            = (long?)body["id"];
            string   bodyname          = (string)body["name"];
            BodyType bodyType          = BodyType.FromName((string)body["type"]) ?? BodyType.None;
            decimal? distanceLs        = (decimal?)body["distanceToArrival"]; // Light Seconds
            decimal? temperatureKelvin = (long?)body["surfaceTemperature"];   // Kelvin

            // Orbital characteristics
            decimal?orbitalPeriodDays         = (decimal?)body["orbitalPeriod"];                           // Days
            decimal?semimajoraxisLs           = ConstantConverters.au2ls((decimal?)body["semiMajorAxis"]); // Light seconds
            decimal?eccentricity              = (decimal?)body["orbitalEccentricity"];
            decimal?orbitalInclinationDegrees = (decimal?)body["orbitalInclination"];                      // Degrees
            decimal?periapsisDegrees          = (decimal?)body["argOfPeriapsis"];                          // Degrees
            decimal?rotationPeriodDays        = (decimal?)body["rotationalPeriod"];                        // Days
            decimal?axialTiltDegrees          = (decimal?)body["axialTilt"];                               // Degrees

            List <IDictionary <string, object> > parents = new List <IDictionary <string, object> >();

            if (body["parents"] != null)
            {
                // Parent body types and IDs
                parents = body["parents"].ToObject <List <IDictionary <string, object> > >() ?? new List <IDictionary <string, object> >();
            }

            List <Ring> rings = new List <Ring>();

            if ((JArray)body["rings"] != null || (JArray)body["belts"] != null)
            {
                var ringsData = body["rings"] ?? body["belts"];
                if (ringsData != null)
                {
                    foreach (JObject ring in ringsData)
                    {
                        rings.Add(new Ring(
                                      (string)ring["name"],
                                      RingComposition.FromName((string)ring["type"]),
                                      (decimal)ring["mass"],
                                      (decimal)ring["innerRadius"],
                                      (decimal)ring["outerRadius"]
                                      ));
                    }
                }
            }

            if ((string)body["type"] == "Star")
            {
                // Star-specific items
                string stellarclass      = ((string)body["subType"]).Split(' ')[0]; // Splits "B (Blue-White) Star" to "B"
                int?   stellarsubclass   = null;
                string endOfStellarClass = stellarclass.ToCharArray().ElementAt(stellarclass.Length - 1).ToString();
                if (int.TryParse(endOfStellarClass, out int subclass))
                {
                    // If our stellarclass ends in a number, we need to separate the class from the subclass
                    stellarsubclass = subclass;
                    stellarclass    = stellarclass.Replace(endOfStellarClass, "");
                }

                long?   ageMegaYears      = (long?)body["age"]; // Age in megayears
                string  luminosityclass   = (string)body["luminosity"];
                decimal?absolutemagnitude = (decimal?)body["absoluteMagnitude"];
                decimal?stellarMass       = (decimal?)body["solarMasses"];
                decimal?solarradius       = (decimal?)body["solarRadius"];
                decimal radiusKm          = (decimal)(solarradius != null ? solarradius * Constants.solarRadiusMeters / 1000 : null);

                Body Body = new Body(bodyname, bodyId, parents, distanceLs, stellarclass, stellarsubclass, stellarMass,
                                     radiusKm, absolutemagnitude, ageMegaYears, temperatureKelvin, luminosityclass, semimajoraxisLs,
                                     eccentricity, orbitalInclinationDegrees, periapsisDegrees, orbitalPeriodDays, rotationPeriodDays,
                                     axialTiltDegrees, rings, true, false, systemName, null)
                {
                    EDSMID = EDSMID
                };
                DateTime updatedAt = JsonParsing.getDateTime("updateTime", body);
                Body.updatedat = updatedAt == null ? null : (long?)Dates.fromDateTimeToSeconds(updatedAt);

                return(Body);
            }

            if ((string)body["type"] == "Planet")
            {
                // Planet and moon specific items
                PlanetClass    planetClass    = PlanetClass.FromName((string)body["subType"]) ?? PlanetClass.None;
                bool?          tidallylocked  = (bool?)body["rotationalPeriodTidallyLocked"] ?? false;
                bool?          landable       = (bool?)body["isLandable"];
                decimal?       gravity        = (decimal?)body["gravity"]; // G's
                decimal?       earthmass      = (decimal?)body["earthMasses"];
                decimal?       radiusKm       = (decimal?)body["radius"];  // Kilometers
                TerraformState terraformState = TerraformState.FromName((string)body["terraformingState"]) ?? TerraformState.NotTerraformable;

                Volcanism volcanism = null;
                if ((string)body["volcanismType"] != null)
                {
                    volcanism = Volcanism.FromName((string)body["volcanismType"]);
                }

                List <AtmosphereComposition> atmosphereCompositions = new List <AtmosphereComposition>();
                if (body["atmosphereComposition"] is JObject)
                {
                    var compositions = body["atmosphereComposition"].ToObject <Dictionary <string, decimal?> >();

                    foreach (KeyValuePair <string, decimal?> compositionKV in compositions)
                    {
                        string  compositionName = compositionKV.Key;
                        decimal?share           = compositionKV.Value;
                        if (compositionName != null && share != null)
                        {
                            atmosphereCompositions.Add(new AtmosphereComposition(compositionName, (decimal)share));
                        }
                    }
                    if (atmosphereCompositions.Count > 0)
                    {
                        atmosphereCompositions = atmosphereCompositions.OrderByDescending(x => x.percent).ToList();
                    }
                }
                decimal?        pressureAtm     = (decimal?)body["surfacePressure"];
                AtmosphereClass atmosphereClass = null;
                if (((string)body["subType"]).Contains("gas giant") &&
                    (string)body["atmosphereType"] == "No atmosphere")
                {
                    // EDSM classifies any body with an empty string atmosphere property as "No atmosphere".
                    // However, gas giants also receive an empty string. Fix it, since gas giants have atmospheres.
                    atmosphereClass = AtmosphereClass.FromEDName("GasGiant");
                }
                else
                {
                    atmosphereClass = AtmosphereClass.FromName((string)body["atmosphereType"]);
                }

                List <SolidComposition> solidCompositions = new List <SolidComposition>();
                if (body["solidComposition"] is JObject)
                {
                    var compositions = body["solidComposition"].ToObject <Dictionary <string, decimal?> >();

                    foreach (KeyValuePair <string, decimal?> compositionKV in compositions)
                    {
                        string  composition = compositionKV.Key;
                        decimal?share       = compositionKV.Value;
                        if (composition != null && share != null)
                        {
                            solidCompositions.Add(new SolidComposition(composition, (decimal)share));
                        }
                    }
                    if (solidCompositions.Count > 0)
                    {
                        solidCompositions = solidCompositions.OrderByDescending(x => x.percent).ToList();
                    }
                }

                List <MaterialPresence> materials = new List <MaterialPresence>();
                if (body["materials"] is JObject)
                {
                    var materialsData = body["materials"].ToObject <Dictionary <string, decimal?> >();
                    foreach (KeyValuePair <string, decimal?> materialKV in materialsData)
                    {
                        Material material = Material.FromName(materialKV.Key);
                        decimal? amount   = materialKV.Value;
                        if (material != null && amount != null)
                        {
                            materials.Add(new MaterialPresence(material, (decimal)amount));
                        }
                    }
                    if (materials.Count > 0)
                    {
                        materials = materials.OrderByDescending(o => o.percentage).ToList();
                    }
                }
                ReserveLevel reserveLevel = ReserveLevel.FromName((string)body["reserveLevel"]) ?? ReserveLevel.None;

                DateTime updatedAt = JsonParsing.getDateTime("updateTime", body);
                Body     Body      = new Body(bodyname, bodyId, parents, distanceLs, tidallylocked, terraformState, planetClass, atmosphereClass, atmosphereCompositions, volcanism, earthmass, radiusKm, (decimal)gravity, temperatureKelvin, pressureAtm, landable, materials, solidCompositions, semimajoraxisLs, eccentricity, orbitalInclinationDegrees, periapsisDegrees, orbitalPeriodDays, rotationPeriodDays, axialTiltDegrees, rings, reserveLevel, true, true, systemName, null)
                {
                    EDSMID    = EDSMID,
                    updatedat = updatedAt == null ? null : (long?)Dates.fromDateTimeToSeconds(updatedAt)
                };

                return(Body);
            }


            return(null);
        }
        public JournalScan(JObject evt) : base(evt, JournalTypeEnum.Scan)
        {
            ScanType = evt["ScanType"].Str();
            BodyName = evt["BodyName"].Str();
            BodyID   = evt["BodyID"].IntNull();
            StarType = evt["StarType"].StrNull();

            DistanceFromArrivalLS = evt["DistanceFromArrivalLS"].Double();

            nAge               = evt["Age_MY"].DoubleNull();
            nStellarMass       = evt["StellarMass"].DoubleNull();
            nRadius            = evt["Radius"].DoubleNull();
            nAbsoluteMagnitude = evt["AbsoluteMagnitude"].DoubleNull();
            Luminosity         = evt["Luminosity"].StrNull();

            nRotationPeriod = evt["RotationPeriod"].DoubleNull();

            nOrbitalPeriod      = evt["OrbitalPeriod"].DoubleNull();
            nSemiMajorAxis      = evt["SemiMajorAxis"].DoubleNull();
            nEccentricity       = evt["Eccentricity"].DoubleNull();
            nOrbitalInclination = evt["OrbitalInclination"].DoubleNull();
            nPeriapsis          = evt["Periapsis"].DoubleNull();
            nAxialTilt          = evt["AxialTilt"].DoubleNull();

            Rings = evt["Rings"]?.ToObjectProtected <StarPlanetRing[]>(); // may be Null

            nTidalLock     = evt["TidalLock"].Bool();
            TerraformState = evt["TerraformState"].StrNull();
            if (TerraformState != null && TerraformState.Equals("Not Terraformable", StringComparison.InvariantCultureIgnoreCase)) // EDSM returns this, normalise to journal
            {
                TerraformState = String.Empty;
            }
            PlanetClass = evt["PlanetClass"].StrNull();

            Atmosphere = evt["Atmosphere"].StrNull();
            if (Atmosphere == null || Atmosphere.Length == 0)             // Earthlikes appear to have empty atmospheres but AtmosphereType
            {
                Atmosphere = evt["AtmosphereType"].StrNull();
            }
            if (Atmosphere != null)
            {
                Atmosphere = Atmosphere.SplitCapsWordFull();
            }

            AtmosphereID        = Bodies.AtmosphereStr2Enum(Atmosphere, out AtmosphereProperty);
            Volcanism           = evt["Volcanism"].StrNull();
            VolcanismID         = Bodies.VolcanismStr2Enum(Volcanism, out VolcanismProperty);
            nMassEM             = evt["MassEM"].DoubleNull();
            nSurfaceGravity     = evt["SurfaceGravity"].DoubleNull();
            nSurfaceTemperature = evt["SurfaceTemperature"].DoubleNull();
            nSurfacePressure    = evt["SurfacePressure"].DoubleNull();
            nLandable           = evt["Landable"].BoolNull();

            ReserveLevelStr = evt["ReserveLevel"].Str();

            if (IsStar)
            {
                StarTypeID = Bodies.StarStr2Enum(StarType);

                if (nRadius.HasValue && nSurfaceTemperature.HasValue)
                {
                    HabitableZoneInner = DistanceForBlackBodyTemperature(315);
                    HabitableZoneOuter = DistanceForBlackBodyTemperature(223);
                }
            }
            else if (PlanetClass != null)
            {
                PlanetTypeID = Bodies.PlanetStr2Enum(PlanetClass);
                // Fix naming to standard and fix case..
                PlanetClass = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.
                              ToTitleCase(PlanetClass.ToLower()).Replace("Ii ", "II ").Replace("Iv ", "IV ").Replace("Iii ", "III ");
            }
            else
            {
                PlanetTypeID = EDPlanet.Unknown;
            }

            JToken mats = (JToken)evt["Materials"];

            if (mats != null)
            {
                if (mats.Type == JTokenType.Object)
                {
                    Materials = mats?.ToObjectProtected <Dictionary <string, double> >();
                }
                else
                {
                    Materials = new Dictionary <string, double>();
                    foreach (JObject jo in mats)
                    {
                        Materials[(string)jo["Name"]] = jo["Percent"].Double();
                    }
                }
            }

            JToken atmos = (JToken)evt["AtmosphereComposition"];

            if (atmos != null)
            {
                if (atmos.Type == JTokenType.Object)
                {
                    AtmosphereComposition = atmos?.ToObjectProtected <Dictionary <string, double> >();
                }
                else
                {
                    AtmosphereComposition = new Dictionary <string, double>();
                    foreach (JObject jo in atmos)
                    {
                        AtmosphereComposition[(string)jo["Name"]] = jo["Percent"].Double();
                    }
                }
            }

            JToken composition = evt["Composition"];

            if (composition != null)
            {
                PlanetComposition = new Dictionary <string, double>();
                foreach (JProperty jp in composition)
                {
                    PlanetComposition[jp.Name] = (double)jp.Value;
                }
            }

            EstimatedValue = CalculateEstimatedValue();

            if (evt["Parents"] != null)
            {
                Parents = new List <BodyParent>();
                foreach (JObject parent in evt["Parents"])
                {
                    JProperty prop = parent.Properties().First();
                    Parents.Add(new BodyParent {
                        Type = prop.Name, BodyID = prop.Value.Int()
                    });
                }
            }

            // EDSM bodies fields

            IsEDSMBody = evt["EDDFromEDSMBodie"].Bool(false);           // Bodie? Who is bodie?  Did you mean Body Finwen ;-)

            JToken discovery = evt["discovery"];

            if (discovery != null)
            {
                EDSMDiscoveryCommander = discovery["commander"].StrNull();
                EDSMDiscoveryUTC       = discovery["date"].DateTimeUTC();
            }
        }
        private int EstimatedValueED22()
        {
            if (IsStar)
            {
                switch (StarTypeID)      // http://elite-dangerous.wikia.com/wiki/Explorer
                {
                case EDStar.O:
                    //low = 3677;
                    //high = 4465;
                    return(4170);

                case EDStar.B:
                    //low = 2992;
                    //high = 3456;
                    return(3098);

                case EDStar.A:
                    //low = 2938;
                    //high = 2986;
                    return(2950);

                case EDStar.F:
                    //low = 2915;
                    //high = 2957;
                    return(2932);

                case EDStar.G:
                    //low = 2912;
                    //high = 2935;
                    // also have a G8V
                    return(2923);

                case EDStar.K:
                    //low = 2898;
                    //high = 2923;
                    return(2911);

                case EDStar.M:
                    //low = 2887;
                    //high = 2905;
                    return(2911);

                // dwarfs
                case EDStar.L:
                    //low = 2884;
                    //high = 2890;
                    return(2887);

                case EDStar.T:
                    //low = 2881;
                    //high = 2885;
                    return(2883);

                case EDStar.Y:
                    //low = 2880;
                    //high = 2882;
                    return(2881);

                // proto stars
                case EDStar.AeBe:        // Herbig
                    //                ??
                    //low = //high = 0;
                    return(2500);

                case EDStar.TTS:
                    //low = 2881;
                    //high = 2922;
                    return(2900);

                // wolf rayet
                case EDStar.W:
                case EDStar.WN:
                case EDStar.WNC:
                case EDStar.WC:
                case EDStar.WO:
                    //low = //high = 7794;
                    return(7794);

                // Carbon
                case EDStar.CS:
                case EDStar.C:
                case EDStar.CN:
                case EDStar.CJ:
                case EDStar.CHd:
                    //low = //high = 2920;
                    return(2920);

                case EDStar.MS:     //seen in log
                case EDStar.S:      // seen in log
                                    //                ??
                                    //low = //high = 0;
                    return(2000);


                // white dwarf
                case EDStar.D:
                case EDStar.DA:
                case EDStar.DAB:
                case EDStar.DAO:
                case EDStar.DAZ:
                case EDStar.DAV:
                case EDStar.DB:
                case EDStar.DBZ:
                case EDStar.DBV:
                case EDStar.DO:
                case EDStar.DOV:
                case EDStar.DQ:
                case EDStar.DC:
                case EDStar.DCV:
                case EDStar.DX:
                    //low = 25000;
                    //high = 27000;

                    return(26000);

                case EDStar.N:
                    //low = 43276;
                    //high = 44619;
                    return(43441);

                case EDStar.H:
                    //low = 44749;
                    //high = 80305;
                    return(61439);

                case EDStar.X:
                case EDStar.A_BlueWhiteSuperGiant:
                case EDStar.F_WhiteSuperGiant:
                case EDStar.M_RedSuperGiant:
                case EDStar.M_RedGiant:
                case EDStar.K_OrangeGiant:
                case EDStar.RoguePlanet:

                default:
                    //low = 0;
                    //high = 0;
                    return(2000);
                }
            }
            else                      // Planet
            {
                switch (PlanetTypeID) // http://elite-dangerous.wikia.com/wiki/Explorer
                {
                case EDPlanet.Icy_body:
                    //low = 792; // (0.0001 EM)
                    //high = 1720; // 89.17
                    return(933);    // 0.04

                case EDPlanet.Rocky_ice_body:
                    //low = 792; // (0.0001 EM)
                    //high = 1720; // 89.17
                    return(933);    // 0.04

                case EDPlanet.Rocky_body:
                    if (TerraformState != null && TerraformState.ToLower().Equals("terraformable"))
                    {
                        //low = 36000;
                        //high = 36500;
                        return(37000);
                    }
                    else
                    {
                        //low = 792; // (0.0001 EM)
                        //high = 1720; // 89.17
                        return(933);    // 0.04
                    }

                case EDPlanet.Metal_rich_body:
                    //low = 9145; // (0.0002 EM)
                    //high = 14562; // (4.03 EM)
                    return(12449);    // 0.51 EM

                case EDPlanet.High_metal_content_body:
                    if (TerraformState != null && TerraformState.ToLower().Equals("terraformable"))
                    {
                        //low = 36000;
                        //high = 54000;
                        return(42000);
                    }
                    else
                    {
                        //low = 4966; // (0.0015 EM)
                        //high = 9632;  // 31.52 EM
                        return(6670);    // 0.41
                    }

                case EDPlanet.Earthlike_body:
                    //low = 65000; // 0.24 EM
                    //high = 71885; // 196.60 EM
                    return(67798);    // 0.47 EM

                case EDPlanet.Water_world:
                    //low = 26589; // (0.09 EM)
                    //high = 43437; // (42.77 EM)
                    return(30492);    // (0.82 EM)

                case EDPlanet.Ammonia_world:
                    //low = 37019; // 0.09 EM
                    //high = 71885; //(196.60 EM)
                    return(40322);    // (0.41 EM)

                case EDPlanet.Sudarsky_class_I_gas_giant:
                    //low = 2472; // (2.30 EM)
                    //high = 4514; // (620.81 EM
                    return(3400);     // 62.93 EM

                case EDPlanet.Sudarsky_class_II_gas_giant:
                    //low = 8110; // (5.37 EM)
                    //high = 14618; // (949.98 EM)
                    return(12319);     // 260.84 EM

                case EDPlanet.Sudarsky_class_III_gas_giant:
                    //low = 1368; // (10.16 EM)
                    //high = 2731; // (2926 EM)
                    return(2339);    // 990.92 EM

                case EDPlanet.Sudarsky_class_IV_gas_giant:
                    //low = 2739; //(2984 EM)
                    //high = 2827; // (3697 EM)
                    return(2782);    // 3319 em

                case EDPlanet.Sudarsky_class_V_gas_giant:
                    //low = 2225; // 688.2 EM
                    //high = 2225;
                    return(2225);



                case EDPlanet.Water_giant:
                case EDPlanet.Water_giant_with_life:
                case EDPlanet.Gas_giant_with_water_based_life:
                case EDPlanet.Gas_giant_with_ammonia_based_life:
                case EDPlanet.Helium_rich_gas_giant:
                case EDPlanet.Helium_gas_giant:
                    //low = 0;
                    //high = 0;
                    return(2000);

                default:
                    //low = 0;
                    //high = 2000;
                    return(0);
                }
            }
        }
Exemple #9
0
        private static Body ParseEddbBody(object response)
        {
            JObject bodyJson = ((JObject)response);

            Body Body = new Body
            {
                // General items
                EDDBID       = (long)bodyJson["id"],
                updatedat    = (long)(Dates.fromDateTimeStringToSeconds((string)bodyJson["updated_at"])),
                name         = (string)bodyJson["name"],
                Type         = BodyType.FromEDName((string)bodyJson["group_name"]),
                systemEDDBID = (long)bodyJson["system_id"],

                // Orbital data
                distance         = (decimal?)bodyJson["distance_to_arrival"],                                // Light seconds
                temperature      = (decimal?)bodyJson["surface_temperature"],                                //Kelvin
                tidallylocked    = (bool?)bodyJson["is_rotational_period_tidally_locked"] ?? false,          // Days
                rotationalperiod = (decimal?)(double?)bodyJson["rotational_period"],                         // Days
                tilt             = (decimal?)(double?)bodyJson["axis_tilt"],                                 // Degrees
                semimajoraxis    = ConstantConverters.au2ls((decimal?)(double?)bodyJson["semi_major_axis"]), // Light Seconds
                orbitalperiod    = (decimal?)(double?)bodyJson["orbital_period"],                            // Days
                periapsis        = (decimal?)(double?)bodyJson["arg_of_periapsis"],                          // Degrees
                eccentricity     = (decimal?)(double?)bodyJson["orbital_eccentricity"],
                inclination      = (decimal?)(double?)bodyJson["orbital_inclination"]                        // Degrees
            };

            if ((string)bodyJson["group_name"] == "belt")
            {
                // Not interested in asteroid belts,
                // no need to add additional information at this time.
            }

            else if ((string)bodyJson["group_name"] == "star")
            {
                // Star-specific items
                Body.stellarclass    = ((string)bodyJson["spectral_class"])?.ToUpperInvariant();
                Body.luminosityclass = ((string)bodyJson["luminosity_class"])?.ToUpperInvariant();
                Body.solarmass       = (decimal?)(double?)bodyJson["solar_masses"];
                Body.solarradius     = (decimal?)(double?)bodyJson["solar_radius"];
                Body.age             = (long?)bodyJson["age"]; // MegaYears
                Body.mainstar        = (bool?)bodyJson["is_main_star"];
                Body.landable        = false;
                Body.setStellarExtras();
            }

            else if ((string)bodyJson["group_name"] == "planet")
            {
                // Planet-specific items
                Body.planetClass    = PlanetClass.FromEDName((string)bodyJson["type_name"]);
                Body.landable       = (bool?)bodyJson["is_landable"] ?? false;
                Body.earthmass      = (decimal?)(double?)bodyJson["earth_masses"];
                Body.gravity        = (decimal?)(double?)bodyJson["gravity"]; // G's
                Body.radius         = (decimal?)bodyJson["radius"];           // Kilometers
                Body.pressure       = (decimal?)(double?)bodyJson["surface_pressure"] ?? 0;
                Body.terraformState = TerraformState.FromName((string)bodyJson["terraforming_state_name"]);
                // Per Themroc @ EDDB, "Major" and "Minor" volcanism descriptors are stripped from EDDB data.
                Body.volcanism       = Volcanism.FromName((string)bodyJson["volcanism_type_name"]);
                Body.atmosphereclass = AtmosphereClass.FromName((string)bodyJson["atmosphere_type_name"]);
                if (bodyJson["atmosphere_composition"] != null)
                {
                    List <AtmosphereComposition> atmosphereCompositions = new List <AtmosphereComposition>();
                    foreach (JObject atmoJson in bodyJson["atmosphere_composition"])
                    {
                        string  composition = (string)atmoJson["atmosphere_component_name"];
                        decimal?share       = (decimal?)atmoJson["share"];
                        if (composition != null && share != null)
                        {
                            atmosphereCompositions.Add(new AtmosphereComposition(composition, (decimal)share));
                        }
                    }
                    if (atmosphereCompositions.Count > 0)
                    {
                        atmosphereCompositions      = atmosphereCompositions.OrderByDescending(x => x.percent).ToList();
                        Body.atmospherecompositions = atmosphereCompositions;
                    }
                }
                if (bodyJson["solid_composition"] != null)
                {
                    List <SolidComposition> bodyCompositions = new List <SolidComposition>();
                    foreach (JObject bodyCompJson in bodyJson["solid_composition"])
                    {
                        string  composition = (string)bodyCompJson["solid_component_name"];
                        decimal?share       = (decimal?)bodyCompJson["share"];
                        if (composition != null && share != null)
                        {
                            bodyCompositions.Add(new SolidComposition(composition, (decimal)share));
                        }
                    }
                    if (bodyCompositions.Count > 0)
                    {
                        bodyCompositions       = bodyCompositions.OrderByDescending(x => x.percent).ToList();
                        Body.solidcompositions = bodyCompositions;
                    }
                }
                if (bodyJson["materials"] != null)
                {
                    List <MaterialPresence> Materials = new List <MaterialPresence>();
                    foreach (JObject materialJson in bodyJson["materials"])
                    {
                        Material material = Material.FromEDName((string)materialJson["material_name"]);
                        decimal? amount   = (decimal?)(double?)materialJson["share"];
                        if (material != null && amount != null)
                        {
                            Materials.Add(new MaterialPresence(material, (decimal)amount));
                        }
                    }
                    if (Materials.Count > 0)
                    {
                        Body.materials = Materials.OrderByDescending(o => o.percentage).ToList();
                    }
                }
            }

            // Rings may be an object or may be a singular
            List <Ring> rings = new List <Ring>();

            if (bodyJson["rings"] != null)
            {
                foreach (JObject ringJson in bodyJson["rings"])
                {
                    string          name             = (string)ringJson["name"];
                    RingComposition composition      = RingComposition.FromName((string)ringJson["ring_type_name"]);
                    decimal         ringMassMegaTons = (decimal)ringJson["ring_mass"];
                    decimal         innerRadiusKm    = (decimal)ringJson["ring_inner_radius"];
                    decimal         outerRadiusKm    = (decimal)ringJson["ring_outer_radius"];
                    Ring            ring             = new Ring(name, composition, ringMassMegaTons, innerRadiusKm, outerRadiusKm);
                    rings.Add(ring);
                }
            }
            if (bodyJson["ring_type_name"].HasValues)
            {
                string          name             = (string)bodyJson["name"];
                RingComposition composition      = RingComposition.FromName((string)bodyJson["ring_type_name"]);
                decimal         ringMassMegaTons = (decimal)bodyJson["ring_mass"];
                decimal         innerRadiusKm    = (decimal)bodyJson["ring_inner_radius"];
                decimal         outerRadiusKm    = (decimal)bodyJson["ring_outer_radius"];
                Ring            ring             = new Ring(name, composition, ringMassMegaTons, innerRadiusKm, outerRadiusKm);
                rings.Add(ring);
            }
            if (rings.Count > 0)
            {
                Body.rings = rings.OrderBy(o => o.innerradius).ToList();
            }

            return(Body);
        }
Exemple #10
0
        }                                            // One of AutoScan, Basic, Detailed, NavBeacon, NavBeaconDetail
        // AutoScan events are detailed scans triggered via proximity.

        public BodyScannedEvent(DateTime timestamp, string scantype, string name, string systemName, PlanetClass planetClass, decimal?earthmass, decimal?radiusKm, decimal gravity, decimal?temperatureKelvin, decimal?pressureAtm, bool?tidallylocked, bool?landable, AtmosphereClass atmosphereClass, List <AtmosphereComposition> atmosphereComposition, List <SolidComposition> solidCompositions, Volcanism volcanism, decimal distancefromarrival_Ls, decimal orbitalperiodDays, decimal rotationperiodDays, decimal?semimajoraxisAU, decimal?eccentricity, decimal?orbitalinclinationDegrees, decimal?periapsisDegrees, List <Ring> rings, string reserves, List <MaterialPresence> materials, TerraformState terraformstate, decimal?axialtiltDegrees) : base(timestamp, NAME)
        {
            this.scantype              = scantype;
            this.name                  = name;
            this.systemname            = systemName;
            this.distancefromarrival   = distancefromarrival_Ls;
            this.planetClass           = planetClass;
            this.earthmass             = earthmass;
            this.radius                = radiusKm;
            this.gravity               = gravity;
            this.temperature           = temperatureKelvin;
            this.pressure              = pressureAtm;
            this.tidallylocked         = tidallylocked;
            this.landable              = landable;
            this.atmosphereclass       = atmosphereClass;
            this.atmospherecomposition = atmosphereComposition;
            this.solidcomposition      = solidCompositions;
            this.volcanism             = volcanism;
            this.orbitalperiod         = orbitalperiodDays;
            this.rotationperiod        = rotationperiodDays;
            this.semimajoraxis         = semimajoraxisAU;
            this.eccentricity          = eccentricity;
            this.orbitalinclination    = orbitalinclinationDegrees;
            this.periapsis             = periapsisDegrees;
            this.rings                 = rings;
            this.reserves              = reserves;
            this.materials             = materials;
            this.terraformState        = terraformstate;
            this.axialtilt             = axialtiltDegrees;
            this.estimatedvalue        = estimateValue(scantype == null ? false : scantype.Contains("Detail"));
        }
Exemple #11
0
        private static Body ParseStarMapBody(JObject body, string system)
        {
            Body Body = new Body
            {
                // General items
                EDSMID      = (long?)body["id"],
                name        = (string)body["name"],
                systemname  = system,
                Type        = BodyType.FromName((string)body["type"]) ?? BodyType.None,
                distance    = (decimal?)body["distanceToArrival"], // Light Seconds
                temperature = (long?)body["surfaceTemperature"],   // Kelvin

                // Orbital characteristics
                orbitalperiod    = (decimal?)body["orbitalPeriod"],                           // Days
                semimajoraxis    = ConstantConverters.au2ls((decimal?)body["semiMajorAxis"]), // Light seconds
                eccentricity     = (decimal?)body["orbitalEccentricity"],
                inclination      = (decimal?)body["orbitalInclination"],                      // Degrees
                periapsis        = (decimal?)body["argOfPeriapsis"],                          // Degrees
                rotationalperiod = (decimal?)body["rotationalPeriod"],                        // Days
                tidallylocked    = (bool?)body["rotationalPeriodTidallyLocked"] ?? false,
                tilt             = (decimal?)body["axialTilt"]                                // Degrees
            };

            if ((string)body["type"] == "Belt")
            {
                // Not interested in asteroid belts,
                // no need to add additional information at this time.
            }

            if ((string)body["type"] == "Star")
            {
                // Star-specific items
                Body.stellarclass      = ((string)body["subType"]).Split(' ')[0]; // Splits "B (Blue-White) Star" to "B"
                Body.mainstar          = (bool?)body["isMainStar"];
                Body.age               = (long?)body["age"];                      // Age in megayears
                Body.luminosityclass   = (string)body["luminosity"];
                Body.absoluteMagnitude = (decimal?)body["absoluteMagnitude"];
                Body.solarmass         = (decimal?)body["solarMasses"];
                Body.solarradius       = (decimal?)body["solarRadius"];
                Body.landable          = false;
                Body.setStellarExtras();
            }

            if ((string)body["type"] == "Planet")
            {
                // Planet-specific items
                Body.planetClass    = PlanetClass.FromName((string)body["subType"]) ?? PlanetClass.None;
                Body.landable       = (bool?)body["isLandable"];
                Body.gravity        = (decimal?)body["gravity"]; // G's
                Body.earthmass      = (decimal?)body["earthMasses"];
                Body.radius         = (decimal?)body["radius"];  // Kilometers
                Body.terraformState = TerraformState.FromName((string)body["terraformingState"]) ?? TerraformState.NotTerraformable;
                if ((string)body["volcanismType"] != null)
                {
                    Body.volcanism = Volcanism.FromName((string)body["volcanismType"]);
                }

                if (body["atmosphereComposition"] is JObject)
                {
                    List <AtmosphereComposition> atmosphereCompositions = new List <AtmosphereComposition>();
                    var compositions = body["atmosphereComposition"].ToObject <Dictionary <string, decimal?> >();

                    foreach (KeyValuePair <string, decimal?> compositionKV in compositions)
                    {
                        string  compositionName = compositionKV.Key;
                        decimal?share           = compositionKV.Value;
                        if (compositionName != null && share != null)
                        {
                            atmosphereCompositions.Add(new AtmosphereComposition(compositionName, (decimal)share));
                        }
                    }
                    if (atmosphereCompositions.Count > 0)
                    {
                        atmosphereCompositions      = atmosphereCompositions.OrderByDescending(x => x.percent).ToList();
                        Body.atmospherecompositions = atmosphereCompositions;
                    }
                }
                Body.pressure = (decimal?)body["surfacePressure"];
                if (((string)body["subType"]).Contains("gas giant") &&
                    (string)body["atmosphereType"] == "No atmosphere")
                {
                    // EDSM classifies any body with an empty string atmosphere property as "No atmosphere".
                    // However, gas giants also receive an empty string. Fix it, since gas giants have atmospheres.
                    Body.atmosphereclass = AtmosphereClass.FromEDName("GasGiant");
                }
                else
                {
                    Body.atmosphereclass = AtmosphereClass.FromName((string)body["atmosphereType"]);
                }

                if (body["solidComposition"] is JObject)
                {
                    List <SolidComposition> bodyCompositions = new List <SolidComposition>();
                    var compositions = body["solidComposition"].ToObject <Dictionary <string, decimal?> >();

                    foreach (KeyValuePair <string, decimal?> compositionKV in compositions)
                    {
                        string  composition = compositionKV.Key;
                        decimal?share       = compositionKV.Value;
                        if (composition != null && share != null)
                        {
                            bodyCompositions.Add(new SolidComposition(composition, (decimal)share));
                        }
                    }
                    if (bodyCompositions.Count > 0)
                    {
                        bodyCompositions       = bodyCompositions.OrderByDescending(x => x.percent).ToList();
                        Body.solidcompositions = bodyCompositions;
                    }
                }

                if (body["materials"] is JObject)
                {
                    List <MaterialPresence> Materials = new List <MaterialPresence>();
                    var materials = body["materials"].ToObject <Dictionary <string, decimal?> >();
                    foreach (KeyValuePair <string, decimal?> materialKV in materials)
                    {
                        Material material = Material.FromName(materialKV.Key);
                        decimal? amount   = materialKV.Value;
                        if (material != null && amount != null)
                        {
                            Materials.Add(new MaterialPresence(material, (decimal)amount));
                        }
                    }
                    if (Materials.Count > 0)
                    {
                        Body.materials = Materials.OrderByDescending(o => o.percentage).ToList();
                    }
                }
            }

            if ((JArray)body["rings"] != null || (JArray)body["belts"] != null)
            {
                var rings = body["rings"] ?? body["belts"];
                if (rings != null)
                {
                    List <Ring> Rings = new List <Ring>();
                    foreach (JObject ring in rings)
                    {
                        Rings.Add(new Ring(
                                      (string)ring["name"],
                                      RingComposition.FromName((string)ring["type"]),
                                      (decimal)ring["mass"],
                                      (decimal)ring["innerRadius"],
                                      (decimal)ring["outerRadius"]
                                      ));
                    }
                    Body.rings = Rings;
                }
            }
            Body.reserveLevel = ReserveLevel.FromName((string)body["reserveLevel"]) ?? ReserveLevel.None;

            DateTime updatedAt = DateTime.SpecifyKind(DateTime.Parse((string)body["updateTime"]), DateTimeKind.Utc);

            Body.updatedat = updatedAt == null ? null : (long?)(updatedAt.Subtract(new DateTime(1970, 1, 1, 0, 0, 0))).TotalSeconds;

            return(Body);
        }
        public void Execute(CommandLineApplication command)
        {
            command.Description = "Uploads zip function app to Azure";
            command.HelpOption("-?|-h|--help");
            var path    = command.Argument("path", "File location");
            var user    = command.Option("-u|--user", "Azure user name", CommandOptionType.SingleValue);
            var pwd     = command.Option("-p|--password", "Azure user password", CommandOptionType.SingleValue);
            var appname = command.Option("-a|--name", "Function name", CommandOptionType.SingleValue);

            var forceUpload = command.Option("-f|--force", "Upload even if the same function exits", CommandOptionType.NoValue);
            var storageConnectionStringParam = command.Option("--scstring", "Azure storage connection string for state", CommandOptionType.SingleValue);
            var storageRes = command.Option("--sresourcekey", "TF Resource key containing azure storage connection string ", CommandOptionType.SingleValue);
            var container  = command.Option("--container", "Remote container name", CommandOptionType.SingleValue);

            var tfstate = command.Option("-t|--tfstate", "Teraform state file", CommandOptionType.SingleValue);
            var res     = command.Option("-k|--resourcekey", "Teraform resource key file", CommandOptionType.SingleValue);

            command.OnExecute(async() =>
            {
                string _user = null;
                string _pwd  = null;
                string _name = null;
                string _storageConenctionString = null;
                TerraformState storage          = null;

                if (res.HasValue() || storageRes.HasValue())
                {
                    storage = new TerraformState(new StateFileContent(tfstate.HasValue() ? tfstate.Value() : null));
                }

                if (res.HasValue())
                {
                    (_name, _user, _pwd) = storage.GetFunctionAppCredentials(res.Value());
                }
                else
                {
                    (_name, _user, _pwd) = (appname.Value(), user.Value(), pwd.Value());
                }

                if (storageRes.HasValue())
                {
                    _storageConenctionString = storage.GetResourceByPath(storageRes.Value());
                }
                else if (storageConnectionStringParam.HasValue())
                {
                    _storageConenctionString = storageConnectionStringParam.Value();
                }


                Console.WriteLine("User:"******"Name:" + _name);


                AzureFunctionDeployer functionDeployer;
                if (_storageConenctionString == null)
                {
                    functionDeployer = new AzureFunctionDeployer();
                }
                else
                {
                    functionDeployer = new AzureFunctionDeployerWithState(
                        new AzureStorage(_storageConenctionString),
                        container.GetValueOrNull(),
                        forceUpload.HasValue()
                        );
                }

                await functionDeployer.UploadAsync(_user, _pwd, _name, path.Value);

                return(0);
            });
        }
Exemple #13
0
        public int EstimatedValue()
        {
            if (EventTimeUTC < new DateTime(2017, 4, 11, 12, 0, 0, 0, DateTimeKind.Utc))
            {
                return(EstimatedValueED22());
            }

            //int low;
            //int high;

            if (IsStar)
            {
                switch (StarTypeID)      // http://elite-dangerous.wikia.com/wiki/Explorer
                {
                case EDStar.O:
                    return(6135);

                case EDStar.B:
                    return(3012);

                case EDStar.A:
                    return(2949);

                case EDStar.F:
                    return(2932);

                case EDStar.G:
                    return(2919);

                case EDStar.K:
                    return(2916);

                case EDStar.M:
                    return(2903);

                // dwarfs
                case EDStar.L:
                    return(2889);

                case EDStar.T:
                    return(2895);

                case EDStar.Y:
                    return(2881);

                // proto stars
                case EDStar.AeBe:        // Herbig
                    return(2931);

                case EDStar.TTS:
                    return(2000);     //?

                // wolf rayet
                case EDStar.W:
                case EDStar.WN:
                case EDStar.WNC:
                case EDStar.WC:
                case EDStar.WO:
                    return(2931);

                // Carbon
                case EDStar.CS:
                case EDStar.C:
                case EDStar.CN:
                case EDStar.CJ:
                case EDStar.CHd:
                    return(2930);

                case EDStar.MS:     //seen in log
                case EDStar.S:      // seen in log
                    return(2000);


                // white dwarf
                case EDStar.D:
                case EDStar.DA:
                case EDStar.DAB:
                case EDStar.DAO:
                case EDStar.DAZ:
                case EDStar.DAV:
                case EDStar.DB:
                case EDStar.DBZ:
                case EDStar.DBV:
                case EDStar.DO:
                case EDStar.DOV:
                case EDStar.DQ:
                case EDStar.DC:
                case EDStar.DCV:
                case EDStar.DX:
                    return(34294);

                case EDStar.N:
                    return(54782);

                case EDStar.H:
                    return(60589);

                case EDStar.X:
                    return(2000);    //?

                case EDStar.A_BlueWhiteSuperGiant:
                case EDStar.F_WhiteSuperGiant:
                case EDStar.M_RedSuperGiant:
                case EDStar.M_RedGiant:
                case EDStar.K_OrangeGiant:
                    return(3122);

                case EDStar.RoguePlanet:
                    return(2000);    //?

                default:
                    return(2000);
                }
            }
            else                      // Planet
            {
                switch (PlanetTypeID) // http://elite-dangerous.wikia.com/wiki/Explorer
                {
                case EDPlanet.Icy_body:
                    return(1246);    // 0.04

                case EDPlanet.Rocky_ice_body:
                    return(928);    // 0.04

                case EDPlanet.Rocky_body:
                    if (TerraformState != null && TerraformState.ToLower().Equals("terraformable"))
                    {
                        return(181104);
                    }
                    else
                    {
                        return(928);    // 0.04
                    }

                case EDPlanet.Metal_rich_body:
                    return(65045);    // 0.51 EM

                case EDPlanet.High_metal_content_body:
                    if (TerraformState != null && TerraformState.ToLower().Equals("terraformable"))
                    {
                        return(412249);
                    }
                    else
                    {
                        return(34310);    // 0.41
                    }

                case EDPlanet.Earthlike_body:
                    return(627885);    // 0.47 EM

                case EDPlanet.Water_world:
                    if (TerraformState != null && TerraformState.ToLower().Equals("terraformable"))
                    {
                        return(694971);
                    }
                    else
                    {
                        return(301410);    // (0.82 EM)
                    }

                case EDPlanet.Ammonia_world:
                    return(320203);    // (0.41 EM)

                case EDPlanet.Sudarsky_class_I_gas_giant:
                    return(7013);     // 62.93 EM

                case EDPlanet.Sudarsky_class_II_gas_giant:
                    return(53663);     // 260.84 EM

                case EDPlanet.Sudarsky_class_III_gas_giant:
                    return(2693);    // 990.92 EM

                case EDPlanet.Sudarsky_class_IV_gas_giant:
                    return(2799);    // 3319 em

                case EDPlanet.Sudarsky_class_V_gas_giant:
                    return(2761);



                case EDPlanet.Water_giant:
                    return(1824);

                case EDPlanet.Water_giant_with_life:      // ?
                    return(2000);

                case EDPlanet.Gas_giant_with_water_based_life:
                    return(2314);

                case EDPlanet.Gas_giant_with_ammonia_based_life:
                    return(1721);

                case EDPlanet.Helium_rich_gas_giant:
                case EDPlanet.Helium_gas_giant:
                    return(2095);

                default:
                    return(2000);
                }
            }
        }
Exemple #14
0
        public JournalScan(JObject evt) : base(evt, JournalTypeEnum.Scan)
        {
            BodyName = evt["BodyName"].Str();
            StarType = evt["StarType"].StrNull();

            DistanceFromArrivalLS = evt["DistanceFromArrivalLS"].Double();

            nAge               = evt["Age_MY"].DoubleNull();
            nStellarMass       = evt["StellarMass"].DoubleNull();
            nRadius            = evt["Radius"].DoubleNull();
            nAbsoluteMagnitude = evt["AbsoluteMagnitude"].DoubleNull();
            nRotationPeriod    = evt["RotationPeriod"].DoubleNull();

            nOrbitalPeriod      = evt["OrbitalPeriod"].DoubleNull();
            nSemiMajorAxis      = evt["SemiMajorAxis"].DoubleNull();
            nEccentricity       = evt["Eccentricity"].DoubleNull();
            nOrbitalInclination = evt["OrbitalInclination"].DoubleNull();
            nPeriapsis          = evt["Periapsis"].DoubleNull();

            Rings = evt["Rings"]?.ToObject <StarPlanetRing[]>();

            nTidalLock     = evt["TidalLock"].Bool();
            TerraformState = evt["TerraformState"].StrNull();
            if (TerraformState != null && TerraformState.Equals("Not Terraformable", StringComparison.InvariantCultureIgnoreCase)) // EDSM returns this, normalise to journal
            {
                TerraformState = String.Empty;
            }
            PlanetClass = evt["PlanetClass"].StrNull();

            Atmosphere = evt["Atmosphere"].StrNull();
            if (Atmosphere == null || Atmosphere.Length == 0)             // Earthlikes appear to have empty atmospheres but AtmosphereType
            {
                Atmosphere = evt["AtmosphereType"].StrNull();
            }
            if (Atmosphere != null)
            {
                Atmosphere = Atmosphere.SplitCapsWordFull();
            }

            AtmosphereID        = Bodies.AtmosphereStr2Enum(Atmosphere, out AtmosphereProperty);
            Volcanism           = evt["Volcanism"].StrNull();
            VolcanismID         = Bodies.VolcanismStr2Enum(Volcanism, out VolcanismProperty);
            nMassEM             = evt["MassEM"].DoubleNull();
            nSurfaceGravity     = evt["SurfaceGravity"].DoubleNull();
            nSurfaceTemperature = evt["SurfaceTemperature"].DoubleNull();
            nSurfacePressure    = evt["SurfacePressure"].DoubleNull();
            nLandable           = evt["Landable"].BoolNull();

            ReserveLevelStr = evt["ReserveLevel"].Str();

            if (IsStar)
            {
                StarTypeID = Bodies.StarStr2Enum(StarType);

                if (nRadius.HasValue && nSurfaceTemperature.HasValue)
                {
                    HabitableZoneInner = DistanceForBlackBodyTemperature(315);
                    HabitableZoneOuter = DistanceForBlackBodyTemperature(223);
                }
            }
            else if (PlanetClass != null)
            {
                PlanetTypeID = Bodies.PlanetStr2Enum(PlanetClass);
                // Fix naming to standard and fix case..
                PlanetClass = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.
                              ToTitleCase(PlanetClass.ToLower()).Replace("Ii ", "II ").Replace("Iv ", "IV ").Replace("Iii ", "III ");
            }
            else
            {
                PlanetTypeID = EDPlanet.Unknown;
            }


            JToken mats = (JToken)evt["Materials"];

            if (mats != null)
            {
                if (mats.Type == JTokenType.Object)
                {
                    Materials = mats?.ToObject <Dictionary <string, double> >();
                }
                else
                {
                    Materials = new Dictionary <string, double>();
                    foreach (JObject jo in mats)
                    {
                        Materials[(string)jo["Name"]] = jo["Percent"].Double();
                    }
                }
            }

            IsEDSMBody = evt["EDDFromEDSMBodie"].Bool(false);
        }