Files
WowUp/WowUp.WPF/ViewModels/InstallUrlDialogViewModel.cs
jliddev 182bcef037 Wow Interface integration
Add default headers to most Http calls.
Add WowInterface addon provider.
Increase TukUI Cache time from 10 -> 60 minutes.
2020-08-16 23:45:59 -05:00

234 lines
6.4 KiB
C#

using Serilog;
using System;
using System.Threading.Tasks;
using System.Windows;
using WowUp.Common.Enums;
using WowUp.Common.Exceptions;
using WowUp.Common.Extensions;
using WowUp.Common.Models;
using WowUp.WPF.Services.Contracts;
using WowUp.WPF.Utilities;
namespace WowUp.WPF.ViewModels
{
public class InstallUrlDialogViewModel : BaseViewModel
{
private readonly IAddonService _addonService;
private readonly IAnalyticsService _analyticsService;
private Window _window;
public Window Window
{
get => _window;
set { SetProperty(ref _window, value); }
}
public WowClientType ClientType { get; set; }
private string _title;
public string Title
{
get => _title;
set { SetProperty(ref _title, value); }
}
private string _input;
public string Input
{
get => _input;
set { SetProperty(ref _input, value); }
}
private PotentialAddon _importedAddon;
public PotentialAddon ImportedAddon
{
get => _importedAddon;
set { SetProperty(ref _importedAddon, value); }
}
private string _importedAddonSubtitle;
public string ImportedAddonSubtitle
{
get => _importedAddonSubtitle;
set { SetProperty(ref _importedAddonSubtitle, value); }
}
private bool _enableImportButton;
public bool EnableImportButton
{
get => _enableImportButton;
set { SetProperty(ref _enableImportButton, value); }
}
private bool _showImportedAddon;
public bool ShowImportedAddon
{
get => _showImportedAddon;
set { SetProperty(ref _showImportedAddon, value); }
}
private bool _enableInstall;
public bool EnableInstall
{
get => _enableInstall;
set { SetProperty(ref _enableInstall, value); }
}
private bool _canInstall;
public bool CanInstall
{
get => _canInstall;
set { SetProperty(ref _canInstall, value); }
}
private bool _isInstalled;
public bool IsInstalled
{
get => _isInstalled;
set { SetProperty(ref _isInstalled, value); }
}
private bool _isInstalling;
public bool IsInstalling
{
get => _isInstalling;
set { SetProperty(ref _isInstalling, value); }
}
public Command SubmitCommand { get; set; }
public Command InstallCommand { get; set; }
public InstallUrlDialogViewModel(
IAddonService addonService,
IAnalyticsService analyticsService)
{
_addonService = addonService;
_analyticsService = analyticsService;
Title = "Install Addon URL";
EnableImportButton = true;
SubmitCommand = new Command(() => OnSubmit());
InstallCommand = new Command(() => OnInstall());
}
private async void OnSubmit()
{
IsBusy = true;
EnableImportButton = false;
ShowImportedAddon = false;
try
{
await ImportUrl(Input);
EnableInstall = true;
}
catch (Exception)
{
// eat
}
finally
{
IsBusy = false;
EnableImportButton = true;
}
//Window.DialogResult = true;
}
private async void OnInstall()
{
if (ImportedAddon == null)
{
return;
}
EnableInstall = false;
CanInstall = false;
IsInstalled = false;
IsInstalling = true;
try
{
await _analyticsService.TrackUserAction("Addons", "InstallByUrlImport", $"{ClientType}|{ImportedAddon.Name}");
await _addonService.InstallAddon(ImportedAddon, ClientType);
IsInstalled = true;
}
catch (Exception)
{
EnableInstall = true;
CanInstall = true;
MessageBox.Show("Failed to install addon");
}
finally
{
IsInstalling = false;
}
}
private Uri GetInputUri(string input)
{
try
{
return new Uri(input);
}
catch (Exception)
{
Input = string.Empty;
MessageBox.Show("Input was not a valid URL.");
throw;
}
}
private async Task ImportUrl(string input)
{
if (string.IsNullOrEmpty(input))
{
return;
}
Uri uri = GetInputUri(input);
try
{
await _analyticsService.TrackUserAction("Addons", "ImportAddonUrl", $"{ClientType}|{input}");
ImportedAddon = await _addonService.GetAddonByUri(uri, ClientType);
if (ImportedAddon == null)
{
throw new AddonNotFoundException();
}
ImportedAddonSubtitle = $"By {ImportedAddon.Author}\n{ImportedAddon.DownloadCount.FormatDownloadCount()} downloads on {ImportedAddon.ProviderName}";
IsInstalled = _addonService.IsInstalled(ImportedAddon.ExternalId, ClientType);
CanInstall = !IsInstalled;
ShowImportedAddon = true;
}
catch (AddonNotFoundException)
{
MessageBox.Show("Addon not found");
}
catch (AddonAlreadyInstalledException)
{
MessageBox.Show("Addon already installed");
}
catch (InvalidUrlException)
{
MessageBox.Show("Invalid URL detected");
}
catch (RateLimitExceededException)
{
MessageBox.Show("Rate limit exceeded, please wait a while and try again.");
}
catch (Exception ex)
{
Log.Error(ex, "Failed to install addon");
MessageBox.Show("Failed to import addon");
}
}
}
}