// History load system, read DB for entries and make a history up public static HistoryList LoadHistory(Action <string> reportProgress, int CurrentCommander, int fullhistoryloaddaylimit, string essentialitems ) { HistoryList hist = new HistoryList(); Trace.WriteLine(BaseUtils.AppTicks.TickCountLapDelta("HLL", true).Item1 + " History Load"); reportProgress("Reading Database"); List <JournalEntry> jlist; // returned in date ascending, oldest first order. if (fullhistoryloaddaylimit > 0) { var list = (essentialitems == nameof(JournalEssentialEvents.JumpScanEssentialEvents)) ? JournalEssentialEvents.JumpScanEssentialEvents : (essentialitems == nameof(JournalEssentialEvents.JumpEssentialEvents)) ? JournalEssentialEvents.JumpEssentialEvents : (essentialitems == nameof(JournalEssentialEvents.NoEssentialEvents)) ? JournalEssentialEvents.NoEssentialEvents : (essentialitems == nameof(JournalEssentialEvents.FullStatsEssentialEvents)) ? JournalEssentialEvents.FullStatsEssentialEvents : JournalEssentialEvents.EssentialEvents; jlist = JournalEntry.GetAll(CurrentCommander, ids: list, allidsafterutc: DateTime.UtcNow.Subtract(new TimeSpan(fullhistoryloaddaylimit, 0, 0, 0)) ); } else { jlist = JournalEntry.GetAll(CurrentCommander); } Trace.WriteLine(BaseUtils.AppTicks.TickCountLapDelta("HLL").Item1 + " Journals read from DB"); reportProgress("Creating History"); hist.hlastprocessed = null; foreach (JournalEntry je in jlist) { if (MergeOrDiscardEntries(hist.hlastprocessed?.journalEntry, je)) // if we merge, don't store into HE { continue; } // Clean up "UnKnown" systems from EDSM log if (je is JournalFSDJump && ((JournalFSDJump)je).StarSystem == "UnKnown") { JournalEntry.Delete(je.Id); continue; } HistoryEntry he = HistoryEntry.FromJournalEntry(je, hist.hlastprocessed); // create entry he.UpdateMaterialsCommodities(hist.MaterialCommoditiesMicroResources.Process(je, hist.hlastprocessed?.journalEntry, he.Status.TravelState == HistoryEntryStatus.TravelStateType.SRV)); // IN THIS order, so suits can be added, then weapons, then loadouts he.UpdateSuits(hist.SuitList.Process(je, he.WhereAmI, he.System)); he.UpdateWeapons(hist.WeaponList.Process(je, he.WhereAmI, he.System)); // update the entries in suit entry list he.UpdateLoadouts(hist.SuitLoadoutList.Process(je, hist.WeaponList, he.WhereAmI, he.System)); he.UpdateStats(je, hist.statisticsaccumulator, he.StationFaction); he.UpdateSystemNote(); hist.CashLedger.Process(je); // update the ledger he.Credits = hist.CashLedger.CashTotal; hist.Shipyards.Process(je); hist.Outfitting.Process(je); Tuple <ShipInformation, ModulesInStore> ret = hist.ShipInformationList.Process(je, he.WhereAmI, he.System); // the ships he.UpdateShipInformation(ret.Item1); he.UpdateShipStoredModules(ret.Item2); he.UpdateMissionList(hist.MissionListAccumulator.Process(je, he.System, he.WhereAmI)); hist.hlastprocessed = he; var reorderlist = hist.ReorderRemove(he); foreach (var heh in reorderlist.EmptyIfNull()) { // System.Diagnostics.Debug.WriteLine(" ++ {0} {1}", heh.EventTimeUTC.ToString(), heh.EntryType); heh.Index = hist.historylist.Count; // store its index for quick ordering, after all removal etc hist.historylist.Add(heh); // then add to history hist.AddToVisitsScan(null); // add to scan database but don't complain } } Trace.WriteLine(BaseUtils.AppTicks.TickCountLapDelta("HLL").Item1 + " History List Created"); foreach (var s in hist.StarScan.ToProcess) { System.Diagnostics.Debug.WriteLine("StarScan could not find " + s.Item2.SystemAddress + " at " + s.Item1.EventTimeUTC); } //for (int i = hist.Count - 10; i < hist.Count; i++) System.Diagnostics.Debug.WriteLine("Hist {0} {1} {2}", hist[i].EventTimeUTC, hist[i].Indexno , hist[i].EventSummary); // now database has been updated due to initial fill, now fill in stuff which needs the user database Trace.WriteLine(BaseUtils.AppTicks.TickCountLapDelta("HLL").Item1 + " Anaylsis End"); hist.CommanderId = CurrentCommander; #if LISTSCANS { using (var fileout = new System.IO.StreamWriter(@"c:\code\scans.csv")) { fileout.WriteLine($"System,0,fullname,ownname,customname,bodyname,bodydesignation, bodyid,parentlist"); foreach (var sn in hist.StarScan.ScansSortedByName()) { foreach (var body in sn.Bodies) { string pl = body.ScanData?.ParentList(); fileout.WriteLine($"{sn.System.Name},0, {body.FullName},{body.OwnName},{body.CustomName},{body.ScanData?.BodyName},{body.ScanData?.BodyDesignation},{body.BodyID},{pl}"); } } } } #endif return(hist); }
// History load system, read DB for entries and make a history up public static HistoryList LoadHistory(Action <string> reportProgress, int CurrentCommander, int fullhistoryloaddaylimit, string essentialitems ) { HistoryList hist = new HistoryList(); Trace.WriteLine(BaseUtils.AppTicks.TickCountLapDelta("HLL", true).Item1 + " History Load"); reportProgress("Reading Database"); List <JournalEntry> jlist; // returned in date ascending, oldest first order. if (fullhistoryloaddaylimit > 0) { var list = (essentialitems == nameof(JournalEssentialEvents.JumpScanEssentialEvents)) ? JournalEssentialEvents.JumpScanEssentialEvents : (essentialitems == nameof(JournalEssentialEvents.JumpEssentialEvents)) ? JournalEssentialEvents.JumpEssentialEvents : (essentialitems == nameof(JournalEssentialEvents.NoEssentialEvents)) ? JournalEssentialEvents.NoEssentialEvents : (essentialitems == nameof(JournalEssentialEvents.FullStatsEssentialEvents)) ? JournalEssentialEvents.FullStatsEssentialEvents : JournalEssentialEvents.EssentialEvents; jlist = JournalEntry.GetAll(CurrentCommander, ids: list, allidsafterutc: DateTime.UtcNow.Subtract(new TimeSpan(fullhistoryloaddaylimit, 0, 0, 0)) ); } else { jlist = JournalEntry.GetAll(CurrentCommander); } Trace.WriteLine(BaseUtils.AppTicks.TickCountLapDelta("HLL").Item1 + " Journals read from DB"); reportProgress("Creating History"); HistoryEntry hprev = null; foreach (JournalEntry je in jlist) { if (MergeOrDiscardEntries(hprev?.journalEntry, je)) // if we merge, don't store into HE { continue; } // Clean up "UnKnown" systems from EDSM log if (je is JournalFSDJump && ((JournalFSDJump)je).StarSystem == "UnKnown") { JournalEntry.Delete(je.Id); continue; } if (je is EliteDangerousCore.JournalEvents.JournalMusic) // remove music.. not shown.. now UI event. remove it for backwards compatibility { //System.Diagnostics.Debug.WriteLine("**** Filter out " + je.EventTypeStr + " on " + je.EventTimeLocal.ToString()); continue; } HistoryEntry he = HistoryEntry.FromJournalEntry(je, hprev); // create entry he.UpdateMaterialsCommodities(hist.MaterialCommoditiesMicroResources.Process(je)); if (CheckForRemoval(he, hprev)) // check here to see if we want to remove the entry.. can move this lower later, but at first point where we have the data { continue; } hist.historylist.Add(he); // now add it to the history hprev = he; } Trace.WriteLine(BaseUtils.AppTicks.TickCountLapDelta("HLL").Item1 + " History List Created"); reportProgress("Analysing History"); for (int i = 0; i < hist.historylist.Count; i++) { HistoryEntry he = hist.historylist[i]; JournalEntry je = he.journalEntry; he.UpdateStats(je, hist.statisticsaccumulator, he.StationFaction); he.UpdateSystemNote(); hist.CashLedger.Process(je); // update the ledger he.Credits = hist.CashLedger.CashTotal; hist.Shipyards.Process(je); hist.Outfitting.Process(je); Tuple <ShipInformation, ModulesInStore> ret = hist.ShipInformationList.Process(je, he.WhereAmI, he.System); // the ships he.UpdateShipInformation(ret.Item1); he.UpdateShipStoredModules(ret.Item2); he.UpdateMissionList(hist.MissionListAccumulator.Process(je, he.System, he.WhereAmI)); he.UpdateWeapons(hist.WeaponList.Process(je, he.WhereAmI, he.System)); // update the entries in suit entry list he.UpdateSuits(hist.SuitList.Process(je, he.WhereAmI, he.System)); he.UpdateLoadouts(hist.SuitLoadoutList.Process(je, hist.WeaponList, he.WhereAmI, he.System)); AddToVisitsScan(hist, i, null); // add to scan but don't complain if can't add } //for (int i = hist.Count - 10; i < hist.Count; i++) System.Diagnostics.Debug.WriteLine("Hist {0} {1} {2}", hist[i].EventTimeUTC, hist[i].Indexno , hist[i].EventSummary); // now database has been updated due to initial fill, now fill in stuff which needs the user database Trace.WriteLine(BaseUtils.AppTicks.TickCountLapDelta("HLL").Item1 + " Anaylsis End"); hist.CommanderId = CurrentCommander; #if LISTSCANS { using (var fileout = new System.IO.StreamWriter(@"c:\code\scans.csv")) { fileout.WriteLine($"System,0,fullname,ownname,customname,bodyname,bodydesignation, bodyid,parentlist"); foreach (var sn in hist.StarScan.ScansSortedByName()) { foreach (var body in sn.Bodies) { string pl = body.ScanData?.ParentList(); fileout.WriteLine($"{sn.System.Name},0, {body.FullName},{body.OwnName},{body.CustomName},{body.ScanData?.BodyName},{body.ScanData?.BodyDesignation},{body.BodyID},{pl}"); } } } } #endif return(hist); }
public static HistoryList LoadHistory(EDJournalUIScanner journalmonitor, Func <bool> cancelRequested, Action <int, string> reportProgress, string NetLogPath = null, bool ForceNetLogReload = false, bool ForceJournalReload = false, int CurrentCommander = Int32.MinValue, int fullhistoryloaddaylimit = 0, string essentialitems = "" ) { HistoryList hist = new HistoryList(); if (CurrentCommander >= 0) { journalmonitor.SetupWatchers(); // Parse files stop monitor.. int forcereloadoflastn = ForceJournalReload ? int.MaxValue / 2 : 0; // if forcing a reload, we indicate that by setting the reload count to a very high value, but not enough to cause int wrap journalmonitor.ParseJournalFilesOnWatchers((p, s) => reportProgress(p, s), forcereloadoflastn); if (NetLogPath != null) { string errstr = null; NetLogClass.ParseFiles(NetLogPath, out errstr, EDCommander.Current.MapColour, () => cancelRequested(), (p, s) => reportProgress(p, s), ForceNetLogReload, currentcmdrid: CurrentCommander); } } Trace.WriteLine(BaseUtils.AppTicks.TickCountLap() + " Files read "); reportProgress(-1, "Reading Database"); List <JournalEntry> jlist; // returned in date ascending, oldest first order. System.Diagnostics.Debug.WriteLine(BaseUtils.AppTicks.TickCountLapDelta("HLL", true) + "History Load"); if (fullhistoryloaddaylimit > 0) { var list = (essentialitems == nameof(JournalEssentialEvents.JumpScanEssentialEvents)) ? JournalEssentialEvents.JumpScanEssentialEvents : (essentialitems == nameof(JournalEssentialEvents.JumpEssentialEvents)) ? JournalEssentialEvents.JumpEssentialEvents : (essentialitems == nameof(JournalEssentialEvents.NoEssentialEvents)) ? JournalEssentialEvents.NoEssentialEvents : (essentialitems == nameof(JournalEssentialEvents.FullStatsEssentialEvents)) ? JournalEssentialEvents.FullStatsEssentialEvents : JournalEssentialEvents.EssentialEvents; jlist = JournalEntry.GetAll(CurrentCommander, ids: list, allidsafterutc: DateTime.UtcNow.Subtract(new TimeSpan(fullhistoryloaddaylimit, 0, 0, 0)) ); } else { jlist = JournalEntry.GetAll(CurrentCommander); } System.Diagnostics.Debug.WriteLine(BaseUtils.AppTicks.TickCountLapDelta("HLL") + "History Load END"); Trace.WriteLine(BaseUtils.AppTicks.TickCountLap() + " Database read " + jlist.Count); HistoryEntry hprev = null; JournalEntry jprev = null; reportProgress(-1, "Creating History"); Stopwatch sw = new Stopwatch(); sw.Start(); foreach (JournalEntry je in jlist) { if (MergeEntries(jprev, je)) // if we merge, don't store into HE { continue; } // Clean up "UnKnown" systems from EDSM log if (je is JournalFSDJump && ((JournalFSDJump)je).StarSystem == "UnKnown") { JournalEntry.Delete(je.Id); continue; } if (je is EliteDangerousCore.JournalEvents.JournalMusic) // remove music.. not shown.. now UI event. remove it for backwards compatibility { //System.Diagnostics.Debug.WriteLine("**** Filter out " + je.EventTypeStr + " on " + je.EventTimeLocal.ToString()); continue; } long timetoload = sw.ElapsedMilliseconds; HistoryEntry he = HistoryEntry.FromJournalEntry(je, hprev); // **** REMEMBER NEW Journal entry needs this too ***************** he.UpdateMaterialsCommodities(je, hprev?.MaterialCommodity); // update material commodities Debug.Assert(he.MaterialCommodity != null); if (CheckForRemoval(he, hprev)) // check here to see if we want to remove the entry.. can move this lower later, but at first point where we have the data { continue; } he.UpdateStats(je, hprev?.Stats, he.StationFaction); he.UpdateSystemNote(); hist.CashLedger.Process(je); // update the ledger he.Credits = hist.CashLedger.CashTotal; hist.Shipyards.Process(je); hist.Outfitting.Process(je); Tuple <ShipInformation, ModulesInStore> ret = hist.ShipInformationList.Process(je, he.WhereAmI, he.System); // the ships he.UpdateShipInformation(ret.Item1); he.UpdateShipStoredModules(ret.Item2); he.UpdateMissionList(hist.missionlistaccumulator.Process(je, he.System, he.WhereAmI)); hist.historylist.Add(he); // now add it to the history AddToVisitsScan(hist, he, null); // add to scan but don't complain if can't add. Do this AFTER add, as it uses the history list hprev = he; jprev = je; } //for (int i = hist.Count - 10; i < hist.Count; i++) System.Diagnostics.Debug.WriteLine("Hist {0} {1} {2}", hist[i].EventTimeUTC, hist[i].Indexno , hist[i].EventSummary); // now database has been updated due to initial fill, now fill in stuff which needs the user database hist.CommanderId = CurrentCommander; EDCommander.Current.FID = hist.GetCommanderFID(); // ensure FID is set.. the other place it gets changed is a read of LoadGame. if (NetLogPath != null) { reportProgress(-1, "Netlog Updating System Positions"); hist.FillInPositionsFSDJumps(); // if netlog reading, try and resolve systems.. } reportProgress(-1, "Done"); return(hist); }