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