public void SetupWatchers(string [] stdfolders) { System.Diagnostics.Debug.Assert(ScanThread == null); // double check we are not scanning. List <int> watchersinuse = new List <int>(); foreach (string std in stdfolders) // setup the std folders { watchersinuse.Add(CheckAddPath(std)); } foreach (var cmdr in EDCommander.GetListCommanders()) // setup any commander folders { if (!cmdr.ConsoleCommander && cmdr.JournalDir.HasChars()) // not console commanders, and we have a path { watchersinuse.Add(CheckAddPath(cmdr.JournalDir)); // try adding } } List <int> del = new List <int>(); for (int i = 0; i < watchers.Count; i++) // find any watchers not in the watchersinuse list { if (!watchersinuse.Contains(i)) { del.Add(i); } } for (int j = 0; j < del.Count; j++) { int wi = del[j]; System.Diagnostics.Trace.WriteLine(string.Format("Delete watch on {0}", watchers[wi].WatcherFolder)); JournalMonitorWatcher mw = watchers[wi]; mw.StopMonitor(); // just in case watchers.Remove(mw); StatusMonitorWatcher sw = statuswatchers[wi]; sw.StopMonitor(); // just in case statuswatchers.Remove(sw); } }
public void SetupWatchers(bool storejsoninje = false) { List <EDCommander> listCommanders = EDCommander.GetListCommanders(); // add the default frontier folder in if (!string.IsNullOrEmpty(frontierfolder) && Directory.Exists(frontierfolder)) // if it exists.. { if (watchers.FindIndex(x => x.WatcherFolder.Equals(frontierfolder)) < 0) // and we are not watching it.. { System.Diagnostics.Trace.WriteLine(string.Format("New watch on {0}", frontierfolder)); JournalMonitorWatcher mw = new JournalMonitorWatcher(frontierfolder, storejsoninje); watchers.Add(mw); StatusMonitorWatcher sw = new StatusMonitorWatcher(frontierfolder, ScanTick); sw.UIEventCallBack += UIEvent; statuswatchers.Add(sw); } } for (int i = 0; i < listCommanders.Count; i++) // see if new watchers are needed { string datapath = GetWatchFolder(listCommanders[i].JournalDir); if (string.IsNullOrEmpty(datapath) || !Directory.Exists(datapath)) // not exist, ignore { continue; } if (watchers.FindIndex(x => x.WatcherFolder.Equals(datapath)) >= 0) // if we already have a watch on this folder.. { continue; // already done } System.Diagnostics.Trace.WriteLine(string.Format("New watch on {0}", datapath)); JournalMonitorWatcher mw = new JournalMonitorWatcher(datapath, storejsoninje); watchers.Add(mw); StatusMonitorWatcher sw = new StatusMonitorWatcher(datapath, ScanTick); sw.UIEventCallBack += UIEvent; statuswatchers.Add(sw); } // clean up monitors on journals { List <int> tobedeleted = new List <int>(); for (int i = 0; i < watchers.Count; i++) { bool found = false; if (frontierfolder != null && watchers[i].WatcherFolder.Equals(frontierfolder)) { found = true; } for (int j = 0; j < listCommanders.Count; j++) // all commanders, see if this watch folder is present { found |= watchers[i].WatcherFolder.Equals(GetWatchFolder(listCommanders[j].JournalDir)); } if (!found) { tobedeleted.Add(i); } } foreach (int i in tobedeleted) { System.Diagnostics.Trace.WriteLine(string.Format("Delete watch on {0}", watchers[i].WatcherFolder)); JournalMonitorWatcher mw = watchers[i]; mw.StopMonitor(); // just in case watchers.Remove(mw); } } // and on status files { List <int> statustobedeleted = new List <int>(); for (int i = 0; i < statuswatchers.Count; i++) { bool found = false; if (frontierfolder != null && watchers[i].WatcherFolder.Equals(frontierfolder)) { found = true; } for (int j = 0; j < listCommanders.Count; j++) // all commanders, see if this watch folder is present { found |= statuswatchers[i].WatcherFolder.Equals(GetWatchFolder(listCommanders[j].JournalDir)); } if (!found) { statustobedeleted.Add(i); } } foreach (int i in statustobedeleted) { System.Diagnostics.Trace.WriteLine(string.Format("Delete status watch on {0}", statuswatchers[i].WatcherFolder)); StatusMonitorWatcher mw = statuswatchers[i]; mw.StopMonitor(); // just in case statuswatchers.Remove(mw); } } }
private JournalReaderEntry ProcessLine(string line, bool resetOnError) { int cmdrid = -2; //-1 is hidden, -2 is never shown if (TravelLogUnit.CommanderId.HasValue) { cmdrid = TravelLogUnit.CommanderId.Value; // System.Diagnostics.Trace.WriteLine(string.Format("TLU says commander {0} at {1}", cmdrid, TravelLogUnit.Name)); } if (line.Length == 0) { return(null); } JObject jo = null; JournalEntry je = null; try { jo = JObject.Parse(line); je = JournalEntry.CreateJournalEntry(jo); } catch { System.Diagnostics.Trace.WriteLine($"Bad journal line:\n{line}"); if (resetOnError) { throw; } else { return(null); } } if (je == null) { System.Diagnostics.Trace.WriteLine($"Bad journal line:\n{line}"); return(null); } bool toosoon = false; if (je.EventTypeID == JournalTypeEnum.Fileheader) { JournalEvents.JournalFileheader header = (JournalEvents.JournalFileheader)je; if ((header.Beta && !EliteConfigInstance.InstanceOptions.DisableBetaCommanderCheck) || EliteConfigInstance.InstanceOptions.ForceBetaOnCommander) // if beta, and not disabled, or force beta { TravelLogUnit.type |= 0x8000; } if (header.Part > 1) { JournalEvents.JournalContinued contd = JournalEntry.GetLast <JournalEvents.JournalContinued>(je.EventTimeUTC.AddSeconds(1), e => e.Part == header.Part); // Carry commander over from previous log if it ends with a Continued event. if (contd != null && Math.Abs(header.EventTimeUTC.Subtract(contd.EventTimeUTC).TotalSeconds) < 5 && contd.CommanderId >= 0) { TravelLogUnit.CommanderId = contd.CommanderId; } } } else if (je.EventTypeID == JournalTypeEnum.LoadGame) { string newname = (je as JournalEvents.JournalLoadGame).LoadGameCommander; if ((TravelLogUnit.type & 0x8000) == 0x8000) { newname = "[BETA] " + newname; } EDCommander commander = EDCommander.GetCommander(newname); if (commander == null) { commander = EDCommander.GetListCommanders().FirstOrDefault(); if (EDCommander.NumberOfCommanders == 1 && commander != null && commander.Name == "Jameson (Default)") { commander.Name = newname; commander.EdsmName = newname; EDCommander.Update(new List <EDCommander> { commander }, false); } else { commander = EDCommander.Create(newname, null, EDJournalClass.GetDefaultJournalDir().Equals(TravelLogUnit.Path) ? "" : TravelLogUnit.Path); } } cmdrid = commander.Nr; if (!TravelLogUnit.CommanderId.HasValue) { TravelLogUnit.CommanderId = cmdrid; TravelLogUnit.Update(); System.Diagnostics.Trace.WriteLine(string.Format("TLU {0} updated with commander {1}", TravelLogUnit.Path, cmdrid)); } } else if (je is ISystemStationEntry && ((ISystemStationEntry)je).IsTrainingEvent) { System.Diagnostics.Trace.WriteLine($"Training detected:\n{line}"); return(null); } if (je is IAdditionalFiles) { if ((je as IAdditionalFiles).ReadAdditionalFiles(Path.GetDirectoryName(FileName), ref jo) == false) // if failed { return(null); } } if (je is JournalEvents.JournalShipyard) // when going into shipyard { toosoon = lastshipyard != null && lastshipyard.Yard.Equals((je as JournalEvents.JournalShipyard).Yard); lastshipyard = je as JournalEvents.JournalShipyard; } else if (je is JournalEvents.JournalStoredShips) // when going into shipyard { toosoon = laststoredships != null && CollectionStaticHelpers.Equals(laststoredships.ShipsHere, (je as JournalEvents.JournalStoredShips).ShipsHere) && CollectionStaticHelpers.Equals(laststoredships.ShipsRemote, (je as JournalEvents.JournalStoredShips).ShipsRemote); laststoredships = je as JournalEvents.JournalStoredShips; } else if (je is JournalEvents.JournalStoredModules) // when going into outfitting { toosoon = laststoredmodules != null && CollectionStaticHelpers.Equals(laststoredmodules.ModuleItems, (je as JournalEvents.JournalStoredModules).ModuleItems); laststoredmodules = je as JournalEvents.JournalStoredModules; } else if (je is JournalEvents.JournalOutfitting) // when doing into outfitting { toosoon = lastoutfitting != null && lastoutfitting.ItemList.Equals((je as JournalEvents.JournalOutfitting).ItemList); lastoutfitting = je as JournalEvents.JournalOutfitting; } else if (je is JournalEvents.JournalMarket) { toosoon = lastmarket != null && lastmarket.Equals(je as JournalEvents.JournalMarket); lastmarket = je as JournalEvents.JournalMarket; } else if (je is JournalEvents.JournalUndocked || je is JournalEvents.JournalLoadGame) // undocked, Load Game, repeats are cleared { lastshipyard = null; laststoredmodules = null; lastoutfitting = null; laststoredmodules = null; laststoredships = null; } if (toosoon) // if seeing repeats, remove { System.Diagnostics.Debug.WriteLine("**** Remove as dup " + je.EventTypeStr); return(null); } je.TLUId = (int)TravelLogUnit.id; je.CommanderId = cmdrid; return(new JournalReaderEntry { JournalEntry = je, Json = jo }); }
public void ParseJournalFiles(Func <bool> cancelRequested, Action <int, string> updateProgress, bool forceReload = false) { List <EDCommander> listCommanders = EDCommander.GetListCommanders(); // add the default frontier folder in if (!string.IsNullOrEmpty(frontierfolder) && Directory.Exists(frontierfolder)) // if it exists.. { if (watchers.FindIndex(x => x.WatcherFolder.Equals(frontierfolder)) < 0) // and we are not watching it.. { System.Diagnostics.Trace.WriteLine(string.Format("New watch on {0}", frontierfolder)); JournalMonitorWatcher mw = new JournalMonitorWatcher(frontierfolder); watchers.Add(mw); StatusMonitorWatcher sw = new StatusMonitorWatcher(frontierfolder, ScanTick); sw.UIEventCallBack += UIEvent; statuswatchers.Add(sw); } } for (int i = 0; i < listCommanders.Count; i++) // see if new watchers are needed { string datapath = GetWatchFolder(listCommanders[i].JournalDir); if (string.IsNullOrEmpty(datapath) || !Directory.Exists(datapath)) // not exist, ignore { continue; } if (watchers.FindIndex(x => x.WatcherFolder.Equals(datapath)) >= 0) // if we already have a watch on this folder.. { continue; // already done } System.Diagnostics.Trace.WriteLine(string.Format("New watch on {0}", datapath)); JournalMonitorWatcher mw = new JournalMonitorWatcher(datapath); watchers.Add(mw); StatusMonitorWatcher sw = new StatusMonitorWatcher(datapath, ScanTick); sw.UIEventCallBack += UIEvent; statuswatchers.Add(sw); } // clean up monitors on journals { List <int> tobedeleted = new List <int>(); for (int i = 0; i < watchers.Count; i++) { bool found = false; for (int j = 0; j < listCommanders.Count; j++) // all commanders, see if this watch folder is present { found |= watchers[i].WatcherFolder.Equals(GetWatchFolder(listCommanders[j].JournalDir)); } if (!found) { tobedeleted.Add(i); } } foreach (int i in tobedeleted) { System.Diagnostics.Trace.WriteLine(string.Format("Delete watch on {0}", watchers[i].WatcherFolder)); JournalMonitorWatcher mw = watchers[i]; mw.StopMonitor(); // just in case watchers.Remove(mw); } } // and on status files { List <int> statustobedeleted = new List <int>(); for (int i = 0; i < statuswatchers.Count; i++) { bool found = false; for (int j = 0; j < listCommanders.Count; j++) // all commanders, see if this watch folder is present { found |= statuswatchers[i].WatcherFolder.Equals(GetWatchFolder(listCommanders[j].JournalDir)); } if (!found) { statustobedeleted.Add(i); } } foreach (int i in statustobedeleted) { System.Diagnostics.Trace.WriteLine(string.Format("Delete status watch on {0}", statuswatchers[i].WatcherFolder)); StatusMonitorWatcher mw = statuswatchers[i]; mw.StopMonitor(); // just in case statuswatchers.Remove(mw); } } for (int i = 0; i < watchers.Count; i++) // parse files of all folders being watched { watchers[i].ParseJournalFiles(cancelRequested, updateProgress, forceReload); // may create new commanders at the end, but won't need any new watchers, because they will obv be in the same folder } }
// inhistoryrefreshparse = means reading history in batch mode // returns null if journal line is bad or its a repeat.. It does not throw private JournalEntry ProcessLine(string line, bool inhistoryrefreshparse) { // System.Diagnostics.Debug.WriteLine("Line in '" + line + "'"); int cmdrid = TravelLogUnit.CommanderId.HasValue ? TravelLogUnit.CommanderId.Value : -2; //-1 is hidden, -2 is never shown if (line.Length == 0) { return(null); } JournalEntry je = null; try { // use a try block in case anything in the creation goes t**s up je = JournalEntry.CreateJournalEntry(line, true, true); // save JSON, save json, don't return if bad } catch (Exception ex) { System.Diagnostics.Trace.WriteLine($"{TravelLogUnit.FullName} Exception Bad journal line: {line} {ex.Message} {ex.StackTrace}"); return(null); } if (je == null) { System.Diagnostics.Trace.WriteLine($"{TravelLogUnit.FullName} Bad journal line: {line}"); return(null); } bool toosoon = false; if (je.EventTypeID == JournalTypeEnum.Fileheader) { JournalEvents.JournalFileheader header = (JournalEvents.JournalFileheader)je; if ((header.Beta && !EliteConfigInstance.InstanceOptions.DisableBetaCommanderCheck) || EliteConfigInstance.InstanceOptions.ForceBetaOnCommander) // if beta, and not disabled, or force beta { TravelLogUnit.Type |= TravelLogUnit.BetaMarker; } if (header.Part > 1) { // if we have a last continued, and its header parts match, and it has a commander, and its not too different in time.. if (lastcontinued != null && lastcontinued.Part == header.Part && lastcontinued.CommanderId >= 0 && Math.Abs(header.EventTimeUTC.Subtract(lastcontinued.EventTimeUTC).TotalSeconds) < 5) { cmdrid = lastcontinued.CommanderId; TravelLogUnit.CommanderId = lastcontinued.CommanderId; // copy commander across. } else { // this only works if you have a history... EDD does. JournalEvents.JournalContinued contd = JournalEntry.GetLast <JournalEvents.JournalContinued>(je.EventTimeUTC.AddSeconds(1), e => e.Part == header.Part); // Carry commander over from previous log if it ends with a Continued event. if (contd != null && Math.Abs(header.EventTimeUTC.Subtract(contd.EventTimeUTC).TotalSeconds) < 5 && contd.CommanderId >= 0) { cmdrid = lastcontinued.CommanderId; TravelLogUnit.CommanderId = contd.CommanderId; } } } } else if (je.EventTypeID == JournalTypeEnum.Continued) { lastcontinued = je as JournalEvents.JournalContinued; // save.. we are getting a new file soon } else if (je.EventTypeID == JournalTypeEnum.LoadGame) { var jlg = je as JournalEvents.JournalLoadGame; string newname = jlg.LoadGameCommander; if ((TravelLogUnit.Type & TravelLogUnit.BetaMarker) == TravelLogUnit.BetaMarker) { newname = "[BETA] " + newname; } EDCommander commander = EDCommander.GetCommander(newname); if (commander == null) { // in the default condition, we have a hidden commander, and first Cmdr. Jameson. commander = EDCommander.GetListCommanders().FirstOrDefault(); if (EDCommander.NumberOfCommanders == 2 && commander != null && commander.Name == "Jameson (Default)") { commander.Name = newname; commander.EdsmName = newname; commander.JournalDir = TravelLogUnit.Path; EDCommander.Update(commander); } else { commander = EDCommander.Add(name: newname, journalpath: TravelLogUnit.Path); // always add the path from now on if (EDCommander.Current.Name.Contains("[BETA]") && !newname.Contains("[BETA]")) // if current commander is beta, and we dont, swap to it { EDCommander.CurrentCmdrID = commander.Id; } } } commander.FID = jlg.FID; cmdrid = commander.Id; if (!TravelLogUnit.CommanderId.HasValue) // we do not need to write to DB the TLU at this point, since we read something the upper layers will do that { TravelLogUnit.CommanderId = cmdrid; //System.Diagnostics.Trace.WriteLine(string.Format("TLU {0} updated with commander {1} at {2}", TravelLogUnit.Path, cmdrid, TravelLogUnit.Size)); } } else if (je is ISystemStationEntry && ((ISystemStationEntry)je).IsTrainingEvent) { //System.Diagnostics.Trace.WriteLine($"{filename} Training detected:\n{line}"); return(null); } // if additional files, and we are NOT a console commander, see if we can pick up extra info if (je is IAdditionalFiles && !(EDCommander.GetCommander(cmdrid)?.ConsoleCommander ?? false)) { if ((je as IAdditionalFiles).ReadAdditionalFiles(TravelLogUnit.Path, inhistoryrefreshparse) == false) // if failed { return(null); } } if (je is JournalEvents.JournalShipyard) // when going into shipyard { toosoon = lastshipyard != null && lastshipyard.Yard.Equals((je as JournalEvents.JournalShipyard).Yard); lastshipyard = je as JournalEvents.JournalShipyard; } else if (je is JournalEvents.JournalStoredShips) // when going into shipyard { toosoon = laststoredships != null && CollectionStaticHelpers.Equals(laststoredships.ShipsHere, (je as JournalEvents.JournalStoredShips).ShipsHere) && CollectionStaticHelpers.Equals(laststoredships.ShipsRemote, (je as JournalEvents.JournalStoredShips).ShipsRemote); laststoredships = je as JournalEvents.JournalStoredShips; } else if (je is JournalEvents.JournalStoredModules) // when going into outfitting { toosoon = laststoredmodules != null && CollectionStaticHelpers.Equals(laststoredmodules.ModuleItems, (je as JournalEvents.JournalStoredModules).ModuleItems); laststoredmodules = je as JournalEvents.JournalStoredModules; } else if (je is JournalEvents.JournalOutfitting) // when doing into outfitting { toosoon = lastoutfitting != null && lastoutfitting.ItemList.Equals((je as JournalEvents.JournalOutfitting).ItemList); lastoutfitting = je as JournalEvents.JournalOutfitting; } else if (je is JournalEvents.JournalMarket) { toosoon = lastmarket != null && lastmarket.Equals(je as JournalEvents.JournalMarket); lastmarket = je as JournalEvents.JournalMarket; } else if (je is JournalEvents.JournalCargo) { var cargo = je as JournalEvents.JournalCargo; if (lastcargo != null) { toosoon = lastcargo.SameAs(cargo); // if exactly the same, swallow. //System.Diagnostics.Debug.WriteLine("Cargo vs last " + toosoon); } lastcargo = cargo; } else if (je is JournalEvents.JournalUndocked || je is JournalEvents.JournalLoadGame) // undocked, Load Game, repeats are cleared { lastshipyard = null; laststoredmodules = null; lastoutfitting = null; laststoredmodules = null; laststoredships = null; lastcargo = null; cqc = (je is JournalEvents.JournalLoadGame) && ((JournalEvents.JournalLoadGame)je).GameMode == null; } else if (je is JournalEvents.JournalMusic) { var music = je as JournalEvents.JournalMusic; if (music.MusicTrackID == JournalEvents.EDMusicTrackEnum.CQC || music.MusicTrackID == JournalEvents.EDMusicTrackEnum.CQCMenu) { cqc = true; } } else if (je is JournalEvents.JournalNavRoute) { var route = je as JournalEvents.JournalNavRoute; if (lastnavroute != null && (route.EventTimeUTC == lastnavroute.EventTimeUTC || route.EventTimeUTC == lastnavroute.EventTimeUTC.AddSeconds(1))) { toosoon = true; } lastnavroute = route; } if (toosoon) // if seeing repeats, remove { // System.Diagnostics.Debug.WriteLine("**** Remove as dup " + je.EventTypeStr); return(null); } if (cqc) // Ignore events if in CQC { return(null); } je.SetTLUCommander(TravelLogUnit.ID, cmdrid); return(je); }
// inhistoryrefreshparse = means reading history in batch mode private JournalEntry ProcessLine(string line, bool inhistoryrefreshparse, bool resetOnError) { int cmdrid = TravelLogUnit.CommanderId.HasValue ? TravelLogUnit.CommanderId.Value : -2; //-1 is hidden, -2 is never shown if (line.Length == 0) { return(null); } JObject jo = null; JournalEntry je = null; try { jo = JObject.Parse(line); je = JournalEntry.CreateJournalEntry(jo, true); } catch { System.Diagnostics.Trace.WriteLine($"Bad journal line:\n{line}"); if (resetOnError) { throw; } else { return(null); } } if (je == null) { System.Diagnostics.Trace.WriteLine($"Bad journal line:\n{line}"); return(null); } bool toosoon = false; if (je.EventTypeID == JournalTypeEnum.Fileheader) { JournalEvents.JournalFileheader header = (JournalEvents.JournalFileheader)je; if ((header.Beta && !EliteConfigInstance.InstanceOptions.DisableBetaCommanderCheck) || EliteConfigInstance.InstanceOptions.ForceBetaOnCommander) // if beta, and not disabled, or force beta { TravelLogUnit.type |= TravelLogUnit.BetaMarker; } if (header.Part > 1) { // if we have a last continued, and its header parts match, and it has a commander, and its not too different in time.. if (lastcontinued != null && lastcontinued.Part == header.Part && lastcontinued.CommanderId >= 0 && Math.Abs(header.EventTimeUTC.Subtract(lastcontinued.EventTimeUTC).TotalSeconds) < 5) { cmdrid = lastcontinued.CommanderId; TravelLogUnit.CommanderId = lastcontinued.CommanderId; // copy commander across. } else { // this only works if you have a history... EDD does. JournalEvents.JournalContinued contd = JournalEntry.GetLast <JournalEvents.JournalContinued>(je.EventTimeUTC.AddSeconds(1), e => e.Part == header.Part); // Carry commander over from previous log if it ends with a Continued event. if (contd != null && Math.Abs(header.EventTimeUTC.Subtract(contd.EventTimeUTC).TotalSeconds) < 5 && contd.CommanderId >= 0) { cmdrid = lastcontinued.CommanderId; TravelLogUnit.CommanderId = contd.CommanderId; } } } } else if (je.EventTypeID == JournalTypeEnum.Continued) { lastcontinued = je as JournalEvents.JournalContinued; // save.. we are getting a new file soon } else if (je.EventTypeID == JournalTypeEnum.LoadGame) { var jlg = je as JournalEvents.JournalLoadGame; string newname = jlg.LoadGameCommander; if ((TravelLogUnit.type & TravelLogUnit.BetaMarker) == TravelLogUnit.BetaMarker) { newname = "[BETA] " + newname; } EDCommander commander = EDCommander.GetCommander(newname); if (commander == null) { // in the default condition, we have a hidden commander, and first Cmdr. Jameson. commander = EDCommander.GetListCommanders().FirstOrDefault(); if (EDCommander.NumberOfCommanders == 2 && commander != null && commander.Name == "Jameson (Default)") { commander.Name = newname; commander.EdsmName = newname; EDCommander.Update(new List <EDCommander> { commander }, false); } else { commander = EDCommander.Create(name: newname, journalpath: EDJournalUIScanner.GetDefaultJournalDir().Equals(TravelLogUnit.Path) ? "" : TravelLogUnit.Path); } } commander.FID = jlg.FID; cmdrid = commander.Nr; if (!TravelLogUnit.CommanderId.HasValue) // we do not need to write to DB the TLU at this point, since we read something the upper layers will do that { TravelLogUnit.CommanderId = cmdrid; //System.Diagnostics.Trace.WriteLine(string.Format("TLU {0} updated with commander {1} at {2}", TravelLogUnit.Path, cmdrid, TravelLogUnit.Size)); } } else if (je is ISystemStationEntry && ((ISystemStationEntry)je).IsTrainingEvent) { System.Diagnostics.Trace.WriteLine($"Training detected:\n{line}"); return(null); } if (je is IAdditionalFiles) { if ((je as IAdditionalFiles).ReadAdditionalFiles(Path.GetDirectoryName(FileName), inhistoryrefreshparse, ref jo) == false) // if failed { return(null); } } if (je is JournalEvents.JournalShipyard) // when going into shipyard { toosoon = lastshipyard != null && lastshipyard.Yard.Equals((je as JournalEvents.JournalShipyard).Yard); lastshipyard = je as JournalEvents.JournalShipyard; } else if (je is JournalEvents.JournalStoredShips) // when going into shipyard { toosoon = laststoredships != null && CollectionStaticHelpers.Equals(laststoredships.ShipsHere, (je as JournalEvents.JournalStoredShips).ShipsHere) && CollectionStaticHelpers.Equals(laststoredships.ShipsRemote, (je as JournalEvents.JournalStoredShips).ShipsRemote); laststoredships = je as JournalEvents.JournalStoredShips; } else if (je is JournalEvents.JournalStoredModules) // when going into outfitting { toosoon = laststoredmodules != null && CollectionStaticHelpers.Equals(laststoredmodules.ModuleItems, (je as JournalEvents.JournalStoredModules).ModuleItems); laststoredmodules = je as JournalEvents.JournalStoredModules; } else if (je is JournalEvents.JournalOutfitting) // when doing into outfitting { toosoon = lastoutfitting != null && lastoutfitting.ItemList.Equals((je as JournalEvents.JournalOutfitting).ItemList); lastoutfitting = je as JournalEvents.JournalOutfitting; } else if (je is JournalEvents.JournalMarket) { toosoon = lastmarket != null && lastmarket.Equals(je as JournalEvents.JournalMarket); lastmarket = je as JournalEvents.JournalMarket; } else if (je is JournalEvents.JournalCargo) { var cargo = je as JournalEvents.JournalCargo; toosoon = lastcargo != null && cargo.EventTimeUTC.Subtract(lastcargo.EventTimeUTC).Minutes < 15; lastcargo = cargo; } else if (je is JournalEvents.JournalUndocked || je is JournalEvents.JournalLoadGame) // undocked, Load Game, repeats are cleared { lastshipyard = null; laststoredmodules = null; lastoutfitting = null; laststoredmodules = null; laststoredships = null; lastcargo = null; cqc = false; } else if (je is JournalEvents.JournalMusic) { var music = je as JournalEvents.JournalMusic; if (music.MusicTrackID == JournalEvents.EDMusicTrackEnum.CQC || music.MusicTrackID == JournalEvents.EDMusicTrackEnum.CQCMenu) { cqc = true; } } else if (je is JournalEvents.JournalNavRoute) { var route = je as JournalEvents.JournalNavRoute; if (lastnavroute != null && (route.EventTimeUTC == lastnavroute.EventTimeUTC || route.EventTimeUTC == lastnavroute.EventTimeUTC.AddSeconds(1))) { toosoon = true; } lastnavroute = route; } if (toosoon) // if seeing repeats, remove { System.Diagnostics.Debug.WriteLine("**** Remove as dup " + je.EventTypeStr); return(null); } if (cqc) // Ignore events if in CQC { return(null); } je.SetTLUCommander(TravelLogUnit.id, cmdrid); return(je); }