From fb100c10aed7513f01f4746ba09a3c8d0b1ed020 Mon Sep 17 00:00:00 2001 From: pointfeev Date: Sat, 13 Nov 2021 20:49:28 -0500 Subject: [PATCH] v2.0.2.2 --- CreamInstaller/CreamInstaller.csproj | 3 +- CreamInstaller/Forms/MainForm.Designer.cs | 13 +++- CreamInstaller/Forms/MainForm.cs | 75 +++++++++++++++++++---- CreamInstaller/Forms/SelectForm.cs | 24 ++++---- CreamInstaller/Program.cs | 5 +- CreamInstaller/SteamCMD.cs | 16 ++--- 6 files changed, 97 insertions(+), 39 deletions(-) diff --git a/CreamInstaller/CreamInstaller.csproj b/CreamInstaller/CreamInstaller.csproj index b2b31dd..27fe89d 100644 --- a/CreamInstaller/CreamInstaller.csproj +++ b/CreamInstaller/CreamInstaller.csproj @@ -6,7 +6,7 @@ true ini.ico true - 2.0.2.1 + 2.0.2.2 ini.ico Automatically generates and installs CreamAPI files for Steam games on the user's computer. It can also generate and install CreamAPI for the Paradox Launcher should the user select a Paradox Interactive game. @@ -48,6 +48,7 @@ + diff --git a/CreamInstaller/Forms/MainForm.Designer.cs b/CreamInstaller/Forms/MainForm.Designer.cs index 9b00e2d..4af2aee 100644 --- a/CreamInstaller/Forms/MainForm.Designer.cs +++ b/CreamInstaller/Forms/MainForm.Designer.cs @@ -37,6 +37,7 @@ namespace CreamInstaller this.updateButton = new System.Windows.Forms.Button(); this.ignoreButton = new System.Windows.Forms.Button(); this.progressBar1 = new System.Windows.Forms.ProgressBar(); + this.changelogTreeView = new System.Windows.Forms.TreeView(); this.SuspendLayout(); // // label1 @@ -78,11 +79,19 @@ namespace CreamInstaller this.progressBar1.TabIndex = 4; this.progressBar1.Visible = false; // + // changelogTreeView + // + this.changelogTreeView.Location = new System.Drawing.Point(12, 70); + this.changelogTreeView.Name = "changelogTreeView"; + this.changelogTreeView.Size = new System.Drawing.Size(380, 179); + this.changelogTreeView.TabIndex = 5; + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(404, 46); + this.ClientSize = new System.Drawing.Size(404, 261); + this.Controls.Add(this.changelogTreeView); this.Controls.Add(this.progressBar1); this.Controls.Add(this.ignoreButton); this.Controls.Add(this.updateButton); @@ -91,6 +100,7 @@ namespace CreamInstaller this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; + this.MaximumSize = new System.Drawing.Size(420, 300); this.MinimizeBox = false; this.Name = "MainForm"; this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; @@ -108,6 +118,7 @@ namespace CreamInstaller private Button updateButton; private Button ignoreButton; private ProgressBar progressBar1; + private TreeView changelogTreeView; } } diff --git a/CreamInstaller/Forms/MainForm.cs b/CreamInstaller/Forms/MainForm.cs index 17d1ef7..6d6f53e 100644 --- a/CreamInstaller/Forms/MainForm.cs +++ b/CreamInstaller/Forms/MainForm.cs @@ -1,10 +1,14 @@ -using Onova; +using HtmlAgilityPack; +using Onova; using Onova.Models; using Onova.Services; using System; +using System.Collections.Generic; using System.Drawing; using System.IO; +using System.Net.Http; using System.Threading; +using System.Threading.Tasks; using System.Windows.Forms; namespace CreamInstaller @@ -33,26 +37,31 @@ namespace CreamInstaller Close(); } + private static readonly HttpClient httpClient = new(); private static UpdateManager updateManager = null; private static Version latestVersion = null; + private static IReadOnlyList versions; private async void OnLoad() { - Size = new Size(420, 85); + Size = new(420, 85); progressBar1.Visible = false; ignoreButton.Visible = true; updateButton.Text = "Update"; updateButton.Click -= OnUpdateCancel; label1.Text = "Checking for updates . . ."; + changelogTreeView.Visible = false; + changelogTreeView.Location = new(12, 41); + changelogTreeView.Size = new(380, 208); - GithubPackageResolver resolver = new GithubPackageResolver("pointfeev", "CreamInstaller", "CreamInstaller.zip"); - ZipPackageExtractor extractor = new ZipPackageExtractor(); - updateManager = new UpdateManager(AssemblyMetadata.FromAssembly(Program.EntryAssembly, Program.CurrentProcessFilePath), resolver, extractor); + GithubPackageResolver resolver = new("pointfeev", "CreamInstaller", "CreamInstaller.zip"); + ZipPackageExtractor extractor = new(); + updateManager = new(AssemblyMetadata.FromAssembly(Program.EntryAssembly, Program.CurrentProcessFilePath), resolver, extractor); if (latestVersion is null) { CheckForUpdatesResult checkForUpdatesResult = null; - cancellationTokenSource = new CancellationTokenSource(); + cancellationTokenSource = new(); try { checkForUpdatesResult = await updateManager.CheckForUpdatesAsync(cancellationTokenSource.Token); @@ -61,6 +70,7 @@ namespace CreamInstaller if (checkForUpdatesResult.CanUpdate) { latestVersion = checkForUpdatesResult.LastVersion; + versions = checkForUpdatesResult.Versions; } } catch { } @@ -73,10 +83,50 @@ namespace CreamInstaller } else { + Size = new(420, 300); label1.Text = $"An update is available: v{latestVersion}"; ignoreButton.Enabled = true; updateButton.Enabled = true; - updateButton.Click += new EventHandler(OnUpdate); + updateButton.Click += new(OnUpdate); + changelogTreeView.Visible = true; + Version currentVersion = new(Application.ProductVersion); + foreach (Version version in versions) + { + if (version > currentVersion && !changelogTreeView.Nodes.ContainsKey(version.ToString())) + { + TreeNode root = new($"v{version}"); + root.Name = version.ToString(); + changelogTreeView.Nodes.Add(root); + new Task(async () => + { + try + { + string url = $"https://github.com/pointfeev/CreamInstaller/releases/tag/v{version}"; + using HttpRequestMessage request = new(HttpMethod.Get, url); + using HttpResponseMessage response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead); + response.EnsureSuccessStatusCode(); + using Stream stream = await response.Content.ReadAsStreamAsync(); + using StreamReader reader = new(stream); + HtmlAgilityPack.HtmlDocument document = new(); + document.LoadHtml(reader.ReadToEnd()); + foreach (HtmlNode node in document.DocumentNode.SelectNodes("//div[@data-test-selector='body-content']/ul/li")) + { + changelogTreeView.Invoke((MethodInvoker)delegate + { + TreeNode change = new(); + change.Text = $"{node.InnerText}"; + root.Nodes.Add(change); + root.Expand(); + }); + } + } + catch + { + changelogTreeView.Nodes.Remove(root); + } + }).Start(); + } + } } } @@ -103,22 +153,23 @@ namespace CreamInstaller private async void OnUpdate(object sender, EventArgs e) { - Size = new Size(420, 115); progressBar1.Visible = true; ignoreButton.Visible = false; updateButton.Text = "Cancel"; updateButton.Click -= OnUpdate; - updateButton.Click += new EventHandler(OnUpdateCancel); + updateButton.Click += new(OnUpdateCancel); + changelogTreeView.Location = new(12, 70); + changelogTreeView.Size = new(380, 179); - Progress progress = new Progress(); - progress.ProgressChanged += new EventHandler(delegate (object sender, double _progress) + Progress progress = new(); + progress.ProgressChanged += new(delegate (object sender, double _progress) { label1.Text = $"Updating . . . {(int)_progress}%"; progressBar1.Value = (int)_progress; }); label1.Text = "Updating . . . "; - cancellationTokenSource = new CancellationTokenSource(); + cancellationTokenSource = new(); try { await updateManager.PrepareUpdateAsync(latestVersion, progress, cancellationTokenSource.Token); diff --git a/CreamInstaller/Forms/SelectForm.cs b/CreamInstaller/Forms/SelectForm.cs index e9da57f..e6e1ba0 100644 --- a/CreamInstaller/Forms/SelectForm.cs +++ b/CreamInstaller/Forms/SelectForm.cs @@ -23,11 +23,11 @@ namespace CreamInstaller Text = Program.ApplicationName; } - private List GameLibraryDirectories + private static List GameLibraryDirectories { get { - List gameDirectories = new List(); + List gameDirectories = new(); if (Program.Canceled) return gameDirectories; string steamInstallPath = Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Valve\\Steam", "InstallPath", null) as string; if (steamInstallPath == null) steamInstallPath = Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Valve\\Steam", "InstallPath", null) as string; @@ -55,7 +55,7 @@ namespace CreamInstaller } } - private bool GetDllDirectoriesFromGameDirectory(string gameDirectory, out List dllDirectories) + private static bool GetDllDirectoriesFromGameDirectory(string gameDirectory, out List dllDirectories) { dllDirectories = new(); if (Program.Canceled) return false; @@ -76,7 +76,7 @@ namespace CreamInstaller return true; } - private bool GetGamesFromLibraryDirectory(string libraryDirectory, out List> games) + private static bool GetGamesFromLibraryDirectory(string libraryDirectory, out List> games) { games = new(); if (Program.Canceled) return false; @@ -111,7 +111,6 @@ namespace CreamInstaller } private readonly List treeNodes = new(); - internal List RunningTasks = new(); private void GetCreamApiApplicablePrograms(IProgress progress) @@ -134,9 +133,9 @@ namespace CreamInstaller int buildId = program.Item4; string directory = program.Item5; if (Program.Canceled) return; - // easy anti cheat detects DLL changes, so skip those games + // EasyAntiCheat detects DLL changes, so skip those games if (Directory.Exists(directory + @"\EasyAntiCheat")) continue; - // battleye in DayZ detects DLL changes, but not in Arma3? + // BattlEye in DayZ detects DLL changes, but not in Arma3? if (name != "Arma 3" && Directory.Exists(directory + @"\BattlEye")) continue; Task task = new(() => { @@ -156,8 +155,7 @@ namespace CreamInstaller { if (Program.Canceled) return; string dlcName = null; - VProperty dlcAppInfo = null; - if (SteamCMD.GetAppInfo(id, out dlcAppInfo)) dlcName = dlcAppInfo?.Value?["common"]?["name"]?.ToString(); + if (SteamCMD.GetAppInfo(id, out VProperty dlcAppInfo)) dlcName = dlcAppInfo?.Value?["common"]?["name"]?.ToString(); if (Program.Canceled) return; if (string.IsNullOrWhiteSpace(dlcName)) return; dlc[id] = dlcName; @@ -243,7 +241,7 @@ namespace CreamInstaller label2.Visible = true; progressBar1.Visible = true; progressBar1.Value = 0; - groupBox1.Size = new Size(groupBox1.Size.Width, groupBox1.Size.Height - 44); + groupBox1.Size = new(groupBox1.Size.Width, groupBox1.Size.Height - 44); bool setup = true; int maxProgress = 0; @@ -284,7 +282,7 @@ namespace CreamInstaller treeNode.Remove(); progressBar1.Value = 100; - groupBox1.Size = new Size(groupBox1.Size.Width, groupBox1.Size.Height + 44); + groupBox1.Size = new(groupBox1.Size.Width, groupBox1.Size.Height + 44); label2.Visible = false; progressBar1.Visible = false; @@ -397,7 +395,7 @@ namespace CreamInstaller { if (ProgramSelection.All.Count > 0) { - foreach (ProgramSelection selection in ProgramSelection.AllSafe) + foreach (ProgramSelection selection in ProgramSelection.AllSafeEnabled) { if (!Program.IsProgramRunningDialog(this, selection)) { @@ -417,7 +415,7 @@ namespace CreamInstaller } int X = installForm.Location.X + installForm.Size.Width / 2 - Size.Width / 2; int Y = installForm.Location.Y + installForm.Size.Height / 2 - Size.Height / 2; - Location = new Point(X, Y); + Location = new(X, Y); Show(); } else diff --git a/CreamInstaller/Program.cs b/CreamInstaller/Program.cs index 2b647c7..646d754 100644 --- a/CreamInstaller/Program.cs +++ b/CreamInstaller/Program.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.IO; -using System.IO.Compression; using System.Reflection; using System.Threading; using System.Windows.Forms; @@ -28,7 +27,7 @@ namespace CreamInstaller Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - Application.ApplicationExit += new EventHandler(OnApplicationExit); + Application.ApplicationExit += new(OnApplicationExit); retry: try { @@ -82,8 +81,6 @@ namespace CreamInstaller public static List ProgramSelections = new(); public static bool Canceled = false; - public static string OutputFile = null; // placeholder, won't exist in new system - public static ZipArchive OutputArchive = null; // placeholder, won't exist in new system public static void Cleanup(bool cancel = true) { diff --git a/CreamInstaller/SteamCMD.cs b/CreamInstaller/SteamCMD.cs index 20465c2..2acff60 100644 --- a/CreamInstaller/SteamCMD.cs +++ b/CreamInstaller/SteamCMD.cs @@ -13,14 +13,14 @@ namespace CreamInstaller { public static class SteamCMD { - public static string DirectoryPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\CreamInstaller"; - public static string FilePath = DirectoryPath + @"\steamcmd.exe"; - public static string ArchivePath = DirectoryPath + @"\steamcmd.zip"; - public static string DllPath = DirectoryPath + @"\steamclient.dll"; - public static string AppCachePath = DirectoryPath + @"\appcache"; - public static string AppCacheAppInfoPath = AppCachePath + @"\appinfo.vdf"; - public static string AppInfoPath = DirectoryPath + @"\appinfo"; - public static string AppInfoVersionPath = AppInfoPath + @"\version.txt"; + public static readonly string DirectoryPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\CreamInstaller"; + public static readonly string FilePath = DirectoryPath + @"\steamcmd.exe"; + public static readonly string ArchivePath = DirectoryPath + @"\steamcmd.zip"; + public static readonly string DllPath = DirectoryPath + @"\steamclient.dll"; + public static readonly string AppCachePath = DirectoryPath + @"\appcache"; + public static readonly string AppCacheAppInfoPath = AppCachePath + @"\appinfo.vdf"; + public static readonly string AppInfoPath = DirectoryPath + @"\appinfo"; + public static readonly string AppInfoVersionPath = AppInfoPath + @"\version.txt"; public static bool Run(string command, out string output) {