From 130c05e56b1a0516c743e25257e9a02b8c0055e6 Mon Sep 17 00:00:00 2001 From: RaidMax Date: Tue, 4 Apr 2023 21:44:08 -0500 Subject: [PATCH] add configuration watcher implementation --- Application/IO/ConfigurationWatcher.cs | 60 ++++++++++++++++++++++++++ Application/Main.cs | 1 + 2 files changed, 61 insertions(+) create mode 100644 Application/IO/ConfigurationWatcher.cs diff --git a/Application/IO/ConfigurationWatcher.cs b/Application/IO/ConfigurationWatcher.cs new file mode 100644 index 00000000..979b7e60 --- /dev/null +++ b/Application/IO/ConfigurationWatcher.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.IO; +using SharedLibraryCore; + +namespace IW4MAdmin.Application.IO; + +public sealed class ConfigurationWatcher : IDisposable +{ + private readonly FileSystemWatcher _watcher; + private readonly Dictionary> _registeredActions = new(); + + public ConfigurationWatcher() + { + _watcher = new FileSystemWatcher + { + Path = Path.Join(Utilities.OperatingDirectory, "Configuration"), + Filter = "*.json", + NotifyFilter = NotifyFilters.LastWrite + }; + + _watcher.Changed += WatcherOnChanged; + _watcher.EnableRaisingEvents = true; + } + + public void Dispose() + { + _watcher.Changed -= WatcherOnChanged; + _watcher.Dispose(); + } + + public void Register(string fileName, Action fileUpdated) + { + if (_registeredActions.ContainsKey(fileName)) + { + return; + } + + _registeredActions.Add(fileName, fileUpdated); + } + + public void Unregister(string fileName) + { + if (_registeredActions.ContainsKey(fileName)) + { + _registeredActions.Remove(fileName); + } + } + + private void WatcherOnChanged(object sender, FileSystemEventArgs eventArgs) + { + if (!_registeredActions.ContainsKey(eventArgs.FullPath) || eventArgs.ChangeType != WatcherChangeTypes.Changed || + new FileInfo(eventArgs.FullPath).Length == 0) + { + return; + } + + _registeredActions[eventArgs.FullPath].Invoke(eventArgs.FullPath); + } +} diff --git a/Application/Main.cs b/Application/Main.cs index 1d799110..e0ba9fde 100644 --- a/Application/Main.cs +++ b/Application/Main.cs @@ -29,6 +29,7 @@ using Data.Helpers; using Integrations.Source.Extensions; using IW4MAdmin.Application.Alerts; using IW4MAdmin.Application.Extensions; +using IW4MAdmin.Application.IO; using IW4MAdmin.Application.Localization; using IW4MAdmin.Application.Plugin; using IW4MAdmin.Application.Plugin.Script;