public ValueTask ExecuteAsync(IConsole console) { var co = console.Output; var opts = new LuminaOptions { CacheFileResources = false }; var ol = new GameData(Path, opts); var nl = new GameData(NewPath, opts); if (!File.Exists(PathsFile)) { console.Error.WriteLine("paths list file provided does not exist!"); } var paths = File.ReadAllLines(PathsFile); Parallel.ForEach(paths, path => { var oldMeta = ol.GetFileMetadata(path); var newMeta = nl.GetFileMetadata(path); if (oldMeta == null || newMeta == null) { return; } if (oldMeta.Value.RawFileSize != newMeta.Value.RawFileSize) { co.WriteLine($"size mismatch: {path}"); return; } var oldFile = ol.GetFile(path); var newFile = nl.GetFile(path); var oHash = oldFile.GetFileHash(); var nHash = newFile.GetFileHash(); if (oHash != nHash) { co.WriteLine($"hash mismatch: {path}"); } }); return(default);
public static void Main(string[] args) { var appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); var umbraData = Path.Combine(appDataPath, "Umbra"); var dataDir = new DirectoryInfo(umbraData); if (!dataDir.Exists) { dataDir.Create(); } var logsDir = dataDir.CreateSubdirectory("logs"); // configure logging first Log.Logger = new LoggerConfiguration() .WriteTo.Async(x => x.Console()) .WriteTo.Async(x => x.File( Path.Combine(logsDir.FullName, "umbra_.log"), rollingInterval: RollingInterval.Day, retainedFileCountLimit: 14 )) .MinimumLevel.Information() .CreateLogger(); Locator.CurrentMutable.UseSerilogFullLogger(); // fix poco yells that rxui spits out, they're annoying and useless Locator.CurrentMutable.RegisterConstant(new RxUI.CustomObservableForProperty(), typeof(ICreatesObservableForProperty)); var configFile = Path.Combine(dataDir.FullName, "config.json"); var settings = new ConfigurationBuilder <IUmbraSettings>() .UseJsonFile(configFile) .Build(); Locator.CurrentMutable.RegisterConstant(settings, typeof(IUmbraSettings)); if (settings.DataPath == null) { // attempt to guess a data path before asking someone to locate it settings.DataPath = GuessClientDataPath(); // if we still haven't found something, make the user do it for us if (settings.DataPath == null) { using (var dialog = new System.Windows.Forms.FolderBrowserDialog()) { var result = dialog.ShowDialog(); } } } Log.Information("using game datapath: {DataPath}", settings.DataPath); // init lumina var luminaOptions = new LuminaOptions { CacheFileResources = true, DefaultExcelLanguage = settings.ExcelLanguage }; var lumina = new Lumina.Lumina( args.Length > 0 ? args[0] : settings.DataPath, luminaOptions ); foreach (var ver in settings.PreviousVersions) { Log.Information("previous version: {@PrevVersion}", ver); } Locator.CurrentMutable.RegisterConstant(luminaOptions); Locator.CurrentMutable.RegisterConstant(lumina); Locator.CurrentMutable.RegisterViewsForViewModels(Assembly.GetCallingAssembly()); // bootstrap app var app = new App(); app.InitializeComponent(); app.Run(); }