Ejemplo n.º 1
0
        public ActionResult SaveStatus(int id, SolarSystemStatus status)
        {
            //Convert date to UTC
            status.Date = status.Date.ToUniversalTime();
            //Update faction refs
            var factionIds = status.FactionStatus.Select(x => x.Faction.Id).Cast <System.ValueType>();

            using (var session = DB.Instance.GetSession())
            {
                var factions = session.Load <Faction>(factionIds);
                foreach (var factionStatus in status.FactionStatus)
                {
                    var faction = factions.First(x => x.Id == factionStatus.Faction.Id);
                    //Set faction ref for status
                    factionStatus.Faction = FactionRef.FromFaction(faction);
                    //Update faction with current state
                    if (status.Date.Date == DateTime.UtcNow.Date)
                    {
                        faction.State         = factionStatus.State;
                        faction.PendingStates = factionStatus.PendingStates;
                    }
                    //Trim zeros from pending states
                    if (factionStatus.PendingStates != null && factionStatus.PendingStates.Count > 0)
                    {
                        factionStatus.PendingStates = factionStatus.PendingStates.Where(x => x != 0).ToList();
                    }
                }
                session.Store(status);
                session.SaveChanges();
            }
            return(new JsonResult {
                Data = new { status = "OK", id = status.Id, date = status.Date.ToString("o") }
            });
        }
Ejemplo n.º 2
0
        private void StoreSystems(List <EDDBSystem> systems)
        {
            using (var session = DB.Instance.GetSession())
            {
                List <SolarSystem> solarSystems = new List <SolarSystem>();
                var batches = Math.Ceiling((double)systems.Count / 15);
                for (var i = 0; i < batches; i++)
                {
                    var names      = systems.Where(x => !String.IsNullOrEmpty(x.Name)).Select(y => RavenQuery.Escape(y.Name)).Skip(i * 15).Take(15);
                    var tmpSystems = session.Advanced.DocumentQuery <SolarSystem>("SolarSystem/Query")
                                     .Where("@In<NameExact>:(" + String.Join(",", names) + ")")
                                     .ToList();
                    solarSystems.AddRange(tmpSystems);
                }

                foreach (var system in systems)
                {
                    var solarSystem = solarSystems.FirstOrDefault(x => x.Name == system.Name);
                    if (solarSystem != null && system.Updated_At > solarSystem.Updated)
                    {
                        solarSystem.Updated = system.Updated_At;
                        if (system.Population.HasValue && system.Population.Value > 0)
                        {
                            solarSystem.PopulationPrev = solarSystem.Population;
                            solarSystem.Population     = system.Population.Value;
                        }
                        if (system.X.HasValue && system.Y.HasValue && system.Z.HasValue)
                        {
                            solarSystem.Coordinates.X = system.X.Value;
                            solarSystem.Coordinates.Y = system.Y.Value;
                            solarSystem.Coordinates.Z = system.Z.Value;
                        }
                        if (!String.IsNullOrEmpty(system.Security))
                        {
                            if (Enum.TryParse <SolarSystemSecurity>(system.Security, out SolarSystemSecurity security))
                            {
                                solarSystem.SecurityPrev = solarSystem.Security;
                                solarSystem.Security     = security;
                            }
                        }
                        if (!String.IsNullOrEmpty(system.Power))
                        {
                            PowerPlayLeader leader = PowerPlayLeader.None;
                            if (Enum.TryParse <PowerPlayLeader>(system.Power.Replace(" ", "").Replace("-", ""), out leader))
                            {
                                solarSystem.PowerPlayLeader = leader;
                            }
                        }
                        if (!String.IsNullOrEmpty(system.Power_State))
                        {
                            if (Enum.TryParse <PowerPlayState>(system.Power_State, out PowerPlayState ppstate))
                            {
                                solarSystem.PowerPlayState = ppstate;
                            }
                        }
                    }

                    //Faction status
                    if (solarSystem != null && solarSystem.SyncFactionStatus && system.MinorFactions != null && system.MinorFactions.Count > 0)
                    {
                        var statuses = session.Query <SolarSystemStatus>()
                                       .Where(x => x.SolarSystem == solarSystem.Id && x.Date >= system.Updated_At.Date)
                                       .ToList();
                        if (statuses == null || statuses.Count == 0)
                        {
                            var status = new SolarSystemStatus();
                            status.SolarSystem   = solarSystem.Id;
                            status.Date          = system.Updated_At.Date;
                            status.FactionStatus = new List <FactionStatus>();

                            var factionIds    = system.MinorFactions.Select(x => x.Id);
                            var localFactions = session.Query <Faction_Query.Result, Faction_Query>()
                                                .Where(x => x.EDDBId.In <int>(factionIds))
                                                .OfType <Faction>()
                                                .ToList();

                            foreach (var f in system.MinorFactions)
                            {
                                if (f.Influence.HasValue)
                                {
                                    var lf = localFactions.FirstOrDefault(x => x.EDDB_Id == f.Id);
                                    if (lf != null)
                                    {
                                        FactionState state = FactionState.None;
                                        Enum.TryParse <FactionState>(f.State, true, out state);
                                        status.FactionStatus.Add(new FactionStatus
                                        {
                                            Faction   = FactionRef.FromFaction(lf),
                                            Influence = f.Influence.Value,
                                            State     = state
                                        });
                                    }
                                }
                            }
                            session.Store(status);
                        }
                    }
                    session.Store(system);
                }
                session.SaveChanges();
            }
        }