public async Task WatcherRaisesEventsForHistoricalEntriesOnStart() { using var watcher = new JournalWatcher(_jf); var ecEntries = new EventCollector <JournalEntry>(h => watcher.EntryAdded += h, h => watcher.EntryAdded -= h, nameof(WatcherRaisesEventsForHistoricalEntriesOnStart)); var ecReady = new EventCollector <EventArgs>(h => watcher.Started += h, h => watcher.Started -= h, nameof(WatcherRaisesEventsForHistoricalEntriesOnStart)); var readyTask = ecReady.WaitAsync(() => { }); var entries = new Queue <JournalEntry>(await ecEntries.WaitAsync(_journalFile1Count, () => { watcher.Start(); Assert.False(watcher.IsWatching); }).ConfigureAwait(false)); var ready = await readyTask.ConfigureAwait(false); Assert.NotNull(ready); Assert.True(watcher.IsWatching); watcher.Stop(); Assert.False(watcher.IsWatching); Assert.Equal(_journalFile1Count, entries.Count); Assert.IsType <FileHeader>(entries.Dequeue()); Assert.IsType <Music>(entries.Dequeue()); Assert.IsType <UnderAttack>(entries.Dequeue()); Assert.IsType <StartJump>(entries.Dequeue()); Assert.IsType <JournalEntry>(entries.Dequeue()); Assert.IsType <Shutdown>(entries.Dequeue()); }
static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine("Don't forget to supply a path where the journal feed is located."); return; } string path = args[0]; var watcher = new JournalWatcher(path); watcher.GetEvent <FileheaderEvent>()?.AddHandler((s, e) => Console.WriteLine("Heading received: gameversion {0}, build {1}.", e.GameVersion, e.Build)); watcher.GetEvent <FSDJumpEvent>()?.AddHandler((s, e) => Console.WriteLine("Woohoo, jumped to [{0}, {1}, {2}]", e.StarPos.X, e.StarPos.Y, e.StarPos.Z)); watcher.GetEvent <ScanEvent>()?.AddHandler((s, e) => Console.WriteLine("Scanned a body {0}, it is {1}landable.", e.BodyName, (e.Landable ?? false) ? "" : "not ")); watcher.GetEvent <DockedEvent>()?.AddHandler((s, e) => Console.WriteLine("Docked at {0}", e.StationName)); watcher.GetEvent <DiedEvent>()?.AddHandler((s, e) => { Console.WriteLine("Killed by {0}", e.Killers .Select(k => string.Format("{0} ({2}, flying a {1})", k.Name, k.Ship, k.Rank)) .Aggregate((x, y) => string.Format("{0}, {1}", x, y))); }); watcher.GetEvent <RankEvent>()?.AddHandler((s, e) => Console.WriteLine("Combat rank is {0}, Exploration rank is {1}", e.Combat.ToString(), e.Explore.ToString())); watcher.StartWatching(); Console.ReadLine(); watcher.StopWatching(); }
public async Task WatcherRaisesEventsForNewJournalEntries() { using var dir = new TestFolder(_jf.FullName); using var watcher = new JournalWatcher(new JournalFolder(dir.Name)); var ecEntries = new EventCollector <JournalEntry>(h => watcher.EntryAdded += h, h => watcher.EntryAdded -= h, nameof(WatcherRaisesEventsForNewJournalEntries)); var ecReady = new EventCollector <EventArgs>(h => watcher.Started += h, h => watcher.Started -= h, nameof(WatcherRaisesEventsForNewJournalEntries)); var ev = await ecReady.WaitAsync(watcher.Start).ConfigureAwait(false); Assert.NotNull(ev); Assert.True(watcher.IsWatching); ev = await ecReady.WaitAsync(watcher.Start, 100).ConfigureAwait(false); Assert.Null(ev); var entry = await ecEntries.WaitAsync(() => dir.WriteText(_journalFile1, "{ \"event\":\"One\" }\r\n", true)).ConfigureAwait(false); Assert.Equal("One", entry.Event); var file2 = _journalFile1.Replace(".01.log", ".02.log", StringComparison.Ordinal); entry = await ecEntries.WaitAsync(() => dir.WriteText(file2, "{ \"event\":\"Two\" }\r\n")).ConfigureAwait(false); Assert.Equal("Two", entry.Event); watcher.Stop(); Assert.False(watcher.IsWatching); }
internal GameStateWatcher(string gameInstallFolder, string gameOptionsFolder, string journalFolder, INativeMethods nativeMethods) { var gif = new GameInstallFolder(gameInstallFolder); var gof = new GameOptionsFolder(gameOptionsFolder); var jf = new JournalFolder(journalFolder); _journalWatcher = new JournalWatcher(jf); _journalWatcher.Started += JournalWatcher_Started; _journalWatcher.EntryAdded += JournalWatcher_EntryAdded; _statusWatcher = new StatusWatcher(jf); _statusWatcher.Changed += StatusWatcher_Changed; _bindingsWatcher = new BindingsWatcher(gif, gof); _bindingsWatcher.Changed += BindingsWatcher_Changed; _graphicsConfig = new GraphicsConfigWatcher(gif, gof); _graphicsConfig.Changed += GraphicsConfig_Changed; _modifierKeysWatcher = new ModifierKeysWatcher(nativeMethods); _modifierKeysWatcher.Changed += ModifierKeysWatcher_Changed; _gameProcessWatcher = new GameProcessWatcher(gif, nativeMethods); _gameProcessWatcher.Changed += GameProcessWatcher_Changed; _gameState = new GameState(); }
static void Main(string[] args) { //Your Elite Dangerous game path string path = "C:\\Users\\your_user_name\\Saved Games\\Frontier Developments\\Elite Dangerous"; var statusWatcher = new StatusWatcher(path); statusWatcher.StatusUpdated += StatusWatcher_StatusUpdated; statusWatcher.StartWatching(); var watcher = new JournalWatcher(path); watcher.GetEvent <FileheaderEvent>()?.AddHandler((s, e) => Console.WriteLine("Heading received: gameversion {0}, build {1}.", e.GameVersion, e.Build)); watcher.GetEvent <ScanEvent>()?.AddHandler((s, e) => Console.WriteLine("Scanned a body {0}, it is {1}landable.", e.BodyName, (e.Landable ?? false) ? "" : "not ")); watcher.GetEvent <DockedEvent>()?.AddHandler((s, e) => Console.WriteLine("Docked at {0}", e.StationName)); watcher.GetEvent <FSDTargetEvent>()?.AddHandler((s, e) => { Console.WriteLine("FSDTargetEvent"); TPLink.Patterns.FSDTarget(); if (IsDocked) { TPLink.Patterns.ResetDocked(); } }); watcher.GetEvent <StartJumpEvent>()?.AddHandler((s, e) => { Console.WriteLine("StartJumpEvent [{0}]", e.JumpType); TPLink.Patterns.FSDEntry(); }); watcher.GetEvent <FSDJumpEvent>()?.AddHandler((s, e) => { Console.WriteLine("FSDJumpEvent [{0}]", e.StarSystem); TPLink.Patterns.FSDReset(); }); //watcher.GetEvent<SupercruiseEntryEvent>()?.AddHandler((s, e) => Console.WriteLine("SupercruiseEntryEvent")); watcher.GetEvent <SupercruiseExitEvent>()?.AddHandler((s, e) => { Console.WriteLine("SupercruiseExitEvent [{0}, {1}]", e.StarSystem, e.BodyType); TPLink.Patterns.FSDReset(); }); watcher.GetEvent <DiedEvent>()?.AddHandler((s, e) => { Console.WriteLine("Killed by {0}", e.Killers .Select(k => string.Format("{0} ({2}, flying a {1})", k.Name, k.Ship, k.Rank)) .Aggregate((x, y) => string.Format("{0}, {1}", x, y))); }); watcher.GetEvent <RankEvent>()?.AddHandler((s, e) => Console.WriteLine("Combat rank is {0}, Exploration rank is {1}", e.Combat.ToString(), e.Explore.ToString())); watcher.StartWatching().Wait(); Console.ReadLine(); watcher.StopWatching(); }
public ServerCore(EDFIPServerConsole serverConsole) { ServerConsole = serverConsole; // Set up the Journal feeds to be passed to clients var userHome = Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%"); JournalFileFolder = userHome + Constants.GameStateFolder; Log.Instance.Info("Tracking game data from folder: {journalfilefolder}", JournalFileFolder); StatusWatcher = new StatusWatcher(JournalFileFolder); JournalWatcher = new JournalWatcher(JournalFileFolder); // Add events to watch list StatusEventHandler = new StatusEventHandler(this); StatusWatcher.StatusUpdated += StatusEventHandler.HandleEvent; TargetEventHandler = new TargetEventHandler(this); JournalWatcher.GetEvent <ShipTargetedEvent>().Fired += TargetEventHandler.HandleEvent; // Start Matric Integration matricapi.Connect(); // If Immediate start is enabled, start the server if (Properties.Settings.Default.ImmediateStart == true) { this.Start(); } }
public void WatcherThrowsWhenTheJournalFolderIsNotAValidJournalFolder() { Assert.Throws <ArgumentNullException>(() => { using var x = new JournalWatcher(null); }); var ex = Assert.Throws <ArgumentException>(() => { using var x = new JournalWatcher(new JournalFolder(@"TestFiles")); }); Assert.Contains("' is not a valid Elite:Dangerous journal folder.", ex.Message, StringComparison.Ordinal); }
public void WatcherDoesNotThrowWhenDisposingTwice() { var watcher = new JournalWatcher(_jf); #pragma warning disable IDISP016, IDISP017 watcher.Dispose(); watcher.Dispose(); #pragma warning restore IDISP016, IDISP017 }
static void Main(string[] args) { // Uncomment this line of code to allow for debugging //while (!System.Diagnostics.Debugger.IsAttached) { System.Threading.Thread.Sleep(100); } Logger.Instance.LogMessage(TracingLevel.INFO, "Init Elite Api"); try { GetKeyBindings(null); var journalPath = StandardDirectory.FullName; Logger.Instance.LogMessage(TracingLevel.INFO, "journal path " + journalPath); if (!Directory.Exists(journalPath)) { Logger.Instance.LogMessage(TracingLevel.FATAL, $"Directory doesn't exist {journalPath}"); } var defaultFilter = @"Journal.*.log"; //#if DEBUG //defaultFilter = @"JournalAlpha.*.log"; //#endif StatusWatcher = new StatusWatcher(journalPath); StatusWatcher.StatusUpdated += EliteData.HandleStatusEvents; StatusWatcher.StartWatching(); JournalWatcher = new JournalWatcher(journalPath, defaultFilter); JournalWatcher.AllEventHandler += EliteData.HandleEliteEvents; JournalWatcher.StartWatching().Wait(); CargoWatcher = new CargoWatcher(journalPath); CargoWatcher.CargoUpdated += EliteData.HandleCargoEvents; CargoWatcher.StartWatching(); } catch (Exception ex) { Logger.Instance.LogMessage(TracingLevel.FATAL, $"Elite Api: {ex}"); } //EliteAPI.Events.AllEvent += (sender, e) => Console.Beep(); Profile.ReadProfiles(); SDWrapper.Run(args); }
/// <summary> /// Sets up the journal watcher and registers events that you want to watch /// </summary> /// <param name="vaProxy">VoiceAttackProxy object</param> public static void Init(VoiceAttackProxy vaProxy) { LastKnownSystem = Constants.DefaultLastKnownSystem; JournalWatcher watcher = new JournalWatcher(JournalPath); watcher.GetEvent <SupercruiseExitEvent>()?.AddHandler((s, e) => { LastKnownSystem = e.StarSystem; }); watcher.StartWatching().Wait(); }
static void Main(string[] args) { // Uncomment this line of code to allow for debugging //while (!System.Diagnostics.Debugger.IsAttached) { System.Threading.Thread.Sleep(100); } Logger.Instance.LogMessage(TracingLevel.INFO, "Init Elite Api"); try { var journalPath = StandardDirectory.FullName; Logger.Instance.LogMessage(TracingLevel.INFO, "journal path " + journalPath); if (!Directory.Exists(journalPath)) { Logger.Instance.LogMessage(TracingLevel.FATAL, $"Directory doesn't exist {journalPath}"); } statusWatcher = new StatusWatcher(journalPath); statusWatcher.StatusUpdated += EliteData.HandleStatusEvents; statusWatcher.StartWatching(); watcher = new JournalWatcher(journalPath); watcher.AllEventHandler += EliteData.HandleEliteEvents; watcher.StartWatching().Wait(); var bindingsPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"Frontier Developments\Elite Dangerous\Options\Bindings"); Logger.Instance.LogMessage(TracingLevel.INFO, "bindings path " + bindingsPath); if (!Directory.Exists(bindingsPath)) { Logger.Instance.LogMessage(TracingLevel.FATAL, $"Directory doesn't exist {bindingsPath}"); } var bindsName = File.ReadAllText(Path.Combine(bindingsPath, "StartPreset.start")); var fileName = Path.Combine(bindingsPath, bindsName + ".3.0.binds"); if (!File.Exists(fileName)) { //Logger.Instance.LogMessage(TracingLevel.ERROR, "file not found " + fileName); fileName = fileName.Replace(".3.0.binds", ".binds"); if (!File.Exists(fileName)) { bindingsPath = SteamPath.FindSteamEliteDirectory(); if (!string.IsNullOrEmpty(bindingsPath)) { fileName = Path.Combine(bindingsPath, bindsName + ".3.0.binds"); if (!File.Exists(fileName)) { //Logger.Instance.LogMessage(TracingLevel.ERROR, "file not found " + fileName); fileName = fileName.Replace(".3.0.binds", ".binds"); } } } } var serializer = new XmlSerializer(typeof(UserBindings)); Logger.Instance.LogMessage(TracingLevel.INFO, "using " + fileName); var reader = new StreamReader(fileName); Bindings = (UserBindings)serializer.Deserialize(reader); reader.Close(); } catch (Exception ex) { Logger.Instance.LogMessage(TracingLevel.FATAL, $"Elite Api: {ex}"); } //EliteAPI.Events.AllEvent += (sender, e) => Console.Beep(); SDWrapper.Run(args); }