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") }
            });
        }
        public ActionResult SaveStation(int id, Station station)
        {
            using (var session = DB.Instance.GetSession())
            {
                session.Advanced.UseOptimisticConcurrency = true;

                station.Faction = FactionRef.FromFaction(session.Load <Faction>(station.Faction.Id));
                //Check for undefined faction
                if (station.Faction == null)
                {
                    station.Faction = new FactionRef
                    {
                        Name     = "[Undefined]",
                        Id       = 0,
                        Attitude = FactionAttitude.Neutral
                    };
                }

                var system = session.Load <SolarSystem>(id);
                if (system != null)
                {
                    if (!String.IsNullOrEmpty(station.Guid))
                    {
                        system.Stations.Remove(system.Stations.First(x => x.Guid == station.Guid));
                    }
                    else
                    {
                        station.Guid = Guid.NewGuid().ToString();
                    }
                    system.Stations.Add(station);
                }
                session.SaveChanges();
            }
            return(new JsonResult {
                Data = new { status = "OK" }
            });
        }
        public ActionResult Edit(int?id, FactionEditView input)
        {
            var faction = input.Faction;
            List <SolarSystem> postedSystems = new List <SolarSystem>();
            List <SolarSystem> oldSystems    = null;

            using (var session = DB.Instance.GetSession())
            {
                //Check if faction exists?
                if (!id.HasValue)
                {
                    var existing = session.Query <Faction>().Where(x => x.Name == input.Faction.Name).ToList().FirstOrDefault(x => x.Name.Equals(input.Faction.Name, StringComparison.CurrentCultureIgnoreCase));
                    if (existing != null)
                    {
                        return(RedirectToAction("Edit", new { status = "Faction already exists" }));
                    }
                }

                if (id.HasValue)
                {
                    faction            = session.Load <Faction>(id.Value);
                    oldSystems         = session.Load <SolarSystem>(faction.SolarSystems.Select(x => x.Id).Cast <ValueType>()).ToList();
                    faction.Name       = input.Faction.Name;
                    faction.Government = input.Faction.Government;
                    faction.Attitude   = input.Faction.Attitude;
                    faction.Allegiance = input.Faction.Allegiance;
                    faction.EDDB_Id    = input.Faction.EDDB_Id;
                }

                //Solar systems
                SolarSystem homeSystem = null;
                if (input.PostedSystems != null && input.PostedSystems.Count > 0)
                {
                    var systemIds = input.PostedSystems.Select(x => int.Parse(x)).Cast <System.ValueType>();
                    postedSystems        = session.Load <SolarSystem>(systemIds).ToList();
                    faction.SolarSystems = postedSystems.Select(x => SolarSystemRef.FromSolarSystem(x)).ToList();
                    //Try to set homesystem by checking posted systems
                    homeSystem = postedSystems.FirstOrDefault(x => x.Id == input.Faction.HomeSolarSystem.Id);
                }
                else
                {
                    faction.SolarSystems.Clear();
                }

                //If homesystem was not among posted systems
                if (homeSystem == null)
                {
                    homeSystem = session.Load <SolarSystem>(input.Faction.HomeSolarSystem.Id);
                    postedSystems.Add(homeSystem);
                    //Make sure it's added to posted systems
                    if (!faction.SolarSystems.Any(x => x.Id == homeSystem.Id))
                    {
                        faction.SolarSystems.Add(SolarSystemRef.FromSolarSystem(homeSystem));
                    }
                }
                //Create ref
                faction.HomeSolarSystem = SolarSystemRef.FromSolarSystem(homeSystem);

                //Store faction, attaches id
                if (!id.HasValue)
                {
                    session.Store(faction);
                }

                //Remove faction from removed systems
                if (oldSystems != null)
                {
                    foreach (var system in oldSystems.Except(postedSystems))
                    {
                        system.Factions.RemoveAll(x => x.Id == faction.Id);
                    }
                }
                //Add allied factions to current systems
                foreach (var system in postedSystems)
                {
                    if (!system.Factions.Any(x => x.Id == faction.Id))
                    {
                        system.Factions.Add(FactionRef.FromFaction(faction));
                    }
                }

                session.SaveChanges();
            }
            return(RedirectToAction("Edit", new { id = faction.Id, status = "saved" }));
        }
Exemple #4
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();
            }
        }