using Newtonsoft.Json; using Newtonsoft.Json.Converters; using System.Reflection; namespace ModpackUpdater; public class AppUpdater { private class UpdateInfo { [JsonConverter(typeof(VersionConverter))] public Version Version { get; set; } public string DownloadUrl { get; set; } } private const string UPDATE_URL = "https://git.pilzinsel64.de/gaming/minecraft/minecraft-modpack-updater/-/snippets/3/raw/main/updates.json"; private readonly HttpClient httpClient = new(); private UpdateInfo info; public async Task Check() { var hasUpdate = false; try { var appVersion = Assembly.GetExecutingAssembly().GetName().Version; string result = await httpClient.GetStringAsync(UPDATE_URL); info = JsonConvert.DeserializeObject(result); if (info is not null && info.Version > appVersion) hasUpdate = true; } catch { } return hasUpdate; } public async Task Install() { var client = new HttpClient(); var tempFileName = Path.GetTempFileName(); var appFileName = Pilz.IO.Extensions.GetExecutablePath(); var oldFileName = appFileName + ".old"; // Delete old file try { File.Delete(oldFileName); } catch { } // Download the new file using (var tempFileStream = new FileStream(tempFileName, FileMode.Create, FileAccess.ReadWrite)) { Stream downloadStream = null; try { downloadStream = await client.GetStreamAsync(info.DownloadUrl); await downloadStream.CopyToAsync(tempFileStream); } catch { } finally { downloadStream?.Dispose(); } } // Replace current application file with new file File.Move(appFileName, oldFileName, true); File.Move(tempFileName, appFileName); } }