public static async Task Main(string[] args) { ServiceLocator.Default.RegisterType <ILoggerService, LoggerService>(); ServiceLocator.Default.RegisterType <IMainController, MainController>(); var _maincontroller = ServiceLocator.Default.ResolveType <IMainController>(); // get csv data Console.WriteLine("Loading Hashes..."); var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources/archivehashes.csv"); using (var fr = new FileStream(path, FileMode.Open, FileAccess.Read)) using (var sr = new StreamReader(fr)) using (var csv = new CsvReader(sr, CultureInfo.InvariantCulture)) { var records = csv.GetRecords <HashObject>(); foreach (var record in records) { //var hash = Path.GetFileName(record.String); ulong hash = ulong.Parse(record.Hash); if (!_maincontroller.Hashdict.ContainsKey(hash)) { _maincontroller.Hashdict.Add(hash, record.String); } } } #region commands var rootCommand = new RootCommand(); //archiveTask(string path, bool extract, bool dump) var archive = new Command("archive") { new Option <string>(new [] { "--path", "-p" }), new Option <string>(new [] { "--outpath", "-o" }), new Option <bool>(new [] { "--extract", "-e" }), new Option <bool>(new [] { "--dump", "-d" }), }; rootCommand.Add(archive); //DumpTask(string path, bool all, bool strings, bool imports, bool buffers, bool chunks) var dump = new Command("dump") { new Option <string>(new [] { "--path", "-p" }), //new Option<bool>(new []{ "--all", "-a"}), //new Option<bool>(new []{ "--strings", "-s"}), new Option <bool>(new [] { "--imports", "-i" }), //new Option<bool>(new []{ "--buffers", "-b"}), //new Option<bool>(new []{ "--chunks", "-c"}), }; rootCommand.Add(dump); //Cr2wTask(string path, bool all, bool strings, bool imports, bool buffers, bool chunks) var cr2w = new Command("cr2w") { new Option <string>(new [] { "--path", "-p" }), new Option <bool>(new [] { "--all", "-a" }), new Option <bool>(new [] { "--strings", "-s" }), new Option <bool>(new [] { "--imports", "-i" }), new Option <bool>(new [] { "--buffers", "-b" }), new Option <bool>(new [] { "--chunks", "-c" }), }; rootCommand.Add(cr2w); dump.Handler = CommandHandler.Create <string, bool /*, bool, bool, bool, bool*/>(ConsoleFunctions.DumpTask); archive.Handler = CommandHandler.Create <string, string, bool, bool>(ConsoleFunctions.ArchiveTask); cr2w.Handler = CommandHandler.Create <string, bool, bool, bool, bool, bool>(ConsoleFunctions.Cr2wTask); #endregion // Run if (args == null || args.Length == 0) { // write welcome message rootCommand.InvokeAsync("-h").Wait(); while (true) { string line = System.Console.ReadLine(); var parsed = CommandLineExtensions.ParseText(line, ' ', '"'); rootCommand.InvokeAsync(parsed.ToArray()).Wait(); } } else { rootCommand.InvokeAsync(args).Wait(); } }
public static async Task Main(string[] args) { ServiceLocator.Default.RegisterType <ILoggerService, LoggerService>(); ServiceLocator.Default.RegisterType <IMainController, MainController>(); // get csv data Console.WriteLine("Loading Hashes..."); Loadhashes(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources/archivehashes.csv")); Console.WriteLine("Loaded Hashes."); #region commands var rootCommand = new RootCommand(); var archive = new Command("archive", "Target an archive to extract files or dump information.") { new Option <string>(new [] { "--path", "-p" }, "Input path to .archive."), new Option <string>(new [] { "--outpath", "-o" }, "Output directory to extract files to."), new Option <bool>(new [] { "--extract", "-e" }, "Extract files from archive."), new Option <bool>(new [] { "--dump", "-d" }, "Dump archive information."), new Option <bool>(new [] { "--list", "-l" }, "List contents of archive."), new Option <bool>(new [] { "--uncook", "-u" }, "Uncooks textures from archive."), new Option <EUncookExtension>(new [] { "--uext" }, "Uncook extension (tga, bmp, jpg, png, dds). Default is tga."), new Option <ulong>(new [] { "--hash" }, "Extract single file with given hash."), }; rootCommand.Add(archive); archive.Handler = CommandHandler.Create <string, string, bool, bool, bool, bool, EUncookExtension, ulong>(ConsoleFunctions.ArchiveTask); var dump = new Command("dump", "Target an archive or a directory to dump archive information.") { new Option <string>(new [] { "--path", "-p" }, "Input path to .archive or to a directory (runs over all archives in directory)."), new Option <bool>(new [] { "--imports", "-i" }, "Dump all imports (all filenames that are referenced by all files in the archive)."), new Option <bool>(new [] { "--missinghashes", "-m" }, "List all missing hashes of all input archives."), new Option <bool>(new [] { "--info" }, "Dump all xbm info."), }; rootCommand.Add(dump); dump.Handler = CommandHandler.Create <string, bool, bool, bool>(ConsoleFunctions.DumpTask); var cr2w = new Command("cr2w", "Target a specific cr2w (extracted) file and dumps file information.") { new Option <string>(new [] { "--path", "-p" }, "Input path to a cr2w file."), new Option <bool>(new [] { "--all", "-a" }, "Dump all information."), new Option <bool>(new [] { "--chunks", "-c" }, "Dump all class information of file."), }; rootCommand.Add(cr2w); cr2w.Handler = CommandHandler.Create <string, bool, bool>(ConsoleFunctions.Cr2wTask); var hashTask = new Command("hash", "Some helper functions related to hashes.") { new Option <string>(new [] { "--input", "-i" }, "Create FNV1A hash of given string"), new Option <bool>(new [] { "--missing", "-m" }, ""), }; rootCommand.Add(hashTask); hashTask.Handler = CommandHandler.Create <string, bool>(ConsoleFunctions.HashTask); var oodleTask = new Command("oodle", "Some helper functions related to oodle compression.") { new Option <string>(new [] { "--path", "-p" }, ""), new Option <bool>(new [] { "--decompress", "-d" }, ""), }; rootCommand.Add(oodleTask); oodleTask.Handler = CommandHandler.Create <string, bool>(ConsoleFunctions.OodleTask); #endregion var logger = ServiceLocator.Default.ResolveType <ILoggerService>(); // Run if (args == null || args.Length == 0) { // write welcome message rootCommand.InvokeAsync("-h").Wait(); while (true) { string line = System.Console.ReadLine(); var parsed = CommandLineExtensions.ParseText(line, ' ', '"'); rootCommand.InvokeAsync(parsed.ToArray()).Wait(); await WriteLog(); } } else { rootCommand.InvokeAsync(args).Wait(); await WriteLog(); } async Task WriteLog() { if (string.IsNullOrEmpty(logger.ErrorLogStr)) { return; } var t = DateTime.Now.ToString("yyyyMMddHHmmss"); var fi = new FileInfo(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), $"errorlogs/log_{t}.txt")); if (fi.Directory != null) { Directory.CreateDirectory(fi.Directory.FullName); var log = logger.ErrorLogStr; await File.WriteAllTextAsync(fi.FullName, log); } else { } } }
public static async Task Main(string[] args) { ServiceLocator.Default.RegisterType <ILoggerService, LoggerService>(); ServiceLocator.Default.RegisterType <IHashService, HashService>(); ServiceLocator.Default.RegisterType <IAppSettingsService, AppSettingsService>(); var logger = ServiceLocator.Default.ResolveType <ILoggerService>(); var hashService = ServiceLocator.Default.ResolveType <IHashService>(); logger.OnStringLogged += delegate(object?sender, LogStringEventArgs args) { switch (args.Logtype) { case Logtype.Error: Console.ForegroundColor = ConsoleColor.Red; break; case Logtype.Important: Console.ForegroundColor = ConsoleColor.Yellow; break; case Logtype.Success: Console.ForegroundColor = ConsoleColor.Green; break; case Logtype.Normal: case Logtype.Wcc: break; default: throw new ArgumentOutOfRangeException(); } Console.WriteLine("[" + args.Logtype + "]" + args.Message); Console.ResetColor(); }; var rootCommand = new RootCommand { new PackCommand(), new ArchiveCommand(), new DumpCommand(), new CR2WCommand(), new HashCommand(), new OodleCommand() }; //await ConsoleFunctions.UpdateHashesAsync(); /*await*/ hashService.ReloadLocally(); // Run if (args == null || args.Length == 0) { // write welcome message rootCommand.InvokeAsync("-h").Wait(); while (true) { string line = System.Console.ReadLine(); if (line == "q()") { return; } var pb = new ConsoleProgressBar() { DisplayBars = false, DisplayPercentComplete = false, DisplayAnimation = false }; var parsed = CommandLineExtensions.ParseText(line, ' ', '"'); logger.PropertyChanged += OnLoggerOnPropertyChanged; void OnLoggerOnPropertyChanged(object?sender, PropertyChangedEventArgs args) { switch (args.PropertyName) { case "Progress": { if (logger.Progress.Item1 == 0) { pb = new ConsoleProgressBar() { DisplayBars = true, DisplayAnimation = false }; } pb?.Report(logger.Progress.Item1); if (logger.Progress.Item1 == 1) { System.Threading.Thread.Sleep(1000); Console.WriteLine(); pb?.Dispose(); pb = null; } break; } default: break; } } rootCommand.InvokeAsync(parsed.ToArray()).Wait(); await WriteLog(); logger.PropertyChanged -= OnLoggerOnPropertyChanged; } } else { rootCommand.InvokeAsync(args).Wait(); await WriteLog(); } async Task WriteLog() { if (string.IsNullOrEmpty(logger.ErrorLogStr)) { return; } var t = DateTime.Now.ToString("yyyyMMddHHmmss"); var fi = new FileInfo(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), $"errorlogs/log_{t}.txt")); if (fi.Directory != null) { Directory.CreateDirectory(fi.Directory.FullName); var log = logger.ErrorLogStr; await File.WriteAllTextAsync(fi.FullName, log); } else { } } }
public static async Task Main(string[] args) { ServiceLocator.Default.RegisterType <ILoggerService, LoggerService>(); ServiceLocator.Default.RegisterType <IHashService, HashService>(); ServiceLocator.Default.RegisterType <IWolvenkitFileService, Cp77FileService>(); var logger = ServiceLocator.Default.ResolveType <ILoggerService>(); logger.OnStringLogged += delegate(object sender, LogStringEventArgs args) { switch (args.Logtype) { case Logtype.Error: Console.ForegroundColor = ConsoleColor.Red; break; case Logtype.Important: Console.ForegroundColor = ConsoleColor.Yellow; break; case Logtype.Success: Console.ForegroundColor = ConsoleColor.Green; break; case Logtype.Normal: case Logtype.Wcc: break; default: throw new ArgumentOutOfRangeException(); } Console.WriteLine("[" + args.Logtype + "]" + args.Message); Console.ResetColor(); }; var rootCommand = new RootCommand { new UnbundleCommand(), new UncookCommand(), new RebuildCommand(), new PackCommand(), new ExportCommand(), new DumpCommand(), new VerifyCommand(), new CR2WCommand(), new HashCommand(), new OodleCommand(), }; //await ConsoleFunctions.UpdateHashesAsync(); _ = ServiceLocator.Default.ResolveType <IHashService>(); // try get oodle dll from game if ((RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) && !TryCopyOodleLib()) { logger.LogString("Could not automatically find oo2ext_7_win64.dll. " + "Please manually copy and paste the DLL found in <gamedir>\\Cyberpunk 2077\\bin\\x64\\oo2ext_7_win64.dll into this folder: " + $"{AppDomain.CurrentDomain.BaseDirectory}."); } // Run if (args == null || args.Length == 0) { // write welcome message rootCommand.InvokeAsync("-h").Wait(); while (true) { string line = System.Console.ReadLine(); if (line == "q()") { return; } var pb = new ConsoleProgressBar() { DisplayBars = false, DisplayPercentComplete = false, DisplayAnimation = false }; var parsed = CommandLineExtensions.ParseText(line, ' ', '"'); logger.PropertyChanged += OnLoggerOnPropertyChanged; void OnLoggerOnPropertyChanged(object sender, PropertyChangedEventArgs args) { switch (args.PropertyName) { case "Progress": { if (logger.Progress.Item1 == 0) { pb = new ConsoleProgressBar() { DisplayBars = true, DisplayAnimation = false }; } pb?.Report(logger.Progress.Item1); if (logger.Progress.Item1 == 1) { System.Threading.Thread.Sleep(1000); Console.WriteLine(); pb?.Dispose(); pb = null; } break; } default: break; } } rootCommand.InvokeAsync(parsed.ToArray()).Wait(); await WriteLog(); logger.PropertyChanged -= OnLoggerOnPropertyChanged; } } else { rootCommand.InvokeAsync(args).Wait(); await WriteLog(); } async Task WriteLog() { if (string.IsNullOrEmpty(logger.ErrorLogStr)) { return; } var t = DateTime.Now.ToString("yyyyMMddHHmmss"); var baseDirectory = AppContext.BaseDirectory; if (string.IsNullOrEmpty(baseDirectory)) { return; } var fi = new FileInfo(Path.Combine(baseDirectory, $"errorlogs/log_{t}.txt")); if (fi.Directory != null) { Directory.CreateDirectory(fi.Directory.FullName); var log = logger.ErrorLogStr; await File.WriteAllTextAsync(fi.FullName, log); } else { } } }
public static async Task Main(string[] args) { ServiceLocator.Default.RegisterType <ILoggerService, LoggerService>(); ServiceLocator.Default.RegisterType <IMainController, MainController>(); // get csv data Console.WriteLine("Loading Hashes..."); Loadhashes(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources/archivehashes.csv")); Console.WriteLine("Loaded Hashes 1..."); //Loadhashes(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources/archivehashes2.csv")); //Console.WriteLine("Loaded Hashes 2..."); #region commands var rootCommand = new RootCommand(); //archiveTask(string path, bool extract, bool dump) var archive = new Command("archive", "Target an archive to extract files or dump information.") { new Option <string>(new [] { "--path", "-p" }, "Input path to .archive."), new Option <string>(new [] { "--outpath", "-o" }, "Output directory to extract files to."), new Option <bool>(new [] { "--extract", "-e" }, "Extract files from archive."), new Option <bool>(new [] { "--dump", "-d" }, "Dump archive information."), new Option <bool>(new [] { "--list", "-l" }, "List contents of archive."), new Option <bool>(new [] { "--uncook", "-u" }, "Uncooks textures from archive."), new Option <EUncookExtension>(new [] { "--uext" }, "Uncook extension (tga, bmp, jpg, png, dds). Default is tga."), }; rootCommand.Add(archive); archive.Handler = CommandHandler.Create <string, string, bool, bool, bool, bool, EUncookExtension>(ConsoleFunctions.ArchiveTask); //DumpTask(string path, bool all, bool strings, bool imports, bool buffers, bool chunks) var dump = new Command("dump", "Target an archive or a directory to dump archive information.") { new Option <string>(new [] { "--path", "-p" }, "Input path to .archive or to a directory (runs over all archives in directory)."), new Option <bool>(new [] { "--imports", "-i" }, "Dump all imports (all filenames that are referenced by all files in the archive)."), new Option <bool>(new [] { "--missinghashes", "-m" }, "List all missing hashes of all input archives."), }; rootCommand.Add(dump); dump.Handler = CommandHandler.Create <string, bool, bool>(ConsoleFunctions.DumpTask); //Cr2wTask(string path, bool all, bool strings, bool imports, bool buffers, bool chunks) var cr2w = new Command("cr2w", "Target a specific cr2w (extracted) file and dumps file information.") { new Option <string>(new [] { "--path", "-p" }, "Input path to a cr2w file."), new Option <bool>(new [] { "--all", "-a" }, "Dump all information."), new Option <bool>(new [] { "--chunks", "-c" }, "Dump all class information of file."), }; rootCommand.Add(cr2w); cr2w.Handler = CommandHandler.Create <string, bool, bool>(ConsoleFunctions.Cr2wTask); #endregion // Run if (args == null || args.Length == 0) { // write welcome message rootCommand.InvokeAsync("-h").Wait(); while (true) { string line = System.Console.ReadLine(); var parsed = CommandLineExtensions.ParseText(line, ' ', '"'); rootCommand.InvokeAsync(parsed.ToArray()).Wait(); } } else { rootCommand.InvokeAsync(args).Wait(); } }