diff --git a/WTT/WTT/Program.cs b/WTT/WTT/Program.cs index abdb932..d51927a 100644 --- a/WTT/WTT/Program.cs +++ b/WTT/WTT/Program.cs @@ -1,28 +1,30 @@ using WhackTranslationTool; string? basePath = null; // @"WindowsNoEditor\Mercury\Content\Message"; +bool? overwrite = null; static string ResolveFileOverwrite(string path) { while (true) { - Console.WriteLine($"A file already exists at '{path}'"); - Console.Write("Overwrite (y/n)? "); + var overwrite = YesNoPrompt.Ask(() => + { + Console.WriteLine($"A file already exists at '{path}'"); + Console.Write("Overwrite (Y/n)? "); + }); - var input = Console.ReadLine()!.Trim().ToLowerInvariant(); - - if (input == "y") + if (overwrite) { return path; } - - if (input == "n") + else { - Console.Write("Enter a new path: '"); - return Console.ReadLine()!.Trim(); + Console.Write("Enter a new path: "); + var newPath = Console.ReadLine()!.Trim(); + if (newPath.Length < 1) + continue; + return newPath; } - - Console.WriteLine($"Invalid selection!" + Environment.NewLine); } } @@ -38,16 +40,32 @@ while (true) { if (basePath != null) Console.WriteLine("Invalid path to Message directory."); - Console.Write("Path to Message directory: "); + Console.Write("Path to the game's Message directory: "); basePath = Console.ReadLine()!.Trim(); continue; } - Console.WriteLine("'e' for export, 'i' for import, 'bulk_import', 'bulk_export', 'q' to quit"); + Console.WriteLine(); + while (overwrite == null) + { + overwrite = YesNoPrompt.Ask(() => + { + Console.WriteLine("! Overwrite mode will read from and overwrite files in your original Message folder."); + Console.Write("Enable overwrite mode (Y/n)? "); + }); + Console.WriteLine(); + } + Console.WriteLine("'e' for export, 'i' for import, 'bi' or 'bulk_import', 'be' or 'bulk_export', 'o' to toggle overwrite mode, 'q' to quit"); + Console.WriteLine($"overwrite mode: {(overwrite.Value ? "ON" : "OFF")}"); Console.WriteLine("reminder: don't screw up"); Console.Write("Action: "); var action = Console.ReadLine()!.Trim().ToLowerInvariant(); switch (action) { + case "o": + overwrite = !overwrite; + Console.WriteLine($"! Overwrite mode is now {(overwrite.Value ? "ON" : "OFF")}"); + break; + case "be": case "bulk_export": { var files = Directory.GetFiles(basePath, "*.uasset"); @@ -69,39 +87,59 @@ while (true) break; } + case "bi": case "bulk_import": - { - Console.WriteLine(Environment.NewLine + "[Bulk Import Mode]"); - Console.Write("Enter the path to the directory of TOML files: "); - var tomlFolder = Console.ReadLine()!; - Console.Write("Enter the path to the uasset directory: "); - var assetFolder = Console.ReadLine()!; - Console.Write("Enter the path to the output uasset directory: "); - var outputFolder = Console.ReadLine()!; - var files = Directory.GetFiles(tomlFolder, "*.toml"); - foreach (var tableName in files) { - var assetFilename = GetAssetFilename(tableName); - var importer = new TableImporter(tableName, Path.Combine(assetFolder, assetFilename)); - var outputPath = Path.Combine(outputFolder, assetFilename); - Console.WriteLine($"Exporting to {outputPath}"); - importer.Write(outputPath); + Console.WriteLine(Environment.NewLine + "[Bulk Import Mode]"); + Console.Write("Enter the path to the directory of TOML files: "); + var tomlFolder = Console.ReadLine()!; + string assetFolder, outputFolder; + if (!overwrite.Value) + { + Console.Write("Enter the path to the uasset directory: "); + assetFolder = Console.ReadLine()!; + Console.Write("Enter the path to the output uasset directory: "); + outputFolder = Console.ReadLine()!; + } + else + { + Console.Write("! Override mode is on: using original Message directory."); + assetFolder = basePath; + outputFolder = basePath; + } + if (assetFolder.Length < 1 || outputFolder.Length < 1) + { + Console.WriteLine($"! Didn't get a value for one of the directories, cancelling."); + break; + } + var files = Directory.GetFiles(tomlFolder, "*.toml"); + foreach (var tableName in files) + { + var assetFilename = GetAssetFilename(tableName); + var importer = new TableImporter(tableName, Path.Combine(assetFolder, assetFilename)); + var outputPath = Path.Combine(outputFolder, assetFilename); + Console.WriteLine($"Exporting to {outputPath}"); + importer.Write(outputPath); + } + break; } - break; - } case "e": { Console.WriteLine(Environment.NewLine + "[Export Mode]"); Console.Write("Enter the name of the asset (e.g., 'WelcomeMessage.uasset'): "); var tableName = Console.ReadLine()!.Trim(); - var exporter = new TableExporter(Path.Combine(basePath, tableName)); + if (tableName.Length < 1) + { + Console.WriteLine("! Didn't get a path to an asset, cancelling."); + break; + } + var exporter = new TableExporter(Path.Combine(basePath, tableName)); var targetPath = Path.ChangeExtension(tableName, "toml"); if (File.Exists(targetPath)) { targetPath = ResolveFileOverwrite(targetPath); } - using StreamWriter writer = File.CreateText(targetPath); exporter.WriteTo(writer); writer.Flush(); diff --git a/WTT/WTT/TableImporter.cs b/WTT/WTT/TableImporter.cs index ec4099d..bb609d5 100644 --- a/WTT/WTT/TableImporter.cs +++ b/WTT/WTT/TableImporter.cs @@ -53,12 +53,13 @@ public class TableImporter } // prompt to retry so I don't have to keep restarting this thing - Console.Write("Try again (Y/n)? "); - var response = Console.ReadLine()!.Trim().ToLowerInvariant(); - if (response is not ("" or "y" or "yes")) + var retry = YesNoPrompt.Ask(() => { + Console.Write("Try again (Y/n)?"); + }); + + if (!retry) break; - } } } diff --git a/WTT/WTT/YesNoPrompt.cs b/WTT/WTT/YesNoPrompt.cs new file mode 100644 index 0000000..75881d5 --- /dev/null +++ b/WTT/WTT/YesNoPrompt.cs @@ -0,0 +1,31 @@ +using System; + +namespace WhackTranslationTool +{ + internal class YesNoPrompt + { + /// + /// Call promptMessageFunc and ask for response + /// Default is always Y with no response + /// + /// Optional function to call before ReadLine() + /// The answer + public static bool Ask(Action? promptMessageFunc = null) + { + while (true) + { + if (promptMessageFunc != null) + promptMessageFunc(); + var response = Console.ReadLine()!.Trim().ToLowerInvariant(); + if (response is "" or "y" or "yes") + { + return true; + } + else if (response is "n") + { + return false; + } + } + } + } +}