mirror of
https://github.com/WowUp/WowUp.git
synced 2026-04-21 22:40:15 -04:00
Add default headers to most Http calls. Add WowInterface addon provider. Increase TukUI Cache time from 10 -> 60 minutes.
234 lines
6.4 KiB
C#
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");
|
|
}
|
|
}
|
|
}
|
|
}
|