Пример #1
0
        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"
            });
        }
Пример #2
0
        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);
        }
Пример #3
0
        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=");
        }
Пример #4
0
        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!");
        }
Пример #5
0
        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());
        }
Пример #6
0
        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!");
        }
Пример #7
0
        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!");
        }
Пример #8
0
        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!");
        }
Пример #9
0
        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;
        }
Пример #10
0
 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);
                 }
             });
Пример #11
0
        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());
            }
        }
Пример #12
0
        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!");
        }
Пример #13
0
        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);
                }
        }
Пример #14
0
        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));
            }
        }
Пример #15
0
        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!");
        }
Пример #16
0
        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);
Пример #17
0
        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);
        }
Пример #18
0
        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;
        }
Пример #19
0
        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");
            }
        }
Пример #20
0
        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()));
        }
Пример #21
0
        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);
Пример #22
0
        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}");
        }
Пример #23
0
        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);
        }
Пример #24
0
        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()));
        }
Пример #25
0
        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}");
        }
Пример #26
0
        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);
        }
Пример #27
0
        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();
        }
Пример #28
0
        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()));
            }
        }
Пример #29
0
        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));
        }
Пример #30
0
        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;
            }
        }