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 _Args; private readonly ILogger _Logger; private readonly AppSettings _AppSettings; private readonly ConsoleKey[] _ConsoleKeys; private readonly IHostApplicationLifetime _Lifetime; public Worker(ILogger logger, IHostApplicationLifetime lifetime, List 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 = [ ConsoleKey.A, ConsoleKey.B, ConsoleKey.C, ConsoleKey.D, ConsoleKey.E, ConsoleKey.F, ConsoleKey.G, ConsoleKey.H, ConsoleKey.I, ConsoleKey.J, ConsoleKey.K, ConsoleKey.L, ConsoleKey.M, ConsoleKey.N, ConsoleKey.O, ConsoleKey.P, ConsoleKey.R, ConsoleKey.S, ConsoleKey.T, ConsoleKey.U, ConsoleKey.V, ConsoleKey.W, ConsoleKey.X, ConsoleKey.Y, 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.Count == 0) _Logger.LogInformation("Must pass a argument!"); 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) Everything delete recursive,"); _Logger.LogInformation("F) Find and delete all *.log.* files then empty directories,"); _Logger.LogInformation("G) Genealogical Data Communication,"); _Logger.LogInformation("H) Hardcoded file search and sort,"); _Logger.LogInformation("I) Ignore case and rename files to lowercase,"); _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("O) Oracle tnsNames.ora,"); _Logger.LogInformation("P) PDF parse,"); // Q _Logger.LogInformation("R) Rename to old, copy, delete old,"); _Logger.LogInformation("S) Set Date from Zip Entry,"); _Logger.LogInformation("T) *Ticks ~~Too long rename~~,"); _Logger.LogInformation("U) Links for Hugo,"); _Logger.LogInformation("V) VSCode Hope Sort,"); // W _Logger.LogInformation("X) Day Helpers,"); _Logger.LogInformation("Y) Zip file(s) by directory with file,"); _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.D: Helpers.HelperSaveOrCopyContents.SaveOrCopyContents(_Logger, _Args[0], consoleKey); break; case ConsoleKey.E: Helpers.HelperDeleteEmptyDirectories.EverythingDeleteRecursive(_Logger, _Args[0]); break; case ConsoleKey.F: Helpers.HelperDeleteEmptyDirectories.DeleteOldLogFilesAndDeleteEmptyDirectories(_Logger, _Args[0]); break; case ConsoleKey.G: Helpers.HelperGenealogicalDataCommunication.FileSystemToGenealogicalDataCommunication(_AppSettings, _Logger, _Args); break; case ConsoleKey.H: Helpers.HelperHardcodedFileSearchAndSort.HardcodedFileSearchAndSort(_Logger, _Args[0]); break; case ConsoleKey.I: Helpers.HelperSaveOrCopyContents.IgnoreCaseAndRenameFilesToLowercase(_Logger, _Args[0]); break; case ConsoleKey.J: Helpers.HelperPackageFilesByDate.SetDateFromJsonEntry(_Logger, _Args[0]); break; case ConsoleKey.K: Helpers.HelperKanbanMetadata.SetMetadata(_Logger, _AppSettings, _Args[0], addTicks: true); break; case ConsoleKey.L: Helpers.HelperLogMerge.LogMerge(_Args[0]); break; case ConsoleKey.N: Helpers.HelperCreateNoteFiles.CreateNoteFiles(_Logger, _Args[0]); break; case ConsoleKey.M: if (_Args[0].EndsWith(".kanbn") && Directory.Exists(_Args[0])) Helpers.HelperKanbanMetadata.SetMetadata(_Logger, _AppSettings, _Args[0], addTicks: false); Helpers.HelperMarkdown.MarkdownWikiLinkVerification(_AppSettings, _Logger, _Args); break; case ConsoleKey.O: Helpers.HelperFindReplace.UpdateTnsNames(_Logger, _Args); break; case ConsoleKey.P: Helpers.HelperPdfStripperWrapper.ParseSave(_Logger, _Args); Helpers.HelperPdfStripperWrapper.ParseStrip(_Logger, _Args); break; case ConsoleKey.R: Helpers.HelperRenameToOldMoveDeleteOldMerge.RenameToOldMoveDeleteOld(_Logger, _Args[0]); break; case ConsoleKey.S: _ = Helpers.HelperZipFilesBy.ExtractKeyFileAndSetDateFromZipEntry(_Logger, _Args[0]); break; case ConsoleKey.T: Helpers.HelperTooLong.UpdateDateVerifyAndGetTicksDirectories(_Logger, _AppSettings, _Args[0]); // 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.V: Helpers.HelperVSCodePossibleExtension.Sort(_Logger, _Args); break; case ConsoleKey.X: Helpers.HelperDay.Select(_AppSettings, _Logger, _Args); break; case ConsoleKey.Y: Helpers.HelperZipFilesBy.ZipFilesByDirectoryWithFile(_Logger, _Args[0]); break; case ConsoleKey.Z: _ = Helpers.HelperZipFilesBy.ZipFilesByDate(_Logger, _Args[0]); break; default: switch (consoleKey) { case ConsoleKey.Delete: Helpers.HelperDeleteEmptyDirectories.DeleteEmptyDirectories(_Logger, _Args[0]); break; default: throw new Exception(); } break; } } else throw new Exception(_Args[0]); } catch (Exception ex) { _Logger.LogError("{Message}{NewLine}{StackTrace}", ex.Message, Environment.NewLine, ex.StackTrace); } if (_IsSilent) _Logger.LogInformation("Done. Bye"); else { _Logger.LogInformation("Done. Press 'Enter' to end"); _ = Console.ReadLine(); } _Lifetime.StopApplication(); } }