public async Task BethesdaNetDownload() { var downloader = DownloadDispatcher.GetInstance <BethesdaNetDownloader>(); Assert.IsTrue(await downloader.IsLoggedIn.FirstAsync()); var ini = $@"[General] directURL=https://bethesda.net/en/mods/skyrim/mod-detail/4145641"; var filename = Guid.NewGuid().ToString(); var state = (AbstractDownloadState)await DownloadDispatcher.ResolveArchive(ini.LoadIniString()); Assert.IsNotNull(state); var converted = state.ViaJSON(); Assert.IsTrue(await converted.Verify(new Archive { Name = "mod.ckm" })); Assert.IsTrue(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List <string>() })); await converted.Download(new Archive { Name = "mod.zip" }, filename); await using var fs = File.OpenRead(filename); using var archive = new ZipArchive(fs); var entries = archive.Entries.Select(e => e.FullName).ToList(); CollectionAssert.AreEqual(entries, new List <string> { @"Data\TestCK.esp", @"Data\TestCK.ini" }); }
private void DownloadAndInstall(Game game, int modid, string mod_name) { utils.AddMod(mod_name); var client = new NexusApiClient(); var file = client.GetModFiles(game, modid).First(f => f.is_primary); var src = Path.Combine(DOWNLOAD_FOLDER, file.file_name); var ini = string.Join("\n", new List <string> { "[General]", $"gameName={GameRegistry.Games[game].MO2ArchiveName}", $"modID={modid}", $"fileID={file.file_id}" }); if (!File.Exists(file.file_name)) { var state = DownloadDispatcher.ResolveArchive(ini.LoadIniString()); state.Download(src); } if (!Directory.Exists(utils.DownloadsFolder)) { Directory.CreateDirectory(utils.DownloadsFolder); } var dest = Path.Combine(utils.DownloadsFolder, file.file_name); File.Copy(src, dest); FileExtractor.ExtractAll(src, Path.Combine(utils.ModsFolder, mod_name)); File.WriteAllText(dest + ".meta", ini); }
public void NexusDownload() { var ini = @"[General] gameName=SkyrimSE modID = 12604 fileID=35407"; var state = (AbstractDownloadState)DownloadDispatcher.ResolveArchive(ini.LoadIniString()); Assert.IsNotNull(state); var converted = state.ViaJSON(); Assert.IsTrue(converted.Verify()); // Exercise the cache code Assert.IsTrue(converted.Verify()); var filename = Guid.NewGuid().ToString(); Assert.IsTrue(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List <string> () })); converted.Download(new Archive { Name = "SkyUI.7z" }, filename); Assert.AreEqual(filename.FileHash(), "dF2yafV2Oks="); }
public async Task TESAllianceDownload() { await DownloadDispatcher.GetInstance <TESAllianceDownloader>().Prepare(); const string ini = "[General]\n" + "directURL=http://tesalliance.org/forums/index.php?/files/file/2035-wabbajack-test-file/"; var state = (AbstractDownloadState)await DownloadDispatcher.ResolveArchive(ini.LoadIniString()); Assert.IsNotNull(state); var converted = await state.RoundTripState(); Assert.IsTrue(await converted.Verify(new Archive { Size = 20 })); var filename = Guid.NewGuid().ToString(); Assert.IsTrue(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List <string>() })); await converted.Download(new Archive { Name = "TESAlliance Test.zip" }, filename); Assert.AreEqual("eSIyd+KOG3s=", filename.FileHash()); Assert.AreEqual(File.ReadAllText(filename), "Cheese for Everyone!"); }
public async Task ModDbTests() { var ini = @"[General] directURL=https://www.moddb.com/downloads/start/124908?referer=https%3A%2F%2Fwww.moddb.com%2Fmods%2Fautopause"; var state = (AbstractDownloadState)await DownloadDispatcher.ResolveArchive(ini.LoadIniString()); Assert.IsNotNull(state); var url_state = DownloadDispatcher.ResolveArchive( "https://www.moddb.com/downloads/start/124908?referer=https%3A%2F%2Fwww.moddb.com%2Fmods%2Fautopause"); Assert.AreEqual("https://www.moddb.com/downloads/start/124908?referer=https%3A%2F%2Fwww.moddb.com%2Fmods%2Fautopause", ((ModDBDownloader.State)url_state).Url); var converted = await state.RoundTripState(); Assert.IsTrue(await converted.Verify(new Archive { Size = 20 })); var filename = Guid.NewGuid().ToString(); Assert.IsTrue(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List <string>() })); await converted.Download(new Archive { Name = "moddbtest.7z" }, filename); Assert.AreEqual("2lZt+1h6wxM=", filename.FileHash()); }
public async Task HttpDownload() { var ini = @"[General] directURL=http://build.wabbajack.org/WABBAJACK_TEST_FILE.txt"; var state = (AbstractDownloadState)await DownloadDispatcher.ResolveArchive(ini.LoadIniString()); Assert.IsNotNull(state); var url_state = DownloadDispatcher.ResolveArchive("http://build.wabbajack.org/WABBAJACK_TEST_FILE.txt"); Assert.AreEqual("http://build.wabbajack.org/WABBAJACK_TEST_FILE.txt", ((HTTPDownloader.State)url_state).Url); var converted = state.ViaJSON(); Assert.IsTrue(await converted.Verify()); var filename = Guid.NewGuid().ToString(); Assert.IsTrue(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List <string> { "http://build.wabbajack.org/" } })); Assert.IsFalse(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List <string>() })); await converted.Download(new Archive { Name = "MEGA Test.txt" }, filename); Assert.AreEqual("eSIyd+KOG3s=", Utils.FileHash(filename)); Assert.AreEqual(File.ReadAllText(filename), "Cheese for Everyone!"); }
public async Task MediaFireDownload() { var ini = @"[General] directURL=http://www.mediafire.com/file/agiqzm1xwebczpx/WABBAJACK_TEST_FILE.txt"; var state = (AbstractDownloadState)await DownloadDispatcher.ResolveArchive(ini.LoadIniString()); Assert.IsNotNull(state); var url_state = DownloadDispatcher.ResolveArchive( "http://www.mediafire.com/file/agiqzm1xwebczpx/WABBAJACK_TEST_FILE.txt"); Assert.AreEqual("http://www.mediafire.com/file/agiqzm1xwebczpx/WABBAJACK_TEST_FILE.txt", ((MediaFireDownloader.State)url_state).Url); var converted = state.ViaJSON(); Assert.IsTrue(await converted.Verify()); var filename = Guid.NewGuid().ToString(); Assert.IsTrue(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List <string> { "http://www.mediafire.com/file/agiqzm1xwebczpx/" } })); Assert.IsFalse(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List <string>() })); await converted.Download(new Archive { Name = "Media Fire Test.txt" }, filename); Assert.AreEqual(File.ReadAllText(filename), "Cheese for Everyone!"); }
public async Task GoogleDriveTests() { var ini = @"[General] directURL=https://drive.google.com/file/d/1grLRTrpHxlg7VPxATTFNfq2OkU_Plvh_/view?usp=sharing"; var state = (AbstractDownloadState)await DownloadDispatcher.ResolveArchive(ini.LoadIniString()); Assert.IsNotNull(state); var url_state = DownloadDispatcher.ResolveArchive( "https://drive.google.com/file/d/1grLRTrpHxlg7VPxATTFNfq2OkU_Plvh_/view?usp=sharing"); Assert.AreEqual("1grLRTrpHxlg7VPxATTFNfq2OkU_Plvh_", ((GoogleDriveDownloader.State)url_state).Id); var converted = state.ViaJSON(); Assert.IsTrue(await converted.Verify()); var filename = Guid.NewGuid().ToString(); Assert.IsTrue(converted.IsWhitelisted(new ServerWhitelist { GoogleIDs = new List <string> { "1grLRTrpHxlg7VPxATTFNfq2OkU_Plvh_" } })); Assert.IsFalse(converted.IsWhitelisted(new ServerWhitelist { GoogleIDs = new List <string>() })); await converted.Download(new Archive { Name = "MEGA Test.txt" }, filename); Assert.AreEqual("eSIyd+KOG3s=", Utils.FileHash(filename)); Assert.AreEqual(File.ReadAllText(filename), "Cheese for Everyone!"); }
public async Task GameFileSourceDownload() { // Test mode off for this test Consts.TestMode = false; await DownloadDispatcher.GetInstance <LoversLabDownloader>().Prepare(); var ini = $@"[General] gameName={Game.SkyrimSpecialEdition.MetaData().MO2ArchiveName} gameFile=Data/Update.esm"; var state = (AbstractDownloadState)await DownloadDispatcher.ResolveArchive(ini.LoadIniString()); Assert.IsNotNull(state); var converted = await state.RoundTripState(); Assert.IsTrue(await converted.Verify(new Archive { Size = 20 })); var filename = Guid.NewGuid().ToString(); Assert.IsTrue(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List <string>() })); await converted.Download(new Archive { Name = "Update.esm" }, filename); Assert.AreEqual("/DLG/LjdGXI=", Utils.FileHash(filename)); CollectionAssert.AreEqual(File.ReadAllBytes(Path.Combine(Game.SkyrimSpecialEdition.MetaData().GameLocation(), "Data/Update.esm")), File.ReadAllBytes(filename)); Consts.TestMode = true; }
private async Task <bool> Download() { ProgressPercent = Percent.Zero; using (var queue = new WorkQueue(1)) using (queue.Status.Select(i => i.ProgressPercent) .Subscribe(percent => ProgressPercent = percent)) { var tcs = new TaskCompletionSource <bool>(); queue.QueueTask(async() => { try { var downloader = DownloadDispatcher.ResolveArchive(Metadata.Links.Download); var result = await downloader.Download(new Archive(state: null !) { Name = Metadata.Title, Size = Metadata.DownloadMetadata?.Size ?? 0 }, Location); // Want to rehash to current file, even if failed? Location.FileHashCached(); tcs.SetResult(result); } catch (Exception ex) { tcs.SetException(ex); } });
public static async Task UploadPackagedInis(IEnumerable <IndexedArchive> archives) { archives = archives.ToArray(); // defensive copy Utils.Log($"Packaging {archives.Count()} inis"); try { await using var ms = new MemoryStream(); using (var z = new ZipArchive(ms, ZipArchiveMode.Create, true)) { foreach (var archive in archives) { var state = (AbstractDownloadState)(await DownloadDispatcher.ResolveArchive(archive.IniData)); var entry = z.CreateEntry(Path.GetFileName(archive.Name)); await using var os = entry.Open(); await os.WriteAsync(Encoding.UTF8.GetBytes(string.Join("\n", state.GetMetaIni()))); } } var webClient = new WebClient(); await webClient.UploadDataTaskAsync($"https://{Consts.WabbajackCacheHostname}/indexed_files/notify", "POST", ms.ToArray()); } catch (Exception ex) { Utils.Log(ex.ToString()); } }
public async Task ManualDownload() { var ini = @"[General] manualURL=http://build.wabbajack.org/WABBAJACK_TEST_FILE.zip"; var state = (AbstractDownloadState)await DownloadDispatcher.ResolveArchive(ini.LoadIniString()); Assert.IsNotNull(state); var converted = await state.RoundTripState(); Assert.IsTrue(await converted.Verify(new Archive { Size = 20 })); var filename = Guid.NewGuid().ToString(); Assert.IsTrue(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List <string> { "http://build.wabbajack.org/" } })); // Doesn't work well on the test server, so we're disabling for now //await converted.Download(new Archive { Name = "WABBAJACK_TEST_FILE.zip", Size = 20, Hash = "eSIyd+KOG3s="}, filename); //Assert.AreEqual("eSIyd+KOG3s=", Utils.FileHash(filename)); //Assert.AreEqual(File.ReadAllText(filename), "Cheese for Everyone!"); }
private async Task <bool> Download() { ProgressPercent = 0d; using (var queue = new WorkQueue(1)) using (queue.Status.Select(i => i.ProgressPercent) .Subscribe(percent => ProgressPercent = percent)) { var tcs = new TaskCompletionSource <bool>(); queue.QueueTask(async() => { try { var downloader = DownloadDispatcher.ResolveArchive(Metadata.Links.Download); var result = await downloader.Download(new Archive { Name = Metadata.Title, Size = Metadata.DownloadMetadata?.Size ?? 0 }, Location); // Want to rehash to current file, even if failed? Location.FileHashCached(); tcs.SetResult(result); } catch (Exception ex) { tcs.SetException(ex); } }); Task.Run(() => Metrics.Send(Metrics.Downloading, Metadata.Title)) .FireAndForget(ex => Utils.Error(ex, "Error sending download metric")); return(await tcs.Task); } }
private void DownloadAndInstall(string url, string filename, string mod_name = null) { var src = Path.Combine(DOWNLOAD_FOLDER, filename); if (!File.Exists(src)) { var state = DownloadDispatcher.ResolveArchive(url); state.Download(new Archive() { Name = "Unknown" }, src); } if (!Directory.Exists(utils.DownloadsFolder)) { Directory.CreateDirectory(utils.DownloadsFolder); } File.Copy(src, Path.Combine(utils.DownloadsFolder, filename)); if (mod_name == null) { FileExtractor.ExtractAll(src, utils.MO2Folder); } else { FileExtractor.ExtractAll(src, Path.Combine(utils.ModsFolder, mod_name)); } }
public async Task LoversLabDownload() { await DownloadDispatcher.GetInstance <LoversLabDownloader>().Prepare(); var ini = @"[General] directURL=https://www.loverslab.com/files/file/11116-test-file-for-wabbajack-integration/?do=download&r=737123&confirm=1&t=1"; var state = (AbstractDownloadState)await DownloadDispatcher.ResolveArchive(ini.LoadIniString()); Assert.IsNotNull(state); /*var url_state = DownloadDispatcher.ResolveArchive("https://www.loverslab.com/files/file/11116-test-file-for-wabbajack-integration/?do=download&r=737123&confirm=1&t=1"); * Assert.AreEqual("http://build.wabbajack.org/WABBAJACK_TEST_FILE.txt", * ((HTTPDownloader.State)url_state).Url); */ var converted = await state.RoundTripState(); Assert.IsTrue(await converted.Verify(new Archive { Size = 20 })); var filename = Guid.NewGuid().ToString(); Assert.IsTrue(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List <string>() })); await converted.Download(new Archive { Name = "MEGA Test.txt" }, filename); Assert.AreEqual("eSIyd+KOG3s=", Utils.FileHash(filename)); Assert.AreEqual(File.ReadAllText(filename), "Cheese for Everyone!"); }
private async Task DownloadAndInstall(string url, string filename, string modName = null) { var src = _downloadFolder.Combine(filename); if (!src.Exists) { var state = DownloadDispatcher.ResolveArchive(url); await state.Download(new Archive(state : null !) { Name = "Unknown" }, src);
public static async Task <T> RoundTripState <T>(this T state) where T : AbstractDownloadState { var ini = string.Join("\r\n", state.GetMetaIni()).LoadIniString(); var round = (AbstractDownloadState)await DownloadDispatcher.ResolveArchive(ini); Assert.IsInstanceOfType(round, state.GetType()); Assert.AreEqual(state.PrimaryKeyString, round.PrimaryKeyString); CollectionAssert.AreEqual(state.GetMetaIni(), round.GetMetaIni()); return((T)round); }
public async Task DownloadRenamingTests() { // Test mode off for this test Consts.TestMode = false; var inia = $@"[General] gameName={Game.SkyrimSpecialEdition.MetaData().MO2ArchiveName} gameFile=Data/Update.esm"; var statea = (GameFileSourceDownloader.State) await DownloadDispatcher.ResolveArchive(inia.LoadIniString()); var inib = $@"[General] gameName={Game.SkyrimSpecialEdition.MetaData().MO2ArchiveName} gameFile=Data/Skyrim.esm"; var stateb = (GameFileSourceDownloader.State) await DownloadDispatcher.ResolveArchive(inib.LoadIniString()); var archivesa = new List <Archive>() { new Archive { Hash = statea.Hash, Name = "Download.esm", State = statea } }; var archivesb = new List <Archive>() { new Archive { Hash = stateb.Hash, Name = "Download.esm", State = stateb } }; if (Directory.Exists("DownloadTests")) { Utils.DeleteDirectory("DownloadTests"); } Directory.CreateDirectory("DownloadTests"); var inst = new TestInstaller(null, null, null, "DownloadTests", null); await inst.DownloadMissingArchives(archivesa, true); await inst.DownloadMissingArchives(archivesb, true); CollectionAssert.AreEqual(Directory.EnumerateFiles("DownloadTests").Select(Path.GetFileName).OrderBy(a => a).ToArray(), new string[] { @"Download.esm", @"Download.esm.xxHash", @"Download_f80ee6d109516018308f62e2c862b7f061987ac4a8c2327a101ac6b8f80ec4ae_.esm", @"Download_f80ee6d109516018308f62e2c862b7f061987ac4a8c2327a101ac6b8f80ec4ae_.esm.xxHash" }.OrderBy(a => a).ToArray()); Consts.TestMode = true; }
public async Task VerifyLogoURLs() { var modlists = await ModlistMetadata.LoadFromGithub(); foreach (var modlist in modlists.Select(m => m.Links)) { var logo_state = DownloadDispatcher.ResolveArchive(modlist.ImageUri); Assert.IsNotNull(logo_state); Assert.IsTrue(await logo_state.Verify(), $"{modlist.ImageUri} is not valid"); } }
public async Task <IActionResult> Notify() { Utils.Log("Starting ingestion of uploaded INIs"); var body = await Request.Body.ReadAllAsync(); await using var ms = new MemoryStream(body); using var za = new ZipArchive(ms, ZipArchiveMode.Read); int enqueued = 0; foreach (var entry in za.Entries) { await using var ins = entry.Open(); var iniString = Encoding.UTF8.GetString(await ins.ReadAllAsync()); var data = (AbstractDownloadState)(await DownloadDispatcher.ResolveArchive(iniString.LoadIniString())); if (data == null) { Utils.Log("No valid INI parser for: \n" + iniString); continue; } if (data is ManualDownloader.State) { continue; } var key = data.PrimaryKeyString; var found = await Db.DownloadStates.AsQueryable().Where(f => f.Key == key).Take(1).ToListAsync(); if (found.Count > 0) { continue; } await Db.Jobs.InsertOneAsync(new Job { Priority = Job.JobPriority.Low, Payload = new IndexJob() { Archive = new Archive { Name = entry.Name, State = data } } }); enqueued += 1; } Utils.Log($"Enqueued {enqueued} out of {za.Entries.Count} entries from uploaded ini package"); return(Ok(enqueued.ToString())); }
private async Task <(AbsolutePath Download, AbsolutePath ModFolder)> DownloadAndInstall(string url, string filename, string modName = null) { if (modName != null) { await utils.AddMod(modName); } var src = _downloadFolder.Combine(filename); if (!src.Exists) { var state = DownloadDispatcher.ResolveArchive(url); await state.Download(new Archive(state : null !) { Name = "Unknown" }, src);
private static async Task EnqueueFromList(DBContext db, ModlistMetadata list, WorkQueue queue) { var existing = await db.ModListStatus.FindOneAsync(l => l.Id == list.Links.MachineURL); var modlist_path = Path.Combine(Consts.ModListDownloadFolder, list.Links.MachineURL + Consts.ModListExtension); if (list.NeedsDownload(modlist_path)) { if (File.Exists(modlist_path)) { File.Delete(modlist_path); } var state = DownloadDispatcher.ResolveArchive(list.Links.Download); Utils.Log($"Downloading {list.Links.MachineURL} - {list.Title}"); await state.Download(modlist_path); } else { Utils.Log($"No changes detected from downloaded ModList"); } Utils.Log($"Loading {modlist_path}"); var installer = AInstaller.LoadFromFile(modlist_path); var archives = installer.Archives; Utils.Log($"Found {archives.Count} archives in {installer.Name} to index"); var searching = archives.Select(a => a.Hash).Distinct().ToArray(); Utils.Log($"Looking for missing archives"); var knownArchives = (await db.IndexedFiles.AsQueryable().Where(a => searching.Contains(a.Hash)) .Select(d => d.Hash).ToListAsync()).ToDictionary(a => a); Utils.Log($"Found {knownArchives.Count} pre-existing archives"); var missing = archives.Where(a => !knownArchives.ContainsKey(a.Hash)).ToList(); Utils.Log($"Found {missing.Count} missing archives, enqueing indexing jobs"); var jobs = missing.Select(a => new Job { Payload = new IndexJob { Archive = a }, Priority = Job.JobPriority.Low }); Utils.Log($"Writing jobs to the database"); await db.Jobs.InsertManyAsync(jobs, new InsertManyOptions { IsOrdered = false }); Utils.Log($"Done adding archives for {installer.Name}"); }
protected override async Task <ExitCode> Run() { var meta = (AbstractDownloadState)await DownloadDispatcher.ResolveArchive(((AbsolutePath)Input).LoadIniFile()); if (meta == null) { Console.WriteLine("Cannot resolve meta!"); return(ExitCode.Error); } Console.WriteLine($"PrimaryKeyString : {meta.PrimaryKeyString}"); return(ExitCode.Ok); }
public async Task <IActionResult> Notify() { Utils.Log("Starting ingestion of uploaded INIs"); var body = await Request.Body.ReadAllAsync(); await using var ms = new MemoryStream(body); using var za = new ZipArchive(ms, ZipArchiveMode.Read); int enqueued = 0; foreach (var entry in za.Entries) { await using var ins = entry.Open(); var iniString = Encoding.UTF8.GetString(await ins.ReadAllAsync()); Utils.Log(iniString); var data = (AbstractDownloadState)(await DownloadDispatcher.ResolveArchive(iniString.LoadIniString(), true)); if (data == null) { Utils.Log("No valid INI parser for: \n" + iniString); continue; } if (data is ManualDownloader.State) { continue; } if (await SQL.HaveIndexedArchivePrimaryKey(data.PrimaryKeyString)) { continue; } await SQL.EnqueueJob(new Job { Priority = Job.JobPriority.Low, Payload = new IndexJob { Archive = new Archive(data) { Name = entry.Name, } } }); enqueued += 1; } Utils.Log($"Enqueued {enqueued} out of {za.Entries.Count} entries from uploaded ini package"); return(Ok(enqueued.ToString())); }
private static async Task EnqueueFromList(SqlService sql, ModlistMetadata list, WorkQueue queue) { var modlistPath = Consts.ModListDownloadFolder.Combine(list.Links.MachineURL + Consts.ModListExtension); if (list.NeedsDownload(modlistPath)) { modlistPath.Delete(); var state = DownloadDispatcher.ResolveArchive(list.Links.Download); Utils.Log($"Downloading {list.Links.MachineURL} - {list.Title}"); await state.Download(modlistPath); } else { Utils.Log($"No changes detected from downloaded ModList"); } Utils.Log($"Loading {modlistPath}"); var installer = AInstaller.LoadFromFile(modlistPath); var archives = installer.Archives; Utils.Log($"Found {archives.Count} archives in {installer.Name} to index"); var searching = archives.Select(a => a.Hash).ToHashSet(); Utils.Log($"Looking for missing archives"); var knownArchives = await sql.FilterByExistingIndexedArchives(searching); Utils.Log($"Found {knownArchives.Count} pre-existing archives"); var missing = archives.Where(a => !knownArchives.Contains(a.Hash)).ToList(); Utils.Log($"Found {missing.Count} missing archives, enqueing indexing jobs"); var jobs = missing.Select(a => new Job { Payload = new IndexJob { Archive = a }, Priority = Job.JobPriority.Low }); Utils.Log($"Writing jobs to the database"); foreach (var job in jobs) { await sql.EnqueueJob(job); } Utils.Log($"Done adding archives for {installer.Name}"); }
protected override async Task <ExitCode> Run() { var state = await DownloadDispatcher.ResolveArchive(((AbsolutePath)Meta).LoadIniFile(), true); if (state == null) { Console.WriteLine("Cannot find downloader for input meta"); return(ExitCode.Error); } var astate = (AbstractDownloadState)state; Console.WriteLine($"Downloading {astate.PrimaryKeyString}"); await astate.Download(new Archive(astate), (AbsolutePath)Output); return(ExitCode.Ok); }
private void Start() { _downloadThread = new Thread(() => { WorkQueue.CustomReportFn = (progress, msg) => { DownloadProgress = progress; }; var state = DownloadDispatcher.ResolveArchive(_url); state.Download(new Archive { Name = _downloadName }, _destination); _destination.FileHash(); _parent.Result = DownloadWindow.WindowResult.Completed; _parent.Dispatcher.Invoke(() => _parent.Close()); }); _downloadThread.Start(); }
public async Task CanQueryViaHash() { var hashes = new HashSet <Hash> { Hash.FromHex("097ad17ef4b9f5b7"), Hash.FromHex("96fb53c3dc6397d2"), Hash.FromHex("97a6d27b7becba19") }; foreach (var hash in hashes) { Utils.Log($"Testing Archive {hash}"); var ini = await ClientAPI.GetModIni(hash); Assert.NotNull(ini); Assert.NotNull(DownloadDispatcher.ResolveArchive(ini.LoadIniString())); } }
private async Task DownloadAndInstall(string url, string filename, string mod_name = null) { var src = Path.Combine(DOWNLOAD_FOLDER, filename); if (!File.Exists(src)) { var state = DownloadDispatcher.ResolveArchive(url); await state.Download(new Archive { Name = "Unknown" }, src); } if (!Directory.Exists(utils.DownloadsFolder)) { Directory.CreateDirectory(utils.DownloadsFolder); } await Utils.CopyFileAsync(src, Path.Combine(utils.DownloadsFolder, filename)); await FileExtractor.ExtractAll(Queue, src, mod_name == null?utils.MO2Folder : Path.Combine(utils.ModsFolder, mod_name)); }
public async Task NexusDownload() { var old_val = NexusApiClient.CacheMethod; try { NexusApiClient.CacheMethod = null; var ini = @"[General] gameName=SkyrimSE modID = 12604 fileID=35407"; var state = (AbstractDownloadState)await DownloadDispatcher.ResolveArchive(ini.LoadIniString()); Assert.IsNotNull(state); var converted = await state.RoundTripState(); Assert.IsTrue(await converted.Verify(new Archive { Size = 20 })); // Exercise the cache code Assert.IsTrue(await converted.Verify(new Archive { Size = 20 })); var filename = Guid.NewGuid().ToString(); Assert.IsTrue(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List <string> () })); await converted.Download(new Archive { Name = "SkyUI.7z" }, filename); Assert.AreEqual(filename.FileHash(), "dF2yafV2Oks="); } finally { NexusApiClient.CacheMethod = old_val; } }