2022-07-09 00:33:55 -04:00
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
using SPT_AKI_Installer.Aki.Core.Model;
|
|
|
|
|
using SPT_AKI_Installer.Aki.Helper;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using CG.Web.MegaApiClient;
|
|
|
|
|
|
|
|
|
|
namespace SPT_AKI_Installer.Aki.Core.Tasks
|
|
|
|
|
{
|
|
|
|
|
public class DownloadTask : LiveTableTask
|
|
|
|
|
{
|
|
|
|
|
private InternalData _data;
|
|
|
|
|
|
|
|
|
|
public DownloadTask(InternalData data) : base("Download Files", false)
|
|
|
|
|
{
|
|
|
|
|
_data = data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async Task<GenericResult> BuildMirrorList()
|
|
|
|
|
{
|
|
|
|
|
var mirrorListInfo = new FileInfo(Path.Join(_data.TargetInstallPath, "mirrors.json"));
|
|
|
|
|
|
2022-07-09 13:08:41 -04:00
|
|
|
|
SetStatus("Downloading Mirror List", false);
|
2022-07-09 00:33:55 -04:00
|
|
|
|
|
|
|
|
|
var progress = new Progress<double>((d) => { Progress = (int)Math.Floor(d); });
|
|
|
|
|
|
|
|
|
|
var downloadResult = await DownloadHelper.DownloadFile(mirrorListInfo, _data.PatcherMirrorsLink, progress);
|
|
|
|
|
|
|
|
|
|
if (!downloadResult.Succeeded)
|
|
|
|
|
{
|
|
|
|
|
return downloadResult;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var blah = JsonConvert.DeserializeObject<List<string>>(File.ReadAllText(mirrorListInfo.FullName));
|
|
|
|
|
|
|
|
|
|
if (blah is List<string> mirrors)
|
|
|
|
|
{
|
|
|
|
|
_data.PatcherReleaseMirrors = mirrors;
|
|
|
|
|
|
|
|
|
|
return GenericResult.FromSuccess();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return GenericResult.FromError("Failed to deserialize mirrors list");
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-09 13:08:41 -04:00
|
|
|
|
private async Task<GenericResult> DownloadPatcherFromMirrors(IProgress<double> progress)
|
2022-07-09 00:33:55 -04:00
|
|
|
|
{
|
|
|
|
|
foreach (string mirror in _data.PatcherReleaseMirrors)
|
|
|
|
|
{
|
2022-07-09 13:08:41 -04:00
|
|
|
|
SetStatus($"Downloading Patcher: {mirror}", false);
|
2022-07-09 00:33:55 -04:00
|
|
|
|
|
|
|
|
|
// mega is a little weird since they use encryption, but thankfully there is a great library for their api :)
|
|
|
|
|
if (mirror.StartsWith("https://mega"))
|
|
|
|
|
{
|
|
|
|
|
var megaClient = new MegaApiClient();
|
|
|
|
|
await megaClient.LoginAnonymousAsync();
|
|
|
|
|
|
|
|
|
|
// if mega fails to connect, try the next mirror
|
|
|
|
|
if (!megaClient.IsLoggedIn) continue;
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
using var megaDownloadStream = await megaClient.DownloadAsync(new Uri(mirror), progress);
|
2022-07-09 13:08:41 -04:00
|
|
|
|
using var patcherFileStream = _data.PatcherZipInfo.Open(FileMode.Create);
|
2022-07-09 00:33:55 -04:00
|
|
|
|
{
|
|
|
|
|
await megaDownloadStream.CopyToAsync(patcherFileStream);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return GenericResult.FromSuccess();
|
|
|
|
|
}
|
|
|
|
|
catch(Exception)
|
|
|
|
|
{
|
|
|
|
|
//most likely a 509 (Bandwidth limit exceeded) due to mega's user quotas.
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-09 13:08:41 -04:00
|
|
|
|
var result = await DownloadHelper.DownloadFile(_data.PatcherZipInfo, mirror, progress);
|
2022-07-09 00:33:55 -04:00
|
|
|
|
|
|
|
|
|
if(result.Succeeded)
|
|
|
|
|
{
|
|
|
|
|
return GenericResult.FromSuccess();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return GenericResult.FromError("Failed to download Patcher");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override async Task<GenericResult> RunAsync()
|
|
|
|
|
{
|
2022-07-09 13:08:41 -04:00
|
|
|
|
_data.PatcherZipInfo = new FileInfo(Path.Join(_data.TargetInstallPath, "patcher.zip"));
|
|
|
|
|
_data.AkiZipInfo= new FileInfo(Path.Join(_data.TargetInstallPath, "sptaki.zip"));
|
2022-07-09 00:33:55 -04:00
|
|
|
|
|
|
|
|
|
if (_data.PatchNeeded)
|
|
|
|
|
{
|
2022-07-09 13:08:41 -04:00
|
|
|
|
if (_data.PatcherZipInfo.Exists) _data.PatcherZipInfo.Delete();
|
2022-07-09 00:33:55 -04:00
|
|
|
|
|
|
|
|
|
var buildResult = await BuildMirrorList();
|
|
|
|
|
|
|
|
|
|
if (!buildResult.Succeeded)
|
|
|
|
|
{
|
|
|
|
|
return buildResult;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Progress = 0;
|
|
|
|
|
|
|
|
|
|
var progress = new Progress<double>((d) => { Progress = (int)Math.Floor(d); });
|
2022-07-09 13:08:41 -04:00
|
|
|
|
var patcherDownloadRresult = await DownloadPatcherFromMirrors(progress);
|
2022-07-09 00:33:55 -04:00
|
|
|
|
|
|
|
|
|
if (!patcherDownloadRresult.Succeeded)
|
|
|
|
|
{
|
|
|
|
|
return patcherDownloadRresult;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-09 13:08:41 -04:00
|
|
|
|
if (_data.AkiZipInfo.Exists) _data.AkiZipInfo.Delete();
|
2022-07-09 00:33:55 -04:00
|
|
|
|
|
|
|
|
|
SetStatus("Downloading SPT-AKI", false);
|
|
|
|
|
|
|
|
|
|
Progress = 0;
|
|
|
|
|
|
|
|
|
|
var akiProgress = new Progress<double>((d) => { Progress = (int)Math.Floor(d); });
|
|
|
|
|
|
2022-07-09 13:08:41 -04:00
|
|
|
|
var releaseDownloadResult = await DownloadHelper.DownloadFile(_data.AkiZipInfo, _data.AkiReleaseDownloadLink, akiProgress);
|
2022-07-09 00:33:55 -04:00
|
|
|
|
|
|
|
|
|
if (!releaseDownloadResult.Succeeded)
|
|
|
|
|
{
|
|
|
|
|
return releaseDownloadResult;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return GenericResult.FromSuccess();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|