From 4e946facab1a32a31cf2ca06c73e64890b504f25 Mon Sep 17 00:00:00 2001 From: Timothy Baldridge Date: Sat, 12 Oct 2019 16:31:07 -0600 Subject: [PATCH] add modddb handler --- Wabbajack.Test/DownloaderTests.cs | 21 ++++++ Wabbajack/Downloaders/DownloadDispatcher.cs | 21 +++--- Wabbajack/Downloaders/ModDBDownloader.cs | 72 +++++++++++++++++++++ Wabbajack/Wabbajack.csproj | 1 + 4 files changed, 102 insertions(+), 13 deletions(-) create mode 100644 Wabbajack/Downloaders/ModDBDownloader.cs diff --git a/Wabbajack.Test/DownloaderTests.cs b/Wabbajack.Test/DownloaderTests.cs index c9353c69..0cea5419 100644 --- a/Wabbajack.Test/DownloaderTests.cs +++ b/Wabbajack.Test/DownloaderTests.cs @@ -130,6 +130,27 @@ namespace Wabbajack.Test Assert.AreEqual(filename.FileSHA256(), "U3Xg6RBR9XrUY9/jQSu6WKu5dfhHmpaN2dTl0ylDFmI="); } + + [TestMethod] + public void ModDbTests() + { + var ini = @"[General] + directURL=https://www.moddb.com/downloads/start/124908?referer=https%3A%2F%2Fwww.moddb.com%2Fmods%2Fautopause"; + + var state = (AbstractDownloadState)DownloadDispatcher.ResolveArchive(ini.LoadIniString()); + + Assert.IsNotNull(state); + + var converted = state.ViaJSON(); + Assert.IsTrue(converted.Verify()); + var filename = Guid.NewGuid().ToString(); + + Assert.IsTrue(converted.IsWhitelisted(new ServerWhitelist { AllowedPrefixes = new List() })); + + converted.Download(new Archive { Name = "moddbtest.7z" }, filename); + + Assert.AreEqual("lUvpEjqxfyidBONSHcDy6EnZIPpAD2K4rkJ5ejCXc2k=", filename.FileSHA256()); + } } diff --git a/Wabbajack/Downloaders/DownloadDispatcher.cs b/Wabbajack/Downloaders/DownloadDispatcher.cs index fefeb4a4..25da40b7 100644 --- a/Wabbajack/Downloaders/DownloadDispatcher.cs +++ b/Wabbajack/Downloaders/DownloadDispatcher.cs @@ -9,37 +9,32 @@ namespace Wabbajack.Downloaders { public static class DownloadDispatcher { - private static List _downloaders = new List() + private static readonly List Downloaders = new List() { new MegaDownloader(), new DropboxDownloader(), new GoogleDriveDownloader(), - new HTTPDownloader(), + new ModDBDownloader(), new NexusDownloader(), - new ManualDownloader() + new ManualDownloader(), + new HTTPDownloader() }; - private static Dictionary _indexedDownloaders; + private static readonly Dictionary IndexedDownloaders; static DownloadDispatcher() { - _indexedDownloaders = _downloaders.ToDictionary(d => d.GetType()); + IndexedDownloaders = Downloaders.ToDictionary(d => d.GetType()); } public static T GetInstance() { - return (T)_indexedDownloaders[typeof(T)]; + return (T)IndexedDownloaders[typeof(T)]; } public static AbstractDownloadState ResolveArchive(dynamic ini) { - foreach (var d in _downloaders) - { - var result = d.GetDownloaderState(ini); - if (result != null) return result; - } - - return null; + return Downloaders.Select(d => d.GetDownloaderState(ini)).FirstOrDefault(result => result != null); } } diff --git a/Wabbajack/Downloaders/ModDBDownloader.cs b/Wabbajack/Downloaders/ModDBDownloader.cs new file mode 100644 index 00000000..06a37c8f --- /dev/null +++ b/Wabbajack/Downloaders/ModDBDownloader.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Wabbajack.Common; +using Wabbajack.Validation; + +namespace Wabbajack.Downloaders +{ + public class ModDBDownloader : IDownloader + { + public AbstractDownloadState GetDownloaderState(dynamic archive_ini) + { + var url = archive_ini?.General?.directURL; + + if (url != null && url.StartsWith("https://www.moddb.com/downloads/start")) + { + return new State + { + Url = url + }; + } + + return null; + } + + public void Prepare() + { + throw new NotImplementedException(); + } + + public class State : AbstractDownloadState + { + public string Url { get; set; } + public override bool IsWhitelisted(ServerWhitelist whitelist) + { + // Everything from Moddb is whitelisted + return true; + } + + public override void Download(Archive a, string destination) + { + var new_url = GetDownloadUrl(); + new HTTPDownloader.State {Url = new_url}.Download(a, destination); + } + + private string GetDownloadUrl() + { + var client = new HttpClient(); + var result = client.GetStringSync(Url); + var regex = new Regex("https:\\/\\/www\\.moddb\\.com\\/downloads\\/mirror\\/.*(?=\\\")"); + var match = regex.Match(result); + var new_url = match.Value; + return new_url; + } + + public override bool Verify() + { + var new_url = GetDownloadUrl(); + return new HTTPDownloader.State { Url = new_url }.Verify(); + } + + public override IDownloader GetDownloader() + { + return DownloadDispatcher.GetInstance(); + } + } + } +} diff --git a/Wabbajack/Wabbajack.csproj b/Wabbajack/Wabbajack.csproj index 005778c4..6fe91e7a 100644 --- a/Wabbajack/Wabbajack.csproj +++ b/Wabbajack/Wabbajack.csproj @@ -196,6 +196,7 @@ +