using GCMM.Properties; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO.Compression; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace GCMM { partial class MainForm { public bool? CheckIfPatched() { if (!File.Exists(Settings.Default.GamePath + @"\IPA.exe")) { status.Text = "Status: Patcher missing\nClicking Play will install it"; return null; } string nopatch = "Status: Unpatched\nClicking Play patches it"; if (!Directory.Exists(Settings.Default.GamePath + @"\IPA\Backups\Gamecraft")) { status.Text = nopatch; return false; } string backup = Directory.EnumerateDirectories(Settings.Default.GamePath + @"\IPA\Backups\Gamecraft").OrderByDescending(s => s).FirstOrDefault(); if (backup == null) { status.Text = nopatch; return false; } if (File.GetLastWriteTime(Settings.Default.GamePath + @"\Gamecraft_Data\Managed\Assembly-CSharp.dll") > //If the file was updated at least 2 minutes after patching Directory.GetLastWriteTime(backup).AddMinutes(2)) { status.Text = nopatch; return false; } status.Text = "Status: Patched"; return true; } public async void PatchGame() { if (!CheckIfPatched().HasValue) { if (MessageBox.Show("The patcher (GCIPA) is not found. It will be downloaded from https://git.exmods.org/modtainers/GCIPA/releases and ran to patch the game.", "Patcher download needed", MessageBoxButtons.OKCancel) == DialogResult.Cancel) return; string releases = "/api/v1/repos/modtainers/GCIPA/releases"; string url; this.status.Text = "Status: Patching..."; using (WebClient client = GetClient()) { url = JArray.Parse(await client.DownloadStringTaskAsync(releases)).First["assets"].First["browser_download_url"].ToString(); await client.DownloadFileTaskAsync(url, "IPA.zip"); ZipFile.ExtractToDirectory("IPA.zip", Settings.Default.GamePath); } } bool? status = CheckIfPatched(); if (!status.HasValue) //Make sure it actually worked return; if (!status.Value) { var psi = new ProcessStartInfo(Settings.Default.GamePath + @"\IPA.exe", "Gamecraft.exe --nowait"); psi.UseShellExecute = false; psi.RedirectStandardError = true; psi.RedirectStandardOutput = true; psi.WorkingDirectory = Settings.Default.GamePath; psi.CreateNoWindow = true; var process = Process.Start(psi); process.BeginErrorReadLine(); process.BeginOutputReadLine(); process.EnableRaisingEvents = true; modinfobox.Text = ""; DataReceivedEventHandler onoutput = (sender, e) => { Invoke((Action)(() => modinfobox.Text += e.Data + Environment.NewLine)); }; process.OutputDataReceived += onoutput; process.ErrorDataReceived += onoutput; process.Exited += CheckStartGame; } else CheckStartGame(null, null); } } }