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" })); }
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(); } }