151 lines
6.8 KiB
C#
151 lines
6.8 KiB
C#
using Microsoft.Extensions.Logging;
|
|
using System.Collections.ObjectModel;
|
|
|
|
namespace File_Folder_Helper.ADO2024.PI1;
|
|
|
|
internal static partial class Helper20240403
|
|
{
|
|
|
|
private record DynamicHostConfigurationProtocolConfiguration(string[] Columns,
|
|
string Directory,
|
|
string Ignore,
|
|
int KeyIndex,
|
|
string Pattern,
|
|
string Primary);
|
|
|
|
private static void AlertIfNewDeviceIsConnected(DynamicHostConfigurationProtocolConfiguration dynamicHostConfigurationProtocolConfiguration, ILogger<Worker> logger)
|
|
{
|
|
string[] files = Directory.GetFiles(dynamicHostConfigurationProtocolConfiguration.Directory, dynamicHostConfigurationProtocolConfiguration.Pattern, SearchOption.TopDirectoryOnly);
|
|
string? match = GetMatch(dynamicHostConfigurationProtocolConfiguration, files);
|
|
if (string.IsNullOrEmpty(match))
|
|
throw new NotSupportedException($"{dynamicHostConfigurationProtocolConfiguration.Primary} doesn't exist!");
|
|
ReadOnlyDictionary<string, int> keyToCounts = GetKeyToCounts(dynamicHostConfigurationProtocolConfiguration, files);
|
|
foreach (KeyValuePair<string, int> keyToCount in keyToCounts)
|
|
{
|
|
if (keyToCount.Value < 2)
|
|
continue;
|
|
logger.LogInformation("{Key}: {Count}", keyToCount.Key, keyToCount.Value);
|
|
}
|
|
ReadOnlyDictionary<string, ReadOnlyDictionary<string, ReadOnlyCollection<string>>> keyValuePairs = GetKeyValuePairs(dynamicHostConfigurationProtocolConfiguration, files);
|
|
foreach (KeyValuePair<string, ReadOnlyDictionary<string, ReadOnlyCollection<string>>> keyValuePair in keyValuePairs)
|
|
{
|
|
if (!keyValuePair.Key.EndsWith(dynamicHostConfigurationProtocolConfiguration.Primary))
|
|
continue;
|
|
}
|
|
}
|
|
|
|
internal static void AlertIfNewDeviceIsConnected(ILogger<Worker> logger, List<string> args)
|
|
{
|
|
string ignore = args[6];
|
|
string pattern = args[2];
|
|
string primary = args[3];
|
|
string keyIndex = args[5];
|
|
string directory = args[0];
|
|
logger.LogInformation(directory);
|
|
string[] columns = args[4].Split('~');
|
|
DynamicHostConfigurationProtocolConfiguration dynamicHostConfigurationProtocolConfiguration = new(columns, directory, ignore, int.Parse(keyIndex), pattern, primary);
|
|
AlertIfNewDeviceIsConnected(dynamicHostConfigurationProtocolConfiguration, logger);
|
|
}
|
|
|
|
private static string? GetMatch(DynamicHostConfigurationProtocolConfiguration dynamicHostConfigurationProtocolConfiguration, string[] files)
|
|
{
|
|
string? result = null;
|
|
foreach (string file in files)
|
|
{
|
|
if (file.EndsWith(dynamicHostConfigurationProtocolConfiguration.Primary))
|
|
result = file;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static ReadOnlyDictionary<string, int> GetKeyToCounts(DynamicHostConfigurationProtocolConfiguration dynamicHostConfigurationProtocolConfiguration, string[] files)
|
|
{
|
|
Dictionary<string, int> results = [];
|
|
bool check;
|
|
string key;
|
|
string[] lines;
|
|
string[] segments;
|
|
List<int>? collection;
|
|
Dictionary<string, List<int>> keyValuePairs = [];
|
|
int columnsLength = dynamicHostConfigurationProtocolConfiguration.Columns.Length;
|
|
foreach (string file in files)
|
|
{
|
|
check = false;
|
|
lines = File.ReadAllLines(file);
|
|
foreach (string line in lines)
|
|
{
|
|
if (line.Length < 3 || line[0] != '|' || line[^1] != '|')
|
|
continue;
|
|
segments = line.Split('|');
|
|
if (segments.Length != columnsLength)
|
|
continue;
|
|
key = segments[dynamicHostConfigurationProtocolConfiguration.KeyIndex].Trim();
|
|
if (!check)
|
|
{
|
|
if (!key.StartsWith('-') || !key.EndsWith('-'))
|
|
continue;
|
|
check = true;
|
|
continue;
|
|
}
|
|
if (key == dynamicHostConfigurationProtocolConfiguration.Ignore)
|
|
break;
|
|
if (!keyValuePairs.TryGetValue(key, out collection))
|
|
{
|
|
keyValuePairs.Add(key, []);
|
|
if (!keyValuePairs.TryGetValue(key, out collection))
|
|
throw new Exception();
|
|
}
|
|
collection.Add(1);
|
|
}
|
|
}
|
|
foreach (KeyValuePair<string, List<int>> keyValuePair in keyValuePairs.OrderByDescending(l => l.Value.Count))
|
|
results.Add(keyValuePair.Key, keyValuePair.Value.Count);
|
|
return new(results);
|
|
}
|
|
|
|
private static ReadOnlyDictionary<string, ReadOnlyDictionary<string, ReadOnlyCollection<string>>> GetKeyValuePairs(DynamicHostConfigurationProtocolConfiguration dynamicHostConfigurationProtocolConfiguration, string[] files)
|
|
{
|
|
ReadOnlyDictionary<string, ReadOnlyDictionary<string, ReadOnlyCollection<string>>> results;
|
|
bool check;
|
|
string key;
|
|
string[] lines;
|
|
string[] segments;
|
|
List<string> keys = [];
|
|
Dictionary<string, ReadOnlyCollection<string>> keyValuePairs;
|
|
Dictionary<string, ReadOnlyDictionary<string, ReadOnlyCollection<string>>> fileTo = [];
|
|
int columnsLength = dynamicHostConfigurationProtocolConfiguration.Columns.Length;
|
|
foreach (string file in files)
|
|
{
|
|
keys.Clear();
|
|
check = false;
|
|
keyValuePairs = [];
|
|
lines = File.ReadAllLines(file);
|
|
foreach (string line in lines)
|
|
{
|
|
if (line.Length < 3 || line[0] != '|' || line[^1] != '|')
|
|
continue;
|
|
segments = line.Split('|');
|
|
if (segments.Length != columnsLength)
|
|
continue;
|
|
key = segments[dynamicHostConfigurationProtocolConfiguration.KeyIndex].Trim();
|
|
if (!check)
|
|
{
|
|
if (!key.StartsWith('-') || !key.EndsWith('-'))
|
|
continue;
|
|
check = true;
|
|
continue;
|
|
}
|
|
if (key == dynamicHostConfigurationProtocolConfiguration.Ignore)
|
|
break;
|
|
if (keys.Contains(key))
|
|
throw new NotSupportedException($"{key}: is a duplicate!");
|
|
keys.Add(key);
|
|
keyValuePairs.Add(key, new(segments.Select(l => l.Trim()).ToArray()));
|
|
}
|
|
fileTo.Add(Path.GetFullPath(file), new(keyValuePairs));
|
|
}
|
|
results = new(fileTo);
|
|
return results;
|
|
}
|
|
|
|
} |