GoldbergGUI/GoldbergGUI.Core/ViewModels/MainViewModel.cs
Jeddunk 1540e6cb7a Added new class GoldbergConfiguration.
Global settings can now be saved and reset.
Language can now be edited (globally).
If Cache is broken, try to forcibly update it from the API.
2021-01-10 16:08:12 +01:00

447 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using GoldbergGUI.Core.Models;
using GoldbergGUI.Core.Services;
using Microsoft.Win32;
using MvvmCross.Commands;
using MvvmCross.Logging;
using MvvmCross.Navigation;
using MvvmCross.ViewModels;
namespace GoldbergGUI.Core.ViewModels
{
// ReSharper disable once ClassNeverInstantiated.Global
public class MainViewModel : MvxViewModel
{
private readonly IMvxNavigationService _navigationService;
private string _dllPath;
private string _gameName;
private int _appId;
//private SteamApp _currentGame;
private ObservableCollection<SteamApp> _dlcs;
private string _accountName;
private long _steamId;
private bool _offline;
private bool _disableNetworking;
private bool _disableOverlay;
private readonly ISteamService _steam;
private readonly IGoldbergService _goldberg;
private readonly IMvxLog _log;
private bool _mainWindowEnabled;
private bool _goldbergApplied;
private ObservableCollection<string> _steamLanguages;
private string _selectedLanguage;
public MainViewModel(ISteamService steam, IGoldbergService goldberg, IMvxLogProvider logProvider,
IMvxNavigationService navigationService)
{
_steam = steam;
_goldberg = goldberg;
_log = logProvider.GetLogFor(typeof(MainViewModel));
_navigationService = navigationService;
}
public override void Prepare()
{
base.Prepare();
Task.Run(async () =>
{
//var errorDuringInit = false;
MainWindowEnabled = false;
try
{
SteamLanguages = new ObservableCollection<string>(_goldberg.Languages());
ResetForm();
await _steam.Initialize(_log).ConfigureAwait(false);
var (accountName, userSteamId, language) =
await _goldberg.Initialize(_log).ConfigureAwait(false);
AccountName = accountName;
SteamId = userSteamId;
SelectedLanguage = language;
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
//errorDuringInit = true;
}
MainWindowEnabled = true;
});
}
public override async Task Initialize()
{
await base.Initialize().ConfigureAwait(false);
}
// PROPERTIES //
public string DllPath
{
get => _dllPath;
private set
{
_dllPath = value;
RaisePropertyChanged(() => DllPath);
}
}
public string GameName
{
get => _gameName;
set
{
_gameName = value;
RaisePropertyChanged(() => GameName);
}
}
public int AppId
{
get => _appId;
set
{
_appId = value;
RaisePropertyChanged(() => AppId);
Task.Run(async () => await GetNameById().ConfigureAwait(false));
}
}
// ReSharper disable once InconsistentNaming
public ObservableCollection<SteamApp> DLCs
{
get => _dlcs;
private set
{
_dlcs = value;
RaisePropertyChanged(() => DLCs);
RaisePropertyChanged(() => DllSelected);
RaisePropertyChanged(() => SteamInterfacesTxtExists);
}
}
public string AccountName
{
get => _accountName;
set
{
_accountName = value;
RaisePropertyChanged(() => AccountName);
}
}
public long SteamId
{
get => _steamId;
set
{
_steamId = value;
RaisePropertyChanged(() => SteamId);
}
}
public bool Offline
{
get => _offline;
set
{
_offline = value;
RaisePropertyChanged(() => Offline);
}
}
public bool DisableNetworking
{
get => _disableNetworking;
set
{
_disableNetworking = value;
RaisePropertyChanged(() => DisableNetworking);
}
}
public bool DisableOverlay
{
get => _disableOverlay;
set
{
_disableOverlay = value;
RaisePropertyChanged(() => DisableOverlay);
}
}
public bool MainWindowEnabled
{
get => _mainWindowEnabled;
set
{
_mainWindowEnabled = value;
RaisePropertyChanged(() => MainWindowEnabled);
}
}
public bool GoldbergApplied
{
get => _goldbergApplied;
set
{
_goldbergApplied = value;
RaisePropertyChanged(() => GoldbergApplied);
}
}
public bool SteamInterfacesTxtExists
{
get
{
var dllPathDirExists = GetDllPathDir(out var dirPath);
return dllPathDirExists && !File.Exists(Path.Combine(dirPath, "steam_interfaces.txt"));
}
}
public bool DllSelected => !DllPath.Contains("Path to game's steam_api(64).dll");
public ObservableCollection<string> SteamLanguages
{
get => _steamLanguages;
set
{
_steamLanguages = value;
RaisePropertyChanged(() => SteamLanguages);
}
}
public string SelectedLanguage
{
get => _selectedLanguage;
set
{
_selectedLanguage = value;
RaisePropertyChanged(() => SelectedLanguage);
//MyLogger.Log.Debug($"Lang: {value}");
}
}
// COMMANDS //
public IMvxCommand OpenFileCommand => new MvxAsyncCommand(OpenFile);
private async Task OpenFile()
{
var dialog = new OpenFileDialog
{
Filter = "SteamAPI DLL|steam_api.dll;steam_api64.dll|" +
"All files (*.*)|*.*",
Multiselect = false,
Title = "Select SteamAPI DLL..."
};
if (dialog.ShowDialog() != true)
{
_log.Warn("File selection canceled.");
return;
}
DllPath = dialog.FileName;
await ReadConfig().ConfigureAwait(false);
}
public IMvxCommand FindIdCommand => new MvxAsyncCommand(FindId);
private async Task FindId()
{
if (GameName.Contains("Game name..."))
{
_log.Error("No game name entered!");
return;
}
MainWindowEnabled = false;
var appByName = _steam.GetAppByName(_gameName);
if (appByName != null)
{
GameName = appByName.Name;
AppId = appByName.AppId;
}
else
{
var list = _steam.GetListOfAppsByName(GameName);
var steamApps = list as SteamApp[] ?? list.ToArray();
if (steamApps.Length == 1)
{
GameName = steamApps[0].Name;
AppId = steamApps[0].AppId;
}
else
{
var navigateTask = _navigationService
.Navigate<SearchResultViewModel, IEnumerable<SteamApp>, SteamApp>(steamApps);
var navigateResult = await navigateTask.ConfigureAwait(false);
if (navigateResult != null)
{
GameName = navigateResult.Name;
AppId = navigateResult.AppId;
}
}
}
MainWindowEnabled = true;
}
//public IMvxCommand GetNameByIdCommand => new MvxAsyncCommand(GetNameById);
private async Task GetNameById()
{
if (AppId <= 0)
{
_log.Error("Invalid Steam App!");
return;
}
var steamApp = await Task.Run(() => _steam.GetAppById(AppId)).ConfigureAwait(false);
if (steamApp != null) GameName = steamApp.Name;
}
public IMvxCommand GetListOfDlcCommand => new MvxAsyncCommand(GetListOfDlc);
private async Task GetListOfDlc()
{
if (AppId <= 0)
{
_log.Error("Invalid Steam App!");
return;
}
MainWindowEnabled = false;
var listOfDlc = await _steam.GetListOfDlc(new SteamApp {AppId = AppId, Name = GameName}, true)
.ConfigureAwait(false);
DLCs = new MvxObservableCollection<SteamApp>(listOfDlc);
MainWindowEnabled = true;
}
public IMvxCommand SaveConfigCommand => new MvxAsyncCommand(SaveConfig);
private async Task SaveConfig()
{
await _goldberg.SetGlobalSettings(AccountName, SteamId, SelectedLanguage).ConfigureAwait(false);
if (!DllSelected)
{
_log.Error("No DLL selected!");
return;
}
_log.Info("Saving...");
if (!GetDllPathDir(out var dirPath)) return;
MainWindowEnabled = false;
await _goldberg.Save(dirPath, new GoldbergConfiguration
{
AppId = AppId,
DlcList = DLCs.ToList(),
Offline = Offline,
DisableNetworking = DisableNetworking,
DisableOverlay = DisableOverlay
}
).ConfigureAwait(false);
GoldbergApplied = _goldberg.GoldbergApplied(dirPath);
MainWindowEnabled = true;
}
public IMvxCommand ResetConfigCommand => new MvxAsyncCommand(ResetConfig);
private async Task ResetConfig()
{
(AccountName, SteamId, SelectedLanguage) = await _goldberg.GetGlobalSettings().ConfigureAwait(false);
if (!DllSelected)
{
_log.Error("No DLL selected!");
return;
}
_log.Info("Reset form...");
MainWindowEnabled = false;
await ReadConfig().ConfigureAwait(false);
MainWindowEnabled = true;
}
public IMvxCommand GenerateSteamInterfacesCommand => new MvxAsyncCommand(GenerateSteamInterfaces);
private async Task GenerateSteamInterfaces()
{
if (!DllSelected)
{
_log.Error("No DLL selected!");
return;
}
_log.Info("Generate steam_interfaces.txt...");
MainWindowEnabled = false;
GetDllPathDir(out var dirPath);
if (File.Exists(Path.Combine(dirPath, "steam_api_o.dll")))
await _goldberg.GenerateInterfacesFile(Path.Combine(dirPath, "steam_api_o.dll")).ConfigureAwait(false);
else if (File.Exists(Path.Combine(dirPath, "steam_api64_o.dll")))
await _goldberg.GenerateInterfacesFile(Path.Combine(dirPath, "steam_api64_o.dll"))
.ConfigureAwait(false);
else await _goldberg.GenerateInterfacesFile(DllPath).ConfigureAwait(false);
await RaisePropertyChanged(() => SteamInterfacesTxtExists).ConfigureAwait(false);
MainWindowEnabled = true;
}
// OTHER METHODS //
private void ResetForm()
{
DllPath = "Path to game's steam_api(64).dll...";
GameName = "Game name...";
AppId = -1;
DLCs = new ObservableCollection<SteamApp>();
AccountName = "Account name...";
SteamId = -1;
Offline = false;
DisableNetworking = false;
DisableOverlay = false;
}
private async Task ReadConfig()
{
if (!GetDllPathDir(out var dirPath)) return;
MainWindowEnabled = false;
var config = await _goldberg.Read(dirPath).ConfigureAwait(false);
SetFormFromConfig(config);
GoldbergApplied = _goldberg.GoldbergApplied(dirPath);
await RaisePropertyChanged(() => SteamInterfacesTxtExists).ConfigureAwait(false);
MainWindowEnabled = true;
}
private void SetFormFromConfig(GoldbergConfiguration config)
{
AppId = config.AppId;
DLCs = new ObservableCollection<SteamApp>(config.DlcList);
Offline = config.Offline;
DisableNetworking = config.DisableNetworking;
DisableOverlay = config.DisableOverlay;
}
private bool GetDllPathDir(out string dirPath)
{
if (!DllSelected)
{
_log.Error("No DLL selected!");
dirPath = null;
return false;
}
dirPath = Path.GetDirectoryName(DllPath);
if (dirPath != null) return true;
_log.Error($"Invalid directory for {DllPath}.");
return false;
}
}
}