114 lines
4.5 KiB
C#
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();
|
|
}
|
|
|
|
} |