wabbajack/Wabbajack/View Models/UserInterventionHandlers.cs

100 lines
3.3 KiB
C#
Raw Normal View History

2019-12-08 17:00:22 +00:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
2019-12-08 17:00:22 +00:00
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;
using ReactiveUI;
using Wabbajack.Common;
using Wabbajack.Lib;
2019-12-08 17:00:22 +00:00
using Wabbajack.Lib.Downloaders;
using Wabbajack.Lib.NexusApi;
using Wabbajack.Lib.WebAutomation;
2019-12-08 17:00:22 +00:00
namespace Wabbajack
{
public class UserInterventionHandlers
{
public MainWindowVM MainWindow { get; }
2019-12-08 17:00:22 +00:00
public UserInterventionHandlers(MainWindowVM mvm)
{
MainWindow = mvm;
2019-12-08 17:00:22 +00:00
}
private async Task WrapBrowserJob(IUserIntervention intervention, Func<WebBrowserVM, CancellationTokenSource, Task> toDo)
2019-12-08 17:00:22 +00:00
{
CancellationTokenSource cancel = new CancellationTokenSource();
var oldPane = MainWindow.ActivePane;
var vm = await WebBrowserVM.GetNew();
MainWindow.NavigateTo(vm);
vm.BackCommand = ReactiveCommand.Create(() =>
2019-12-08 17:00:22 +00:00
{
cancel.Cancel();
MainWindow.NavigateTo(oldPane);
intervention.Cancel();
2019-12-08 17:00:22 +00:00
});
try
{
await toDo(vm, cancel);
}
catch (TaskCanceledException)
{
intervention.Cancel();
}
catch (Exception ex)
{
Utils.Error(ex);
intervention.Cancel();
}
MainWindow.NavigateTo(oldPane);
2019-12-08 17:00:22 +00:00
}
public async Task Handle(IUserIntervention msg)
2019-12-08 17:00:22 +00:00
{
switch (msg)
{
case RequestNexusAuthorization c:
await WrapBrowserJob(msg, async (vm, cancel) =>
{
await vm.Driver.WaitForInitialized();
var key = await NexusApiClient.SetupNexusLogin(new CefSharpWrapper(vm.Browser), m => vm.Instructions = m, cancel.Token);
c.Resume(key);
});
2019-12-08 17:00:22 +00:00
break;
case AbstractNeedsLoginDownloader.RequestSiteLogin c:
await WrapBrowserJob(msg, async (vm, cancel) =>
{
await vm.Driver.WaitForInitialized();
var data = await c.Downloader.GetAndCacheCookies(new CefSharpWrapper(vm.Browser), m => vm.Instructions = m, cancel.Token);
c.Resume(data);
});
2019-12-08 17:00:22 +00:00
break;
case YesNoIntervention c:
var result = MessageBox.Show(c.ExtendedDescription, c.ShortDescription, MessageBoxButton.YesNo,
MessageBoxImage.Question);
if (result == MessageBoxResult.Yes)
c.Confirm();
else
c.Cancel();
break;
case CriticalFailureIntervention c:
MessageBox.Show(c.ExtendedDescription, c.ShortDescription, MessageBoxButton.OK,
MessageBoxImage.Error);
c.Cancel();
break;
case ConfirmationIntervention c:
break;
2019-12-08 17:00:22 +00:00
default:
throw new NotImplementedException($"No handler for {msg}");
}
}
2019-12-20 20:51:10 +00:00
2019-12-08 17:00:22 +00:00
}
}