file-folder-helper/Worker.cs
2023-07-31 14:21:41 -07:00

190 lines
8.3 KiB
C#

using File_Folder_Helper.Models;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace File_Folder_Helper;
public class Worker : BackgroundService
{
private readonly bool _IsSilent;
private readonly List<string> _Args;
private readonly ILogger<Worker> _Logger;
private readonly AppSettings _AppSettings;
private readonly ConsoleKey[] _ConsoleKeys;
private readonly IHostApplicationLifetime _Lifetime;
public Worker(ILogger<Worker> logger, IHostApplicationLifetime lifetime, List<string> args, AppSettings appSettings)
{
_Args = args;
_Logger = logger;
_Lifetime = lifetime;
_AppSettings = appSettings;
int silentIndex = args.IndexOf("s");
_IsSilent = silentIndex > -1;
if (_IsSilent)
args.RemoveAt(silentIndex);
_ConsoleKeys = new ConsoleKey[]
{
ConsoleKey.A,
ConsoleKey.B,
ConsoleKey.C,
ConsoleKey.D,
ConsoleKey.E,
ConsoleKey.F,
ConsoleKey.G,
ConsoleKey.H,
ConsoleKey.J,
ConsoleKey.K,
ConsoleKey.L,
ConsoleKey.M,
ConsoleKey.N,
ConsoleKey.R,
ConsoleKey.S,
ConsoleKey.T,
ConsoleKey.U,
ConsoleKey.Z,
ConsoleKey.Delete
};
}
public override Task StartAsync(CancellationToken cancellationToken) =>
base.StartAsync(cancellationToken);
public override Task StopAsync(CancellationToken cancellationToken) =>
base.StopAsync(cancellationToken);
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
if (!stoppingToken.IsCancellationRequested)
await Task.Delay(500, stoppingToken);
if (_AppSettings is null)
throw new NullReferenceException(nameof(_AppSettings));
try
{
int? singleCharIndex = null;
ConsoleKey consoleKey = ConsoleKey.End;
for (int i = 0; i < _Args.Count; i++)
{
if (_Args[i].Length == 1 && Enum.TryParse(_Args[i], out consoleKey) && _ConsoleKeys.Contains(consoleKey))
{
singleCharIndex = i;
break;
}
}
if (consoleKey is not ConsoleKey.End && !_ConsoleKeys.Contains(consoleKey))
consoleKey = ConsoleKey.End;
if (singleCharIndex is not null)
_Args.RemoveAt(singleCharIndex.Value);
if (!_Args.Any())
_Logger.LogInformation("Must pass a argument!");
else if (_Args[0].EndsWith(".kanbn") && Directory.Exists(_Args[0]))
Helpers.HelperKanbanMetadata.SetMetadata(_Logger, _AppSettings, _Args[0]);
else if (Directory.Exists(_Args[0]) && File.Exists(Path.Combine(_Args[0], string.Concat(Path.GetFileName(_Args[0]), ".dll"))))
Helpers.HelperILMerge.ILMerge(_Args[0]);
else if (Directory.Exists(_Args[0]))
{
for (int i = 0; i < int.MaxValue; i++)
{
if (_ConsoleKeys.Contains(consoleKey))
break;
_Logger.LogInformation("A) Save (Top Directory Only),");
_Logger.LogInformation("B) Save (All Directories),");
_Logger.LogInformation("C) Clipboard (Top Directory Only),");
_Logger.LogInformation("D) Clipboard (All Directories),");
_Logger.LogInformation("E) Clipboard (Top Directory Only and File Name Without Extension),");
_Logger.LogInformation("F) Clipboard (All Directories and File Name Without Extension),");
_Logger.LogInformation("G) Genealogical Data Communication");
_Logger.LogInformation("H) Hardcoded file search and sort,");
_Logger.LogInformation("J) Set Date from Json Entry");
_Logger.LogInformation("K) Kanban support");
_Logger.LogInformation("L) Log Merge (APC Log [0-9(8)]_*.log),");
_Logger.LogInformation("N) Create Note Files,");
_Logger.LogInformation("M) Markdown Wiki Link Verification,");
_Logger.LogInformation("R) Rename to old, copy, delete old");
_Logger.LogInformation("S) Set Date from Zip Entry");
_Logger.LogInformation("T) Too long rename");
_Logger.LogInformation("U) Links for Hugo");
_Logger.LogInformation("Z) Zip file(s) by date,");
_Logger.LogInformation("Delete) Delete empty directories,");
consoleKey = Console.ReadKey().Key;
_Logger.LogInformation(" ");
}
switch (consoleKey)
{
case ConsoleKey.A:
case ConsoleKey.B:
case ConsoleKey.C:
case ConsoleKey.E:
case ConsoleKey.F:
Helpers.HelperSaveOrCopyContents.SaveOrCopyContents(_Logger, _Args[0], consoleKey);
break;
case ConsoleKey.G:
Helpers.HelperGenealogicalDataCommunication.FileSystemToGenealogicalDataCommunication(_AppSettings, _Logger, _Args);
break;
case ConsoleKey.H:
Helpers.HelperHardcodedFileSearchAndSort.HardcodedFileSearchAndSort(_Logger, _Args[0]);
break;
case ConsoleKey.J:
Helpers.HelperPackageFilesByDate.SetDateFromJsonEntry(_Logger, _Args[0]);
break;
case ConsoleKey.K:
Helpers.HelperKanbanMetadata.SetMetadata(_Logger, _AppSettings, _Args[0]);
break;
case ConsoleKey.L:
Helpers.HelperLogMerge.LogMerge(_Args[0]);
break;
case ConsoleKey.N:
Helpers.HelperCreateNoteFiles.CreateNoteFiles(_Args[0]);
break;
case ConsoleKey.M:
Helpers.HelperMarkdown.MarkdownWikiLinkVerification(_AppSettings, _Logger, _Args);
break;
case ConsoleKey.R:
Helpers.HelperRenameToOldMoveDeleteOldMerge.RenameToOldMoveDeleteOld(_Logger, _Args[0]);
break;
case ConsoleKey.S:
_ = Helpers.HelperZipFilesByDate.SetDateFromZipEntry(_Logger, _Args[0]);
break;
case ConsoleKey.T:
Helpers.HelperTooLong.TooLong(_Args[0], delete: false);
Helpers.HelperTooLong.TooLong(_Args[0], delete: true);
break;
case ConsoleKey.U:
Helpers.HelperMarkdown.MarkdownConvertLinksForHugo(_AppSettings, _Logger, _Args);
break;
case ConsoleKey.Z:
_ = Helpers.HelperZipFilesByDate.ZipFilesByDate(_Logger, _Args[0]);
break;
default:
switch (consoleKey)
{
case ConsoleKey.Delete:
for (int j = 1; j < 6; j++)
{
if (!Helpers.HelperDeleteEmptyDirectories.DeleteEmptyDirectories(_Args[0]))
break;
}
break;
default:
throw new Exception();
}
break;
}
}
else
throw new Exception(_Args[0]);
}
catch (Exception ex)
{ _Logger.LogError(string.Concat(ex.Message, Environment.NewLine, ex.StackTrace)); }
if (_IsSilent)
_Logger.LogInformation("Done. Bye");
else
{
_Logger.LogInformation("Done. Press 'Enter' to end");
_ = Console.ReadLine();
}
_Lifetime.StopApplication();
}
}