Exemplo n.º 1
0
        public List <StarSystem> GetOrFetchStarSystems(string[] names, bool fetchIfMissing = true, bool refreshIfOutdated = true)
        {
            if (!names.Any())
            {
                return(new List <StarSystem>());
            }
            List <StarSystem> systems = GetStarSystems(names, refreshIfOutdated) ?? new List <StarSystem>();

            // If a system isn't found after we've read our local database, we need to fetch it.
            List <string> fetchSystems = new List <string>();

            foreach (string name in names)
            {
                if (fetchIfMissing && systems.FirstOrDefault(s => s.systemname == name) == null)
                {
                    fetchSystems.Add(name);
                }
            }

            List <StarSystem> fetchedSystems = dataProviderService.GetSystemsData(fetchSystems.ToArray());

            if (fetchedSystems?.Count > 0)
            {
                Instance.SaveStarSystems(fetchedSystems);
                systems.AddRange(fetchedSystems);
            }

            return(systems);
        }
        public List <StarSystem> GetOrFetchStarSystems(string[] names, bool fetchIfMissing = true)
        {
            if (names.Count() == 0)
            {
                return(null);
            }

            List <StarSystem> systems      = Instance.GetStarSystems(names, fetchIfMissing);
            List <string>     fetchSystems = new List <string>();

            // If a system isn't found after we've read our local database, we need to fetch it.
            foreach (string name in names)
            {
                if (fetchIfMissing && systems.FirstOrDefault(s => s.name == name) == null)
                {
                    fetchSystems.Add(name);
                }
            }

            List <StarSystem> fetchedSystems = DataProviderService.GetSystemsData(fetchSystems.ToArray());

            if (fetchedSystems?.Count > 0)
            {
                Instance.insertStarSystems(fetchedSystems);
                systems.AddRange(fetchedSystems);
            }

            return(systems);
        }
Exemplo n.º 3
0
        public List <StarSystem> GetOrCreateStarSystems(string[] names, bool fetchIfMissing = true, bool refreshIfOutdated = true)
        {
            if (names.Count() == 0)
            {
                return(null);
            }

            // Get (and update if required) systems already in our database
            List <StarSystem> systems = Instance.GetStarSystems(names, refreshIfOutdated);

            // If a system isn't found after we've read our local database, we need to fetch it.
            List <string> fetchSystems = new List <string>();

            foreach (string name in names)
            {
                if (fetchIfMissing && systems.FirstOrDefault(s => s.name == name) == null)
                {
                    fetchSystems.Add(name);
                }
            }
            List <StarSystem> fetchedSystems = DataProviderService.GetSystemsData(fetchSystems.ToArray());

            if (fetchedSystems?.Count > 0)
            {
                Instance.insertStarSystems(fetchedSystems);
                systems.AddRange(fetchedSystems);
            }

            // Create a new system object for each name that isn't in the database and couldn't be fetched from a server
            foreach (string name in names)
            {
                if (systems?.Find(s => s?.name == name) == null)
                {
                    systems.Add(new StarSystem()
                    {
                        name = name
                    });
                }
            }

            return(systems);
        }
        public List <StarSystem> GetStarSystems(string[] names, bool refreshIfOutdated = true)
        {
            if (!File.Exists(DbFile))
            {
                return(null);
            }
            if (names.Count() == 0)
            {
                return(null);
            }

            List <StarSystem> results         = new List <StarSystem>();
            List <string>     systemsToUpdate = new List <string>();
            List <KeyValuePair <string, string> > dataSets = Instance.ReadStarSystems(names);

            foreach (KeyValuePair <string, string> kv in dataSets)
            {
                bool       needToUpdate = false;
                StarSystem result       = null;

                if (kv.Value != null && kv.Value != "")
                {
                    string name = kv.Key;

                    // Old versions of the data could have a string "No volcanism" for volcanism.  If so we remove it
                    string data = kv.Value?.Replace(@"""No volcanism""", "null");

                    // Determine whether our data is stale (We won't deserialize the the entire system if it's stale)
                    IDictionary <string, object> system = Deserializtion.DeserializeData(data);
                    system.TryGetValue("comment", out object commentVal);
                    system.TryGetValue("lastupdated", out object lastUpdatedVal);
                    system.TryGetValue("systemAddress", out object systemAddressVal);
                    system.TryGetValue("EDSMID", out object edsmIdVal);

                    string   comment       = (string)commentVal ?? "";
                    DateTime?lastupdated   = (DateTime?)lastUpdatedVal;
                    long?    systemAddress = (long?)systemAddressVal;
                    long?    edsmId        = (long?)edsmIdVal;

                    if (refreshIfOutdated)
                    {
                        if (lastupdated < DateTime.UtcNow.AddHours(-1))
                        {
                            // Data is stale
                            needToUpdate = true;
                        }
                        else if (lastupdated is null)
                        {
                            // We have no record of ever updating this star system
                            needToUpdate = true;
                        }
                        else if (SCHEMA_VERSION >= 2 && (systemAddress is null || edsmId is null))
                        {
                            // Obtain data for optimized data searches starting with schema version 2
                            needToUpdate = true;
                        }
                    }

                    if (needToUpdate)
                    {
                        // We want to update this star system
                        systemsToUpdate.Add(name);
                    }
                    else
                    {
                        // Deserialize the old result
                        result = DeserializeStarSystem(name, data, ref needToUpdate);
                        if (result != null)
                        {
                            results.Add(result);
                        }
                    }
                }
            }

            if (systemsToUpdate.Count > 0)
            {
                List <StarSystem> updatedSystems = DataProviderService.GetSystemsData(systemsToUpdate.ToArray());

                // If the newly fetched star system is an empty object except (for the object name), reject it
                List <string> systemsToRevert = new List <string>();
                foreach (StarSystem starSystem in updatedSystems)
                {
                    if (starSystem.systemAddress == null)
                    {
                        systemsToRevert.Add(starSystem.systemname);
                    }
                }
                updatedSystems.RemoveAll(s => systemsToRevert.Contains(s.systemname));

                // Return old results when new results have been rejected
                foreach (string systemName in systemsToRevert)
                {
                    results.Add(GetStarSystem(systemName, false));
                }

                // Synchronize EDSM visits and comments
                updatedSystems = DataProviderService.syncFromStarMapService(updatedSystems);

                // Add our updated systems to our results
                results.AddRange(updatedSystems);

                // Save changes to our star systems
                Instance.updateStarSystems(updatedSystems);
            }

            foreach (StarSystem starSystem in results)
            {
                starSystem.lastupdated = DateTime.UtcNow;
            }
            return(results);
        }