This commit is contained in:
pointfeev 2021-11-13 20:49:28 -05:00
parent ed7d1a6757
commit fb100c10ae
No known key found for this signature in database
GPG key ID: AA14DC36C4D7D13C
6 changed files with 97 additions and 39 deletions

View file

@ -6,7 +6,7 @@
<UseWindowsForms>true</UseWindowsForms> <UseWindowsForms>true</UseWindowsForms>
<ApplicationIcon>ini.ico</ApplicationIcon> <ApplicationIcon>ini.ico</ApplicationIcon>
<IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract> <IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>
<Version>2.0.2.1</Version> <Version>2.0.2.2</Version>
<PackageIcon>ini.ico</PackageIcon> <PackageIcon>ini.ico</PackageIcon>
<PackageIconUrl /> <PackageIconUrl />
<Description>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.</Description> <Description>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.</Description>
@ -48,6 +48,7 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Gameloop.Vdf" Version="0.6.1" /> <PackageReference Include="Gameloop.Vdf" Version="0.6.1" />
<PackageReference Include="HtmlAgilityPack" Version="1.11.38" />
<PackageReference Include="Onova" Version="2.6.2" /> <PackageReference Include="Onova" Version="2.6.2" />
</ItemGroup> </ItemGroup>

View file

@ -37,6 +37,7 @@ namespace CreamInstaller
this.updateButton = new System.Windows.Forms.Button(); this.updateButton = new System.Windows.Forms.Button();
this.ignoreButton = new System.Windows.Forms.Button(); this.ignoreButton = new System.Windows.Forms.Button();
this.progressBar1 = new System.Windows.Forms.ProgressBar(); this.progressBar1 = new System.Windows.Forms.ProgressBar();
this.changelogTreeView = new System.Windows.Forms.TreeView();
this.SuspendLayout(); this.SuspendLayout();
// //
// label1 // label1
@ -78,11 +79,19 @@ namespace CreamInstaller
this.progressBar1.TabIndex = 4; this.progressBar1.TabIndex = 4;
this.progressBar1.Visible = false; 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 // MainForm
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 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.progressBar1);
this.Controls.Add(this.ignoreButton); this.Controls.Add(this.ignoreButton);
this.Controls.Add(this.updateButton); this.Controls.Add(this.updateButton);
@ -91,6 +100,7 @@ namespace CreamInstaller
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false; this.MaximizeBox = false;
this.MaximumSize = new System.Drawing.Size(420, 300);
this.MinimizeBox = false; this.MinimizeBox = false;
this.Name = "MainForm"; this.Name = "MainForm";
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
@ -108,6 +118,7 @@ namespace CreamInstaller
private Button updateButton; private Button updateButton;
private Button ignoreButton; private Button ignoreButton;
private ProgressBar progressBar1; private ProgressBar progressBar1;
private TreeView changelogTreeView;
} }
} }

View file

@ -1,10 +1,14 @@
using Onova; using HtmlAgilityPack;
using Onova;
using Onova.Models; using Onova.Models;
using Onova.Services; using Onova.Services;
using System; using System;
using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.IO; using System.IO;
using System.Net.Http;
using System.Threading; using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
namespace CreamInstaller namespace CreamInstaller
@ -33,26 +37,31 @@ namespace CreamInstaller
Close(); Close();
} }
private static readonly HttpClient httpClient = new();
private static UpdateManager updateManager = null; private static UpdateManager updateManager = null;
private static Version latestVersion = null; private static Version latestVersion = null;
private static IReadOnlyList<Version> versions;
private async void OnLoad() private async void OnLoad()
{ {
Size = new Size(420, 85); Size = new(420, 85);
progressBar1.Visible = false; progressBar1.Visible = false;
ignoreButton.Visible = true; ignoreButton.Visible = true;
updateButton.Text = "Update"; updateButton.Text = "Update";
updateButton.Click -= OnUpdateCancel; updateButton.Click -= OnUpdateCancel;
label1.Text = "Checking for updates . . ."; 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"); GithubPackageResolver resolver = new("pointfeev", "CreamInstaller", "CreamInstaller.zip");
ZipPackageExtractor extractor = new ZipPackageExtractor(); ZipPackageExtractor extractor = new();
updateManager = new UpdateManager(AssemblyMetadata.FromAssembly(Program.EntryAssembly, Program.CurrentProcessFilePath), resolver, extractor); updateManager = new(AssemblyMetadata.FromAssembly(Program.EntryAssembly, Program.CurrentProcessFilePath), resolver, extractor);
if (latestVersion is null) if (latestVersion is null)
{ {
CheckForUpdatesResult checkForUpdatesResult = null; CheckForUpdatesResult checkForUpdatesResult = null;
cancellationTokenSource = new CancellationTokenSource(); cancellationTokenSource = new();
try try
{ {
checkForUpdatesResult = await updateManager.CheckForUpdatesAsync(cancellationTokenSource.Token); checkForUpdatesResult = await updateManager.CheckForUpdatesAsync(cancellationTokenSource.Token);
@ -61,6 +70,7 @@ namespace CreamInstaller
if (checkForUpdatesResult.CanUpdate) if (checkForUpdatesResult.CanUpdate)
{ {
latestVersion = checkForUpdatesResult.LastVersion; latestVersion = checkForUpdatesResult.LastVersion;
versions = checkForUpdatesResult.Versions;
} }
} }
catch { } catch { }
@ -73,10 +83,50 @@ namespace CreamInstaller
} }
else else
{ {
Size = new(420, 300);
label1.Text = $"An update is available: v{latestVersion}"; label1.Text = $"An update is available: v{latestVersion}";
ignoreButton.Enabled = true; ignoreButton.Enabled = true;
updateButton.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) private async void OnUpdate(object sender, EventArgs e)
{ {
Size = new Size(420, 115);
progressBar1.Visible = true; progressBar1.Visible = true;
ignoreButton.Visible = false; ignoreButton.Visible = false;
updateButton.Text = "Cancel"; updateButton.Text = "Cancel";
updateButton.Click -= OnUpdate; updateButton.Click -= OnUpdate;
updateButton.Click += new EventHandler(OnUpdateCancel); updateButton.Click += new(OnUpdateCancel);
changelogTreeView.Location = new(12, 70);
changelogTreeView.Size = new(380, 179);
Progress<double> progress = new Progress<double>(); Progress<double> progress = new();
progress.ProgressChanged += new EventHandler<double>(delegate (object sender, double _progress) progress.ProgressChanged += new(delegate (object sender, double _progress)
{ {
label1.Text = $"Updating . . . {(int)_progress}%"; label1.Text = $"Updating . . . {(int)_progress}%";
progressBar1.Value = (int)_progress; progressBar1.Value = (int)_progress;
}); });
label1.Text = "Updating . . . "; label1.Text = "Updating . . . ";
cancellationTokenSource = new CancellationTokenSource(); cancellationTokenSource = new();
try try
{ {
await updateManager.PrepareUpdateAsync(latestVersion, progress, cancellationTokenSource.Token); await updateManager.PrepareUpdateAsync(latestVersion, progress, cancellationTokenSource.Token);

View file

@ -23,11 +23,11 @@ namespace CreamInstaller
Text = Program.ApplicationName; Text = Program.ApplicationName;
} }
private List<string> GameLibraryDirectories private static List<string> GameLibraryDirectories
{ {
get get
{ {
List<string> gameDirectories = new List<string>(); List<string> gameDirectories = new();
if (Program.Canceled) return gameDirectories; if (Program.Canceled) return gameDirectories;
string steamInstallPath = Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Valve\\Steam", "InstallPath", null) as string; 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; 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<string> dllDirectories) private static bool GetDllDirectoriesFromGameDirectory(string gameDirectory, out List<string> dllDirectories)
{ {
dllDirectories = new(); dllDirectories = new();
if (Program.Canceled) return false; if (Program.Canceled) return false;
@ -76,7 +76,7 @@ namespace CreamInstaller
return true; return true;
} }
private bool GetGamesFromLibraryDirectory(string libraryDirectory, out List<Tuple<int, string, string, int, string>> games) private static bool GetGamesFromLibraryDirectory(string libraryDirectory, out List<Tuple<int, string, string, int, string>> games)
{ {
games = new(); games = new();
if (Program.Canceled) return false; if (Program.Canceled) return false;
@ -111,7 +111,6 @@ namespace CreamInstaller
} }
private readonly List<TreeNode> treeNodes = new(); private readonly List<TreeNode> treeNodes = new();
internal List<Task> RunningTasks = new(); internal List<Task> RunningTasks = new();
private void GetCreamApiApplicablePrograms(IProgress<int> progress) private void GetCreamApiApplicablePrograms(IProgress<int> progress)
@ -134,9 +133,9 @@ namespace CreamInstaller
int buildId = program.Item4; int buildId = program.Item4;
string directory = program.Item5; string directory = program.Item5;
if (Program.Canceled) return; 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; 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; if (name != "Arma 3" && Directory.Exists(directory + @"\BattlEye")) continue;
Task task = new(() => Task task = new(() =>
{ {
@ -156,8 +155,7 @@ namespace CreamInstaller
{ {
if (Program.Canceled) return; if (Program.Canceled) return;
string dlcName = null; string dlcName = null;
VProperty dlcAppInfo = null; if (SteamCMD.GetAppInfo(id, out VProperty dlcAppInfo)) dlcName = dlcAppInfo?.Value?["common"]?["name"]?.ToString();
if (SteamCMD.GetAppInfo(id, out dlcAppInfo)) dlcName = dlcAppInfo?.Value?["common"]?["name"]?.ToString();
if (Program.Canceled) return; if (Program.Canceled) return;
if (string.IsNullOrWhiteSpace(dlcName)) return; if (string.IsNullOrWhiteSpace(dlcName)) return;
dlc[id] = dlcName; dlc[id] = dlcName;
@ -243,7 +241,7 @@ namespace CreamInstaller
label2.Visible = true; label2.Visible = true;
progressBar1.Visible = true; progressBar1.Visible = true;
progressBar1.Value = 0; 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; bool setup = true;
int maxProgress = 0; int maxProgress = 0;
@ -284,7 +282,7 @@ namespace CreamInstaller
treeNode.Remove(); treeNode.Remove();
progressBar1.Value = 100; 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; label2.Visible = false;
progressBar1.Visible = false; progressBar1.Visible = false;
@ -397,7 +395,7 @@ namespace CreamInstaller
{ {
if (ProgramSelection.All.Count > 0) if (ProgramSelection.All.Count > 0)
{ {
foreach (ProgramSelection selection in ProgramSelection.AllSafe) foreach (ProgramSelection selection in ProgramSelection.AllSafeEnabled)
{ {
if (!Program.IsProgramRunningDialog(this, selection)) if (!Program.IsProgramRunningDialog(this, selection))
{ {
@ -417,7 +415,7 @@ namespace CreamInstaller
} }
int X = installForm.Location.X + installForm.Size.Width / 2 - Size.Width / 2; int X = installForm.Location.X + installForm.Size.Width / 2 - Size.Width / 2;
int Y = installForm.Location.Y + installForm.Size.Height / 2 - Size.Height / 2; int Y = installForm.Location.Y + installForm.Size.Height / 2 - Size.Height / 2;
Location = new Point(X, Y); Location = new(X, Y);
Show(); Show();
} }
else else

View file

@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Drawing; using System.Drawing;
using System.IO; using System.IO;
using System.IO.Compression;
using System.Reflection; using System.Reflection;
using System.Threading; using System.Threading;
using System.Windows.Forms; using System.Windows.Forms;
@ -28,7 +27,7 @@ namespace CreamInstaller
Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.EnableVisualStyles(); Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false); Application.SetCompatibleTextRenderingDefault(false);
Application.ApplicationExit += new EventHandler(OnApplicationExit); Application.ApplicationExit += new(OnApplicationExit);
retry: retry:
try try
{ {
@ -82,8 +81,6 @@ namespace CreamInstaller
public static List<ProgramSelection> ProgramSelections = new(); public static List<ProgramSelection> ProgramSelections = new();
public static bool Canceled = false; 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) public static void Cleanup(bool cancel = true)
{ {

View file

@ -13,14 +13,14 @@ namespace CreamInstaller
{ {
public static class SteamCMD public static class SteamCMD
{ {
public static string DirectoryPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\CreamInstaller"; public static readonly string DirectoryPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\CreamInstaller";
public static string FilePath = DirectoryPath + @"\steamcmd.exe"; public static readonly string FilePath = DirectoryPath + @"\steamcmd.exe";
public static string ArchivePath = DirectoryPath + @"\steamcmd.zip"; public static readonly string ArchivePath = DirectoryPath + @"\steamcmd.zip";
public static string DllPath = DirectoryPath + @"\steamclient.dll"; public static readonly string DllPath = DirectoryPath + @"\steamclient.dll";
public static string AppCachePath = DirectoryPath + @"\appcache"; public static readonly string AppCachePath = DirectoryPath + @"\appcache";
public static string AppCacheAppInfoPath = AppCachePath + @"\appinfo.vdf"; public static readonly string AppCacheAppInfoPath = AppCachePath + @"\appinfo.vdf";
public static string AppInfoPath = DirectoryPath + @"\appinfo"; public static readonly string AppInfoPath = DirectoryPath + @"\appinfo";
public static string AppInfoVersionPath = AppInfoPath + @"\version.txt"; public static readonly string AppInfoVersionPath = AppInfoPath + @"\version.txt";
public static bool Run(string command, out string output) public static bool Run(string command, out string output)
{ {