Merge pull request #348 from Noggog/downloader-adjustments

Downloader adjustments
This commit is contained in:
Timothy Baldridge 2020-01-04 18:07:03 -08:00 committed by GitHub
commit cf2f988156
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 75 additions and 28 deletions

View File

@ -129,6 +129,30 @@ namespace Wabbajack.Common
} }
} }
public static void CatchAndLog(Action a)
{
try
{
a();
}
catch (Exception ex)
{
Utils.Error(ex);
}
}
public static async Task CatchAndLog(Func<Task> f)
{
try
{
await f();
}
catch (Exception ex)
{
Utils.Error(ex);
}
}
/// <summary> /// <summary>
/// MurMur3 hashes the file pointed to by this string /// MurMur3 hashes the file pointed to by this string
/// </summary> /// </summary>

View File

@ -8,7 +8,7 @@ using System.Windows.Input;
namespace Wabbajack.Lib.Downloaders namespace Wabbajack.Lib.Downloaders
{ {
public interface INeedsLogin : INotifyPropertyChanged public interface INeedsLogin
{ {
ICommand TriggerLogin { get; } ICommand TriggerLogin { get; }
ICommand ClearLogin { get; } ICommand ClearLogin { get; }
@ -17,6 +17,5 @@ namespace Wabbajack.Lib.Downloaders
string MetaInfo { get; } string MetaInfo { get; }
Uri SiteURL { get; } Uri SiteURL { get; }
Uri IconUri { get; } Uri IconUri { get; }
} }
} }

View File

@ -20,7 +20,7 @@ using File = Alphaleonis.Win32.Filesystem.File;
namespace Wabbajack.Lib.Downloaders namespace Wabbajack.Lib.Downloaders
{ {
public class LoversLabDownloader : ViewModel, IDownloader, INeedsLogin public class LoversLabDownloader : IDownloader, INeedsLogin
{ {
internal HttpClient _authedClient; internal HttpClient _authedClient;
@ -40,8 +40,12 @@ namespace Wabbajack.Lib.Downloaders
public LoversLabDownloader() public LoversLabDownloader()
{ {
TriggerLogin = ReactiveCommand.Create(async () => await Utils.Log(new RequestLoversLabLogin()).Task, IsLoggedIn.Select(b => !b).ObserveOn(RxApp.MainThreadScheduler)); TriggerLogin = ReactiveCommand.CreateFromTask(
ClearLogin = ReactiveCommand.Create(() => Utils.DeleteEncryptedJson("loverslabcookies"), IsLoggedIn.ObserveOn(RxApp.MainThreadScheduler)); execute: () => Utils.CatchAndLog(async () => await Utils.Log(new RequestLoversLabLogin()).Task),
canExecute: IsLoggedIn.Select(b => !b).ObserveOn(RxApp.MainThreadScheduler));
ClearLogin = ReactiveCommand.Create(
execute: () => Utils.CatchAndLog(() => Utils.DeleteEncryptedJson("loverslabcookies")),
canExecute: IsLoggedIn.ObserveOn(RxApp.MainThreadScheduler));
} }
@ -222,7 +226,7 @@ namespace Wabbajack.Lib.Downloaders
public override void Cancel() public override void Cancel()
{ {
Handled = true; Handled = true;
_source.SetCanceled(); _source.TrySetCanceled();
} }
} }
} }

View File

@ -13,31 +13,18 @@ using Wabbajack.Lib.Validation;
namespace Wabbajack.Lib.Downloaders namespace Wabbajack.Lib.Downloaders
{ {
public class NexusDownloader : ViewModel, IDownloader, INeedsLogin public class NexusDownloader : IDownloader, INeedsLogin
{ {
private bool _prepared; private bool _prepared;
private SemaphoreSlim _lock = new SemaphoreSlim(1); private SemaphoreSlim _lock = new SemaphoreSlim(1);
private UserStatus _status; private UserStatus _status;
private NexusApiClient _client; private NexusApiClient _client;
public NexusDownloader()
{
TriggerLogin = ReactiveCommand.Create(async () => await NexusApiClient.RequestAndCacheAPIKey(), IsLoggedIn.Select(b => !b).ObserveOn(RxApp.MainThreadScheduler));
ClearLogin = ReactiveCommand.Create(() => Utils.DeleteEncryptedJson("nexusapikey"), IsLoggedIn.ObserveOn(RxApp.MainThreadScheduler));
}
public IObservable<bool> IsLoggedIn => Utils.HaveEncryptedJsonObservable("nexusapikey"); public IObservable<bool> IsLoggedIn => Utils.HaveEncryptedJsonObservable("nexusapikey");
public string SiteName => "Nexus Mods"; public string SiteName => "Nexus Mods";
public string MetaInfo public string MetaInfo => "";
{
get
{
return "";
}
}
public Uri SiteURL => new Uri("https://www.nexusmods.com"); public Uri SiteURL => new Uri("https://www.nexusmods.com");
@ -46,6 +33,16 @@ namespace Wabbajack.Lib.Downloaders
public ICommand TriggerLogin { get; } public ICommand TriggerLogin { get; }
public ICommand ClearLogin { get; } public ICommand ClearLogin { get; }
public NexusDownloader()
{
TriggerLogin = ReactiveCommand.CreateFromTask(
execute: () => Utils.CatchAndLog(NexusApiClient.RequestAndCacheAPIKey),
canExecute: IsLoggedIn.Select(b => !b).ObserveOn(RxApp.MainThreadScheduler));
ClearLogin = ReactiveCommand.Create(
execute: () => Utils.CatchAndLog(() => Utils.DeleteEncryptedJson("nexusapikey")),
canExecute: IsLoggedIn.ObserveOn(RxApp.MainThreadScheduler));
}
public async Task<AbstractDownloadState> GetDownloaderState(dynamic archiveINI) public async Task<AbstractDownloadState> GetDownloaderState(dynamic archiveINI)
{ {
var general = archiveINI?.General; var general = archiveINI?.General;

View File

@ -24,7 +24,7 @@ namespace Wabbajack.Lib.NexusApi
public override void Cancel() public override void Cancel()
{ {
Handled = true; Handled = true;
_source.SetCanceled(); _source.TrySetCanceled();
} }
} }
} }

View File

@ -45,6 +45,9 @@
<LangVersion>7.3</LangVersion> <LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<WarningsAsErrors>CS4014</WarningsAsErrors>
<NoWarn>CS1998</NoWarn>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath> <OutputPath>bin\x64\Release\</OutputPath>
@ -55,6 +58,8 @@
<LangVersion>7.3</LangVersion> <LangVersion>7.3</LangVersion>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<WarningsAsErrors>CS4014</WarningsAsErrors>
<NoWarn>CS1998</NoWarn>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="MongoDB.Bson"> <Reference Include="MongoDB.Bson">

View File

@ -28,8 +28,6 @@ namespace Wabbajack
public FilePickerVM ModListLocation { get; } public FilePickerVM ModListLocation { get; }
public IReactiveCommand BeginCommand { get; }
[Reactive] [Reactive]
public ACompiler ActiveCompilation { get; private set; } public ACompiler ActiveCompilation { get; private set; }

View File

@ -20,8 +20,6 @@ namespace Wabbajack
private readonly VortexCompilationSettings _settings; private readonly VortexCompilationSettings _settings;
public IReactiveCommand BeginCommand { get; }
private readonly ObservableAsPropertyHelper<ModlistSettingsEditorVM> _modListSettings; private readonly ObservableAsPropertyHelper<ModlistSettingsEditorVM> _modListSettings;
public ModlistSettingsEditorVM ModlistSettings => _modListSettings.Value; public ModlistSettingsEditorVM ModlistSettings => _modListSettings.Value;

View File

@ -74,7 +74,29 @@ namespace Wabbajack
Utils.LogMessages Utils.LogMessages
.OfType<IUserIntervention>() .OfType<IUserIntervention>()
.ObserveOnGuiThread() .ObserveOnGuiThread()
.SelectTask(msg => UserInterventionHandlers.Handle(msg)) .SelectTask(async msg =>
{
try
{
await UserInterventionHandlers.Handle(msg);
}
catch (Exception ex)
when (ex.GetType() != typeof(TaskCanceledException))
{
Utils.Error(ex, $"Error while handling user intervention of type {msg?.GetType()}");
try
{
if (!msg.Handled)
{
msg.Cancel();
}
}
catch (Exception cancelEx)
{
Utils.Error(cancelEx, $"Error while cancelling user intervention of type {msg?.GetType()}");
}
}
})
.Subscribe() .Subscribe()
.DisposeWith(CompositeDisposable); .DisposeWith(CompositeDisposable);