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),