using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Alphaleonis.Win32.Filesystem; using Wabbajack.Lib.Validation; namespace Wabbajack.Lib.Downloaders { public abstract class AbstractDownloadState { public static List KnownSubTypes = new List() { typeof(HTTPDownloader.State), typeof(GameFileSourceDownloader.State), typeof(GoogleDriveDownloader.State), typeof(LoversLabDownloader.State), typeof(ManualDownloader.State), typeof(MediaFireDownloader.State), typeof(MegaDownloader.State), typeof(ModDBDownloader.State), typeof(NexusDownloader.State), typeof(SteamWorkshopDownloader.State), typeof(VectorPlexusDownloader.State), typeof(DeadlyStreamDownloader.State), typeof(AFKModsDownloader.State) }; public static Dictionary NameToType { get; set; } public static Dictionary TypeToName { get; set; } static AbstractDownloadState() { NameToType = KnownSubTypes.ToDictionary(t => t.FullName.Substring(t.Namespace.Length + 1), t => t); TypeToName = NameToType.ToDictionary(k => k.Value, k => k.Key); } public abstract object[] PrimaryKey { get; } public string PrimaryKeyString { get { var pk = new List(); pk.Add(AbstractDownloadState.TypeToName[GetType()]); pk.AddRange(PrimaryKey); var pk_str = string.Join("|",pk.Select(p => p.ToString())); return pk_str; } } /// /// Returns true if this file is allowed to be downloaded via whitelist /// /// /// public abstract bool IsWhitelisted(ServerWhitelist whitelist); /// /// Downloads this file to the given destination location /// /// public abstract Task Download(Archive a, string destination); public async Task Download(string destination) { var path = Path.GetDirectoryName(destination); if (!string.IsNullOrEmpty(path) && !Directory.Exists(path)) Directory.CreateDirectory(path); return await Download(new Archive {Name = Path.GetFileName(destination)}, destination); } /// /// Returns true if this link is still valid /// /// public abstract Task Verify(Archive archive); public abstract IDownloader GetDownloader(); public abstract string GetReportEntry(Archive a); public abstract string[] GetMetaIni(); } }