diff --git a/File-Watcher.csproj b/File-Watcher.csproj index dcc92be..7319216 100644 --- a/File-Watcher.csproj +++ b/File-Watcher.csproj @@ -20,7 +20,7 @@ - + diff --git a/Helpers/InfinityQSProjectHelper.cs b/Helpers/InfinityQSProjectHelper.cs new file mode 100644 index 0000000..3cece33 --- /dev/null +++ b/Helpers/InfinityQSProjectHelper.cs @@ -0,0 +1,114 @@ +using File_Watcher.Models; +using System.Collections.ObjectModel; +using System.Net.Mail; + +namespace File_Watcher.Helpers; + +internal static partial class InfinityQSProjectHelper +{ + private record Record(ReadOnlyCollection FilteredLines, + DateTime LastWriteTimeUtc, + string Path); + + private static long _LastReview = DateTime.UtcNow.Ticks; + private static readonly Dictionary _KeyValuePairs = []; + + internal static bool SendEmail(AppSettings appSettings, ILogger logger) + { + InfinityQSProjectConfiguration configuration = appSettings.InfinityQSProjectConfiguration; + Clear(logger, configuration); + ReadOnlyDictionary keyValuePairs = GetKeyValuePairs(logger, configuration); + SendEmail(logger, configuration, keyValuePairs); + _LastReview = DateTime.UtcNow.Ticks; + return true; + } + + private static void Clear(ILogger logger, InfinityQSProjectConfiguration configuration) + { + long check = DateTime.UtcNow.AddHours(-configuration.ClearEveryHours).Ticks; + foreach (KeyValuePair keyValuePair in _KeyValuePairs) + { + if (keyValuePair.Value.LastWriteTimeUtc.Ticks < check) + { + _ = _KeyValuePairs.Remove(keyValuePair.Key); + logger.LogDebug("Clear File:{file}", keyValuePair.Key); + } + } + } + + private static ReadOnlyDictionary GetKeyValuePairs(ILogger logger, InfinityQSProjectConfiguration configuration) + { + bool check; + Record? record; + string[] lines; + FileInfo fileInfo; + List filtered = []; + Dictionary results = []; + string[] files = Directory.GetFiles(configuration.SourceDirectory, configuration.SearchPattern, SearchOption.TopDirectoryOnly); + foreach (string file in files) + { + check = false; + filtered.Clear(); + fileInfo = new(file); + if (fileInfo.LastWriteTimeUtc.Ticks < _LastReview) + { + logger.LogDebug("Old File:{file}", file); + continue; + } + if (_KeyValuePairs.ContainsKey(fileInfo.FullName)) + { + logger.LogDebug("Verified File:{file}", file); + continue; + } + lines = File.ReadAllLines(fileInfo.FullName); + foreach (string line in lines) + { + if (!check && line.Contains(configuration.Search)) + { + check = true; + continue; + } + if (check) + { + if (line.StartsWith(configuration.Search[0])) + break; + filtered.Add(line); + } + } + record = new(FilteredLines: filtered.AsReadOnly(), + LastWriteTimeUtc: fileInfo.LastWriteTimeUtc, + Path: fileInfo.FullName); + results.Add(fileInfo.FullName, record); + } + return results.AsReadOnly(); + } + + private static void SendEmail(ILogger logger, InfinityQSProjectConfiguration configuration, ReadOnlyDictionary keyValuePairs) + { + string body; + foreach (KeyValuePair keyValuePair in keyValuePairs) + { + logger.LogDebug("File:{file}", keyValuePair.Key); + body = $"InfinityQS Project Change Detected{Environment.NewLine}File:{keyValuePair.Key}{Environment.NewLine}LastWriteTimeUtc:{keyValuePair.Value:O}{Environment.NewLine}{string.Join(Environment.NewLine, keyValuePair.Value.FilteredLines)}"; + logger.LogWarning("SendEmail:{body}", body); + SendEmail(configuration.From, configuration.To, configuration.SimpleMailTransferProtocolServer, configuration.Subject, body); + } + } + + private static void SendEmail(string from, string to, string simpleMailTransferProtocolServer, string subject, string body) + { + SmtpClient smtpClient = new(simpleMailTransferProtocolServer); + MailMessage mailMessage = new() + { + From = new MailAddress(from), + Subject = subject, + Body = body, + Priority = MailPriority.High + }; + mailMessage.To.Add(new MailAddress(to)); + smtpClient.Send(mailMessage); + smtpClient.Dispose(); + mailMessage.Dispose(); + } + +} \ No newline at end of file diff --git a/Models/AppSettings.cs b/Models/AppSettings.cs index 4d74f36..a7850fa 100644 --- a/Models/AppSettings.cs +++ b/Models/AppSettings.cs @@ -13,6 +13,7 @@ public record AppSettings(CamstarOracleConfiguration CamstarOracleConfiguration, EDADatabaseConfiguration EDADatabaseConfiguration, FileWatcherConfiguration FileWatcherConfiguration, InfinityQSConfiguration InfinityQSConfiguration, + InfinityQSProjectConfiguration InfinityQSProjectConfiguration, IsoConfiguration IsoConfiguration, MetadataSettings MetadataSettings, MetrologyConfiguration MetrologyConfiguration, @@ -40,6 +41,7 @@ public record AppSettings(CamstarOracleConfiguration CamstarOracleConfiguration, EDADatabaseConfiguration? edaDatabaseConfiguration = configurationRoot.GetSection(nameof(EDADatabaseConfiguration)).Get(); FileWatcherConfiguration? fileWatcherConfiguration = configurationRoot.GetSection(nameof(FileWatcherConfiguration)).Get(); InfinityQSConfiguration? infinityQSConfiguration = configurationRoot.GetSection(nameof(InfinityQSConfiguration)).Get(); + InfinityQSProjectConfiguration? infinityQSProjectConfiguration = configurationRoot.GetSection(nameof(InfinityQSProjectConfiguration)).Get(); IsoConfiguration? isoConfiguration = configurationRoot.GetSection(nameof(IsoConfiguration)).Get(); MetadataSettings? metadataSettings = configurationRoot.GetSection(nameof(MetadataSettings)).Get(); MetrologyConfiguration? metrologyConfiguration = configurationRoot.GetSection(nameof(MetrologyConfiguration)).Get(); @@ -62,6 +64,7 @@ public record AppSettings(CamstarOracleConfiguration CamstarOracleConfiguration, || edaDatabaseConfiguration is null || fileWatcherConfiguration is null || infinityQSConfiguration is null + || infinityQSProjectConfiguration is null || isoConfiguration is null || metadataSettings is null || metrologyConfiguration is null @@ -96,6 +99,7 @@ public record AppSettings(CamstarOracleConfiguration CamstarOracleConfiguration, edaDatabaseConfiguration, fileWatcherConfiguration, infinityQSConfiguration, + infinityQSProjectConfiguration, isoConfiguration, metadataSettings, metrologyConfiguration, diff --git a/Models/InfinityQSProjectConfiguration.cs b/Models/InfinityQSProjectConfiguration.cs new file mode 100644 index 0000000..c1ff765 --- /dev/null +++ b/Models/InfinityQSProjectConfiguration.cs @@ -0,0 +1,28 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace File_Watcher.Models; + +public record InfinityQSProjectConfiguration(string From, + int ClearEveryHours, + string Search, + string SearchPattern, + string SimpleMailTransferProtocolServer, + string SourceDirectory, + string Subject, + string To) +{ + + public override string ToString() + { + string result = JsonSerializer.Serialize(this, InfinityQSProjectConfigurationSourceGenerationContext.Default.InfinityQSProjectConfiguration); + return result; + } + +} + +[JsonSourceGenerationOptions(WriteIndented = true)] +[JsonSerializable(typeof(InfinityQSProjectConfiguration))] +internal partial class InfinityQSProjectConfigurationSourceGenerationContext : JsonSerializerContext +{ +} \ No newline at end of file diff --git a/Worker.cs b/Worker.cs index 1288f6f..ddf6eef 100644 --- a/Worker.cs +++ b/Worker.cs @@ -46,6 +46,7 @@ public partial class Worker : BackgroundService if (!_IsWindowsService) { _Logger.LogInformation("Set break point and skip to run {_AppSettings.FileWatcherConfiguration.Helper}!", _AppSettings.FileWatcherConfiguration.Helper); + BodyInner(cancellationToken); throw new EvaluateException($"Set break point and skip to run {_AppSettings.FileWatcherConfiguration.Helper}!"); } if (!_IsWindowsService) @@ -89,6 +90,7 @@ public partial class Worker : BackgroundService nameof(Helpers.HelperWaferCounter) => Helpers.HelperWaferCounter.MoveFile(_AppSettings, _Logger), nameof(Helpers.HelperSerial) => Helpers.HelperSerial.ReadWrite(_AppSettings, _Logger, cancellationToken), nameof(Helpers.HelperMetrologyFiles) => Helpers.HelperMetrologyFiles.SortAndDelete(_AppSettings, _Logger), + nameof(Helpers.InfinityQSProjectHelper) => Helpers.InfinityQSProjectHelper.SendEmail(_AppSettings, _Logger), nameof(Helpers.NationalInstrumentsHelper) => Helpers.NationalInstrumentsHelper.WriteData(_AppSettings, _Logger), nameof(Helpers.DeterministicHashCodeHelper) => Helpers.DeterministicHashCodeHelper.WindowsWork(_AppSettings, _Logger), nameof(Helpers.TransmissionControlProtocolHelper) => Helpers.TransmissionControlProtocolHelper.ReadWrite(_AppSettings, _Logger),