From 8e62880e23500c286c8a5ef367ea9ac5763a4531 Mon Sep 17 00:00:00 2001 From: Jeddunk Date: Tue, 6 Apr 2021 16:55:53 +0200 Subject: [PATCH] Show error message if Goldberg could not be downloaded/extracted, prompting the user to do so manually. Try to skip getting DLC from SteamDB on error. --- GoldbergGUI.Core/Services/GoldbergService.cs | 56 +++++++++--- GoldbergGUI.Core/Services/SteamService.cs | 94 +++++++++++--------- 2 files changed, 96 insertions(+), 54 deletions(-) diff --git a/GoldbergGUI.Core/Services/GoldbergService.cs b/GoldbergGUI.Core/Services/GoldbergService.cs index 299ba96..4de2f33 100644 --- a/GoldbergGUI.Core/Services/GoldbergService.cs +++ b/GoldbergGUI.Core/Services/GoldbergService.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Net.Http; using System.Text.RegularExpressions; using System.Threading.Tasks; +using System.Windows; using GoldbergGUI.Core.Models; using GoldbergGUI.Core.Utils; using MvvmCross.Logging; @@ -85,7 +86,10 @@ namespace GoldbergGUI.Core.Services _log = log; var download = await Download().ConfigureAwait(false); - if (download) await Extract(_goldbergZipPath).ConfigureAwait(false); + if (download) + { + await Extract(_goldbergZipPath).ConfigureAwait(false); + } return await GetGlobalSettings().ConfigureAwait(false); } @@ -379,15 +383,24 @@ namespace GoldbergGUI.Core.Services private async Task StartDownload(string downloadUrl) { - var client = new HttpClient(); - _log.Debug(downloadUrl); - await using var fileStream = File.OpenWrite(_goldbergZipPath); - //client.GetAsync(downloadUrl, HttpCompletionOption.ResponseHeadersRead) - var task = client.GetFileAsync(downloadUrl, fileStream).ConfigureAwait(false); - await task; - if (task.GetAwaiter().IsCompleted) + try { - _log.Info("Download finished!"); + var client = new HttpClient(); + _log.Debug(downloadUrl); + await using var fileStream = File.OpenWrite(_goldbergZipPath); + //client.GetAsync(downloadUrl, HttpCompletionOption.ResponseHeadersRead) + var task = client.GetFileAsync(downloadUrl, fileStream).ConfigureAwait(false); + await task; + if (task.GetAwaiter().IsCompleted) + { + _log.Info("Download finished!"); + } + } + catch (Exception e) + { + ShowErrorMessage(); + _log.Error(e.ToString); + Environment.Exit(1); } } @@ -398,12 +411,33 @@ namespace GoldbergGUI.Core.Services _log.Debug("Start extraction..."); await Task.Run(() => { - Directory.Delete(_goldbergPath, true); - ZipFile.ExtractToDirectory(archivePath, _goldbergPath); + try + { + Directory.Delete(_goldbergPath, true); + ZipFile.ExtractToDirectory(archivePath, _goldbergPath); + } + catch (Exception e) + { + ShowErrorMessage(); + _log.Error(e.ToString); + Environment.Exit(1); + // throw; + } }).ConfigureAwait(false); _log.Debug("Extraction done!"); } + private void ShowErrorMessage() + { + if (Directory.Exists(_goldbergPath)) + { + Directory.Delete(_goldbergPath, true); + } + Directory.CreateDirectory(_goldbergPath); + MessageBox.Show("Could not setup Goldberg Emulator!\n" + + "Please download it manually and extract its content into the \"goldberg\" subfolder!"); + } + // https://gitlab.com/Mr_Goldberg/goldberg_emulator/-/blob/master/generate_interfaces_file.cpp // (maybe) check DLL date first public async Task GenerateInterfacesFile(string filePath) diff --git a/GoldbergGUI.Core/Services/SteamService.cs b/GoldbergGUI.Core/Services/SteamService.cs index 300961e..3e23be6 100644 --- a/GoldbergGUI.Core/Services/SteamService.cs +++ b/GoldbergGUI.Core/Services/SteamService.cs @@ -215,57 +215,65 @@ namespace GoldbergGUI.Core.Services // Get Cloudflare cookie // Scrape and parse HTML page // Add missing to DLC list - + // ReSharper disable once InvertIf if (useSteamDb) { - var steamDbUri = new Uri($"https://steamdb.info/app/{steamApp.AppId}/dlc/"); - - var client = new HttpClient(); - client.DefaultRequestHeaders.UserAgent.ParseAdd(UserAgent); - - _log.Info("Get SteamDB App"); - var httpCall = client.GetAsync(steamDbUri); - var response = await httpCall.ConfigureAwait(false); - _log.Debug(httpCall.Status.ToString()); - _log.Debug(response.EnsureSuccessStatusCode().ToString()); - - var readAsStringAsync = response.Content.ReadAsStringAsync(); - var responseBody = await readAsStringAsync.ConfigureAwait(false); - _log.Debug(readAsStringAsync.Status.ToString()); - - var parser = new HtmlParser(); - var doc = parser.ParseDocument(responseBody); - - var query1 = doc.QuerySelector("#dlc"); - if (query1 != null) + try { - var query2 = query1.QuerySelectorAll(".app"); - foreach (var element in query2) - { - var dlcId = element.GetAttribute("data-appid"); - var query3 = element.QuerySelectorAll("td"); - var dlcName = query3 != null - ? query3[1].Text().Replace("\n", "").Trim() - : $"Unknown DLC {dlcId}"; - var dlcApp = new SteamApp {AppId = Convert.ToInt32(dlcId), Name = dlcName}; - var i = dlcList.FindIndex(x => x.AppId.Equals(dlcApp.AppId)); - if (i > -1) - { - if (dlcList[i].Name.Contains("Unknown DLC")) dlcList[i] = dlcApp; - } - else - { - dlcList.Add(dlcApp); - } - } + var steamDbUri = new Uri($"https://steamdb.info/app/{steamApp.AppId}/dlc/"); - dlcList.ForEach(x => _log.Debug($"{x.AppId}={x.Name}")); - _log.Info("Got DLC from SteamDB successfully..."); + var client = new HttpClient(); + client.DefaultRequestHeaders.UserAgent.ParseAdd(UserAgent); + + _log.Info("Get SteamDB App"); + var httpCall = client.GetAsync(steamDbUri); + var response = await httpCall.ConfigureAwait(false); + _log.Debug(httpCall.Status.ToString()); + _log.Debug(response.EnsureSuccessStatusCode().ToString()); + + var readAsStringAsync = response.Content.ReadAsStringAsync(); + var responseBody = await readAsStringAsync.ConfigureAwait(false); + _log.Debug(readAsStringAsync.Status.ToString()); + + var parser = new HtmlParser(); + var doc = parser.ParseDocument(responseBody); + + var query1 = doc.QuerySelector("#dlc"); + if (query1 != null) + { + var query2 = query1.QuerySelectorAll(".app"); + foreach (var element in query2) + { + var dlcId = element.GetAttribute("data-appid"); + var query3 = element.QuerySelectorAll("td"); + var dlcName = query3 != null + ? query3[1].Text().Replace("\n", "").Trim() + : $"Unknown DLC {dlcId}"; + var dlcApp = new SteamApp {AppId = Convert.ToInt32(dlcId), Name = dlcName}; + var i = dlcList.FindIndex(x => x.AppId.Equals(dlcApp.AppId)); + if (i > -1) + { + if (dlcList[i].Name.Contains("Unknown DLC")) dlcList[i] = dlcApp; + } + else + { + dlcList.Add(dlcApp); + } + } + + dlcList.ForEach(x => _log.Debug($"{x.AppId}={x.Name}")); + _log.Info("Got DLC from SteamDB successfully..."); + } + else + { + _log.Error("Could not get DLC from SteamDB!"); + } } - else + catch (Exception e) { _log.Error("Could not get DLC from SteamDB!"); + _log.Error(e.ToString); } } }