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
-
-
-
-
+
+
-
-
-
-
-
-