Files
file-watcher/Helpers/InfinityQSProjectHelper.cs

114 lines
4.5 KiB
C#

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<string> FilteredLines,
DateTime LastWriteTimeUtc,
string Path);
private static long _LastReview = DateTime.UtcNow.Ticks;
private static readonly Dictionary<string, Record> _KeyValuePairs = [];
internal static bool SendEmail(AppSettings appSettings, ILogger<Worker> logger)
{
InfinityQSProjectConfiguration configuration = appSettings.InfinityQSProjectConfiguration;
Clear(logger, configuration);
ReadOnlyDictionary<string, Record> keyValuePairs = GetKeyValuePairs(logger, configuration);
SendEmail(logger, configuration, keyValuePairs);
_LastReview = DateTime.UtcNow.Ticks;
return true;
}
private static void Clear(ILogger<Worker> logger, InfinityQSProjectConfiguration configuration)
{
long check = DateTime.UtcNow.AddHours(-configuration.ClearEveryHours).Ticks;
foreach (KeyValuePair<string, Record> keyValuePair in _KeyValuePairs)
{
if (keyValuePair.Value.LastWriteTimeUtc.Ticks < check)
{
_ = _KeyValuePairs.Remove(keyValuePair.Key);
logger.LogDebug("Clear File:{file}", keyValuePair.Key);
}
}
}
private static ReadOnlyDictionary<string, Record> GetKeyValuePairs(ILogger<Worker> logger, InfinityQSProjectConfiguration configuration)
{
bool check;
Record? record;
string[] lines;
FileInfo fileInfo;
List<string> filtered = [];
Dictionary<string, Record> 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<Worker> logger, InfinityQSProjectConfiguration configuration, ReadOnlyDictionary<string, Record> keyValuePairs)
{
string body;
foreach (KeyValuePair<string, Record> 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();
}
}