diff --git a/diff-text/diff-text.csproj b/diff-text/diff-text.csproj index 7461e1c..a0f20aa 100644 --- a/diff-text/diff-text.csproj +++ b/diff-text/diff-text.csproj @@ -1,5 +1,4 @@ - Exe net7.0 @@ -7,15 +6,9 @@ disable enable - - - - - - - - - + + + diff --git a/paradox-mod-merger.sln b/paradox-mod-merger.sln index 47c8dd3..3dff967 100644 --- a/paradox-mod-merger.sln +++ b/paradox-mod-merger.sln @@ -15,8 +15,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "solution_files", "solution_ Makefile = Makefile EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DTLib", "..\DTLib\DTLib\DTLib.csproj", "{67E226B7-F04B-4FB1-A9AA-E4AE3A5A8A3F}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "diff-text", "diff-text\diff-text.csproj", "{720D8D44-A9D3-4F58-BA1E-EA95808D1376}" EndProject Global @@ -29,10 +27,6 @@ Global {076BFCFF-1D3E-44FB-B434-73716B79A135}.Release|Any CPU.Build.0 = Release|Any CPU {076BFCFF-1D3E-44FB-B434-73716B79A135}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {076BFCFF-1D3E-44FB-B434-73716B79A135}.Debug|Any CPU.Build.0 = Debug|Any CPU - {67E226B7-F04B-4FB1-A9AA-E4AE3A5A8A3F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {67E226B7-F04B-4FB1-A9AA-E4AE3A5A8A3F}.Release|Any CPU.Build.0 = Release|Any CPU - {67E226B7-F04B-4FB1-A9AA-E4AE3A5A8A3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {67E226B7-F04B-4FB1-A9AA-E4AE3A5A8A3F}.Debug|Any CPU.Build.0 = Debug|Any CPU {720D8D44-A9D3-4F58-BA1E-EA95808D1376}.Release|Any CPU.ActiveCfg = Release|Any CPU {720D8D44-A9D3-4F58-BA1E-EA95808D1376}.Release|Any CPU.Build.0 = Release|Any CPU {720D8D44-A9D3-4F58-BA1E-EA95808D1376}.Debug|Any CPU.ActiveCfg = Debug|Any CPU diff --git a/paradox-mod-merger/Diff.cs b/paradox-mod-merger/Diff.cs index 21a9c5e..56fb961 100644 --- a/paradox-mod-merger/Diff.cs +++ b/paradox-mod-merger/Diff.cs @@ -14,8 +14,8 @@ public record struct ConflictingModFile(string FilePath, string[] Mods); static class Diff { - static ConsoleLogger logger = new("logs", "diff"); - static void Log(params string[] msg) => logger.Log(msg); + static ContextLogger logger = new (nameof(Diff), new FileLogger("logs", "diff")); + static void Log(params string[] msg) => logger.LogColored(msg); public static void DiffCommandHandler(string connected_pathes) { diff --git a/paradox-mod-merger/IronyIntegration.cs b/paradox-mod-merger/IronyIntegration.cs new file mode 100644 index 0000000..aca5dc7 --- /dev/null +++ b/paradox-mod-merger/IronyIntegration.cs @@ -0,0 +1,79 @@ +namespace ParadoxModMerger; + +public static class IronyIntegration +{ + static ContextLogger logger = new(nameof(IronyIntegration), new FileLogger("logs", "irony-integration")); + static void Log(params string[] msg) => logger.LogColored(msg); + + public static void GenerateIronyCollection(string dirs_with_mods_connected, IOPath out_json_file_path) + { + IOPath[] dirs_with_mods = Program.SplitArgToPaths(dirs_with_mods_connected, true); + var mod_desc_values = new List<(string name, string steam_id)>(); + foreach (var dir in dirs_with_mods) + { + foreach (var mod_dir in Directory.GetDirectories(dir)) + { + IOPath descriptor_path = Path.Concat(mod_dir, "descriptor.mod"); + if (!File.Exists(descriptor_path)) + Log("y", "directory ", "c", mod_dir.Str, "y", " doesn't contain descriptor"); + else + { + string? name=null, remote_file_id=null; + var lines = System.IO.File.ReadAllLines(descriptor_path.Str); + foreach (var line in lines) + { + if (line.StartsWith("name=")) + { + // "name=\"".Length==6 + name = line.Substring(6, line.LastIndexOf('\"')-6); + } + else if (line.StartsWith("remote_file_id=")) + { + // "remote_file_id=\"".Length==16 + remote_file_id = line.Substring(16, line.LastIndexOf('\"')-16); + } + } + + if (name.IsNullOrEmpty()) + throw new NullReferenceException("name=null"); + if (remote_file_id.IsNullOrEmpty()) + throw new NullReferenceException("remote_file_id=null"); + mod_desc_values.Add((name,remote_file_id)!); + Log("b",$"[{mod_desc_values.Count-1}] {{ ", "c", name!, "b", $", {remote_file_id!} }}"); + } + } + } + + + using var out_json_stream = File.OpenWrite(out_json_file_path); + using var stream_writer = new System.IO.StreamWriter(out_json_stream, StringConverter.UTF8); + stream_writer.WriteLine($$""" + { + "game":"stellaris", + "name":"{{out_json_file_path.LastName().AsSpan().BeforeLast('.')}}", + "mods":[ + """); + + for (int mod_pos = 0; mod_pos < mod_desc_values.Count; mod_pos++) + { + stream_writer.Write($$""" + { + "displayName":"{{mod_desc_values[mod_pos].name}}", + "enabled":true, + "position":{{mod_pos}}, + "steamId":"{{mod_desc_values[mod_pos].steam_id}}" + } + """); + if(mod_pos logger.Log(msg); + static ContextLogger logger = new(nameof(Localisation), new FileLogger("logs", "autoloc")); + static void Log(params string[] msg) => logger.LogColored(msg); public static void GenerateRussian(IOPath _engDir, IOPath _rusDir) { diff --git a/paradox-mod-merger/Merge.cs b/paradox-mod-merger/Merge.cs index 3f8d63c..1a5e473 100644 --- a/paradox-mod-merger/Merge.cs +++ b/paradox-mod-merger/Merge.cs @@ -2,8 +2,8 @@ static class Merge { - static ConsoleLogger logger = new("logs", "merge"); - static void Log(params string[] msg) => logger.Log(msg); + static ContextLogger logger = new(nameof(Merge), new FileLogger("logs", "merge")); + static void Log(params string[] msg) => logger.LogColored(msg); private const string modlist_filename = "modlist.txt"; diff --git a/paradox-mod-merger/Program.cs b/paradox-mod-merger/Program.cs index bae5695..9576615 100644 --- a/paradox-mod-merger/Program.cs +++ b/paradox-mod-merger/Program.cs @@ -15,8 +15,20 @@ namespace ParadoxModMerger; public static class Program { - static ConsoleLogger logger = new("logs", "main"); - static void Log(params string[] msg) => logger.Log(msg); + static ContextLogger logger = new ContextLogger(nameof(Program), new FileLogger("logs", "main")); + static void Log(params string[] msg) => logger.LogColored(msg); + + public static void LogColored(this ContextLogger _logger, params string[] msg) + { + ColoredConsole.WriteLine(msg); + + StringBuilder b = new(); + if (msg.Length == 1) + b.Append(msg[0]); + else for (int i = 1; i < msg.Length; i+=2) + b.Append(msg[i]); + _logger.LogInfo(b.ToString()); + } public static bool YesAll = false; @@ -28,67 +40,73 @@ public static class Program Console.InputEncoding=Encoding.UTF8; string outPath = "" ; - + new LaunchArgumentParser( - new LaunchArgument(new []{"o", "out"}, - "Sets output path", - p => outPath=p, + new LaunchArgument(new[] { "o", "out" }, + "Sets output path", + p => outPath = p, "out_path", + 0), + new LaunchArgument(new[] { "y", "yes-all" }, + "Automatically answers [Y] to all questions", + () => YesAll = true, 0), - new LaunchArgument(new []{"y", "yes-all"}, - "Automatically answers [Y] to all questions", - ()=> YesAll=true, - 0), - new LaunchArgument(new []{"clear"}, - "Clear mod files and put them into separate dirs in output dir. Requires -o", - wdir=>Workshop.ClearWorkshop(wdir, outPath), - "workshop_dir", + new LaunchArgument(new[] { "clear" }, + "Clear mod files and put them into separate dirs in output dir. Requires -o", + wdir => Workshop.ClearWorkshop(wdir, outPath), + "workshop_dir", 1), - new LaunchArgument(new []{"diff"}, + new LaunchArgument(new[] { "diff" }, "Compares mod files by hash", - p=>Diff.DiffCommandHandler(p), - "first_mod_directory:second_mod_directory:...", + p => Diff.DiffCommandHandler(p), + "first_mod_directory:second_mod_directory:...", 1), - new LaunchArgument(new []{"diff-detailed"}, + new LaunchArgument(new[] { "diff-detailed" }, "reads conflicts_XXX.dtsod file and shows text diff for each file", - p=>Diff.DiffDetailedCommandHandler(p), - "conflicts_dtsod_path", + p => Diff.DiffDetailedCommandHandler(p), + "conflicts_dtsod_path", 1), - new LaunchArgument(new []{"merge-subdirs"}, - "Merges mods and shows conflicts. Requires -o", + new LaunchArgument(new[] { "merge-subdirs" }, + "Merges mods and shows conflicts. Requires -o", d => Merge.MergeAll(Directory.GetDirectories(d), outPath), - "dir_with_mods", + "dir_with_mods", 1), - new LaunchArgument(new []{"merge-into", "merge-single"}, + new LaunchArgument(new[] { "merge-into", "merge-single" }, "Merges one mod into output dir and shows conflicts. Requires -o", - mod=>Merge.MergeInto(mod, outPath), + mod => Merge.MergeInto(mod, outPath), "mod_dir", - 1), - new LaunchArgument(new []{"gen-rus-locale"}, + 1), + new LaunchArgument(new[] { "gen-rus-locale" }, "Creates l_russian copy of english locale in output directory. Requires -o", - eng=>Localisation.GenerateRussian(eng, outPath), - "english_locale_path", + eng => Localisation.GenerateRussian(eng, outPath), + "english_locale_path", 1), - new LaunchArgument(new []{"desc"}, + new LaunchArgument(new[] { "desc" }, "Downloads mod description from steam to new file in outDir. Requires -o", - id=>Workshop.CreateDescFile(id, outPath).GetAwaiter().GetResult(), + id => Workshop.CreateDescFile(id, outPath).GetAwaiter().GetResult(), "mod_id", 1), - new LaunchArgument(new []{"rename"}, + new LaunchArgument(new[] { "rename" }, "Renames mods in directory", - (modsdir, replace_pairs)=>Merge.RenameModsCommandHandler(modsdir, replace_pairs), + (modsdir, replace_pairs) => Merge.RenameModsCommandHandler(modsdir, replace_pairs), "dir_with_mods", "replace_pairs (old_name:new_name:...)", 1), - new LaunchArgument(new []{"update-mods"}, + new LaunchArgument(new[] { "update-mods" }, "Updates mods in [outdated_dir0...outdated_dirN] to new versions if found in updated_mods_dir. " + "Moves old mods to backup_dir defined by -o.", - (updated, outdated)=>Merge.UpdateMods(updated, SplitArgToPaths(outdated, true), outPath), + (updated, outdated) => Merge.UpdateMods(updated, SplitArgToPaths(outdated, true), outPath), "updated_mods_dir", "outdated_dir OR outdated_dir0:...:outdated_dirN", 1), - new LaunchArgument(new []{"clean-locales"}, + new LaunchArgument(new[] { "clean-locales" }, "Deletes all localisations except l_russian and l_english.", - locdir=> Localisation.Clean(locdir), - "localisation_dir", + locdir => Localisation.Clean(locdir), + "localisation_dir", + 1), + new LaunchArgument(new[] { "gen-collection-json" }, + "Generates json file representing mod collection in format readable by pdx launcher and IronyModManager." + + "Requires -o", + (connected_dirs) => IronyIntegration.GenerateIronyCollection(connected_dirs, outPath), + "connected_dirs_with_mods", 1) ).ParseAndHandle(args); } diff --git a/paradox-mod-merger/Workshop.cs b/paradox-mod-merger/Workshop.cs index ffb3bc8..c4d3bd9 100644 --- a/paradox-mod-merger/Workshop.cs +++ b/paradox-mod-merger/Workshop.cs @@ -6,8 +6,8 @@ namespace ParadoxModMerger; static class Workshop { - static ConsoleLogger logger = new("logs", "clear"); - static void Log(params string[] msg) => logger.Log(msg); + static ContextLogger logger = new(nameof(Workshop), new FileLogger("logs", "clear")); + static void Log(params string[] msg) => logger.LogColored(msg); public static void ClearWorkshop(IOPath workshopDir, IOPath outDir) { @@ -17,7 +17,7 @@ static class Workshop for (int i = 0; i < moddirs.Length; i++) { - string modId = moddirs[i].LastName().ToString(); + string modId = moddirs[i].LastName().Str; var zips = Directory.GetFiles(moddirs[i], "*.zip"); if (zips.Length > 0) { diff --git a/paradox-mod-merger/paradox-mod-merger.csproj b/paradox-mod-merger/paradox-mod-merger.csproj index 270114f..00fc4c7 100644 --- a/paradox-mod-merger/paradox-mod-merger.csproj +++ b/paradox-mod-merger/paradox-mod-merger.csproj @@ -5,23 +5,15 @@ net7.0 ParadoxModMerger paradox-mod-merger - 10 + latest enable - - - - + + - - - - - -