diff --git a/EftPatchHelper/EftPatchHelper/EftPatchHelper.csproj b/EftPatchHelper/EftPatchHelper/EftPatchHelper.csproj index 5804d1d..b498643 100644 --- a/EftPatchHelper/EftPatchHelper/EftPatchHelper.csproj +++ b/EftPatchHelper/EftPatchHelper/EftPatchHelper.csproj @@ -5,8 +5,8 @@ net8.0 enable enable - 1.5.6 - 1.5.6 + 1.5.7 + 1.5.7 @@ -19,6 +19,7 @@ + @@ -36,4 +37,9 @@ + + + + + diff --git a/EftPatchHelper/EftPatchHelper/Helpers/FileHelper.cs b/EftPatchHelper/EftPatchHelper/Helpers/FileHelper.cs new file mode 100644 index 0000000..d91af5c --- /dev/null +++ b/EftPatchHelper/EftPatchHelper/Helpers/FileHelper.cs @@ -0,0 +1,44 @@ +using System.Reflection; +using Spectre.Console; + +namespace EftPatchHelper.Helpers; + +public class FileHelper +{ + public bool StreamAssemblyResourceOut(string resourceName, string outputFilePath) + { + try + { + var assembly = Assembly.GetExecutingAssembly(); + + FileInfo outputFile = new FileInfo(outputFilePath); + + if (outputFile.Exists) + { + outputFile.Delete(); + } + + if (!outputFile.Directory.Exists) + { + Directory.CreateDirectory(outputFile.Directory.FullName); + } + + var resName = assembly.GetManifestResourceNames().First(x => x.EndsWith(resourceName)); + + using (FileStream fs = File.Create(outputFilePath)) + using (Stream s = assembly.GetManifestResourceStream(resName)) + { + s.CopyTo(fs); + } + + outputFile.Refresh(); + return outputFile.Exists; + } + catch (Exception ex) + { + AnsiConsole.WriteException(ex); + return false; + } + } + +} \ No newline at end of file diff --git a/EftPatchHelper/EftPatchHelper/Helpers/ZipHelper.cs b/EftPatchHelper/EftPatchHelper/Helpers/ZipHelper.cs new file mode 100644 index 0000000..664d68c --- /dev/null +++ b/EftPatchHelper/EftPatchHelper/Helpers/ZipHelper.cs @@ -0,0 +1,45 @@ +using SevenZip; +using Spectre.Console; + +namespace EftPatchHelper.Helpers; + +public class ZipHelper +{ + public string DllPath = Path.Join(Environment.CurrentDirectory, "7z.dll"); + public bool Compress(DirectoryInfo folder, FileInfo outputArchive, + IProgress progress) + { + try + { + using var outputStream = outputArchive.OpenWrite(); + + SevenZipBase.SetLibraryPath(DllPath); + + var compressor = new SevenZipCompressor() + { + CompressionLevel = CompressionLevel.Normal, + CompressionMethod = CompressionMethod.Lzma2, + ArchiveFormat = OutArchiveFormat.SevenZip + }; + + compressor.Compressing += (_, args) => { progress.Report(args.PercentDone); }; + + compressor.CompressDirectory(folder.FullName, outputStream); + + outputArchive.Refresh(); + + if (!outputArchive.Exists) + { + AnsiConsole.MarkupLine("output archive not found"); + return false; + } + + return true; + } + catch (Exception ex) + { + AnsiConsole.WriteException(ex); + return false; + } + } +} \ No newline at end of file diff --git a/EftPatchHelper/EftPatchHelper/Interfaces/ICompressPatcherTask.cs b/EftPatchHelper/EftPatchHelper/Interfaces/ICompressPatcherTask.cs new file mode 100644 index 0000000..37df474 --- /dev/null +++ b/EftPatchHelper/EftPatchHelper/Interfaces/ICompressPatcherTask.cs @@ -0,0 +1,5 @@ +namespace EftPatchHelper.Interfaces; + +public interface ICompressPatcherTask : ITaskable +{ +} \ No newline at end of file diff --git a/EftPatchHelper/EftPatchHelper/Program.cs b/EftPatchHelper/EftPatchHelper/Program.cs index 2c4aac3..d172edf 100644 --- a/EftPatchHelper/EftPatchHelper/Program.cs +++ b/EftPatchHelper/EftPatchHelper/Program.cs @@ -92,6 +92,7 @@ namespace EftPatchHelper services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/EftPatchHelper/EftPatchHelper/Resources/7z.dll b/EftPatchHelper/EftPatchHelper/Resources/7z.dll new file mode 100644 index 0000000..2ba9f27 Binary files /dev/null and b/EftPatchHelper/EftPatchHelper/Resources/7z.dll differ diff --git a/EftPatchHelper/EftPatchHelper/Tasks/CompressPatcherTask.cs b/EftPatchHelper/EftPatchHelper/Tasks/CompressPatcherTask.cs new file mode 100644 index 0000000..e3974a2 --- /dev/null +++ b/EftPatchHelper/EftPatchHelper/Tasks/CompressPatcherTask.cs @@ -0,0 +1,64 @@ +using EftPatchHelper.Extensions; +using EftPatchHelper.Helpers; +using EftPatchHelper.Interfaces; +using EftPatchHelper.Model; +using Spectre.Console; + +namespace EftPatchHelper.Tasks; + +public class CompressPatcherTask : ICompressPatcherTask +{ + private Options _options; + private FileHelper _fileHelper; + private ZipHelper _zipHelper; + + public CompressPatcherTask(Options options, FileHelper fileHelper, ZipHelper zipHelper) + { + _options = options; + _fileHelper = fileHelper; + _zipHelper = zipHelper; + } + + public bool CompressPatcher() + { + AnsiConsole.Progress() + .Columns(new ProgressColumn[] + { + new TaskDescriptionColumn(), + new ProgressBarColumn(), + new PercentageColumn(), + new ElapsedTimeColumn(), + new SpinnerColumn(Spinner.Known.Dots2) + }) + .Start(ctx => + { + var compressionTask = ctx.AddTask("Compressing Patcher"); + compressionTask.MaxValue = 100; + + if (!_fileHelper.StreamAssemblyResourceOut("7z.dll", _zipHelper.DllPath)) + { + return false; + } + + var patchFolder = new DirectoryInfo(_options.OutputPatchPath); + + if (!patchFolder.Exists) + { + return false; + } + + var patchArchiveFile = new FileInfo(_options.OutputPatchPath + ".7z"); + + var progress = new Progress(p => { compressionTask.Increment(p - compressionTask.Percentage);}); + + return _zipHelper.Compress(patchFolder, patchArchiveFile, progress); + }); + + return false; + } + + public void Run() + { + CompressPatcher().ValidateOrExit(); + } +} \ No newline at end of file diff --git a/EftPatchHelper/EftPatchHelper/Tasks/PatchGenTasks.cs b/EftPatchHelper/EftPatchHelper/Tasks/PatchGenTasks.cs index 250904d..8ae1da3 100644 --- a/EftPatchHelper/EftPatchHelper/Tasks/PatchGenTasks.cs +++ b/EftPatchHelper/EftPatchHelper/Tasks/PatchGenTasks.cs @@ -48,7 +48,6 @@ namespace EftPatchHelper.Tasks $"OutputFolderName::{patcherOutputName}", $"SourceFolderPath::{_options.SourceClient.PrepPath}", $"TargetFolderPath::{_options.TargetClient.PrepPath}", - $"AutoZip::{_settings.AutoZip}", $"AutoClose::{_settings.AutoClose}" } });