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(); } }