/// <summary> /// Checks if an update is available /// </summary> /// <returns>The latest or current version</returns> public async Task <Version> CheckForUpdatesAsync() { State = UpdaterState.CheckingForUpdates; int updateFiles = Directory.GetFiles(downloadPath).Length; if (File.Exists(versionFilePath) && updateFiles > 0) { string versionTxt = await File.ReadAllTextAsync(versionFilePath); latestVersion = Version.ConvertToVersion(versionTxt); if (latestVersion > currentVersion) { if (File.Exists(changelogFilePath)) { UpdateAvailable?.Invoke(this, new VersionEventArgs(currentVersion, latestVersion, true, File.ReadAllText(changelogFilePath))); } else { UpdateAvailable?.Invoke(this, new VersionEventArgs(currentVersion, latestVersion, true)); } State = UpdaterState.Idle; return(latestVersion); } } else { try { var releases = await gitHubClient.Repository.Release.GetAll(GitHubUsername, GitHubRepositoryName); Release release = releases.FirstOrDefault(x => Version.ConvertToVersion(x.TagName.Replace("v", "")) > currentVersion); if (release is null) { return(currentVersion); } latestRelease = release; latestVersion = Version.ConvertToVersion(latestRelease.TagName.Replace("v", "")); changelog = latestRelease.Body; UpdateAvailable?.Invoke(this, new VersionEventArgs(currentVersion, latestVersion, false, latestRelease.Body)); State = UpdaterState.Idle; return(latestVersion); } catch (Exception) { throw; } } State = UpdaterState.Idle; return(currentVersion); }
/// <summary> /// Initializes a new instance of the updater /// </summary> /// <param name="gitHubUsername">The GitHub username</param> /// <param name="gitHubRepositoryName">The GitHub repository name</param> /// <param name="token">The GitHub personal access token</param> public Updater(string gitHubUsername, string gitHubRepositoryName, string token) { GitHubUsername = gitHubUsername; GitHubRepositoryName = gitHubRepositoryName; string appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); string mainProjectName = Assembly.GetEntryAssembly().GetName().Name; string appDataPath = $@"{appData}\{mainProjectName}"; downloadPath = $@"{appDataPath}\Download"; updatePath = $@"{appDataPath}\Update"; batFilePath = $@"{appDataPath}\InstallUpdate.bat"; if (!Directory.Exists(appDataPath)) { Directory.CreateDirectory(appDataPath); } if (!Directory.Exists(downloadPath)) { Directory.CreateDirectory(downloadPath); } if (!Directory.Exists(updatePath)) { Directory.CreateDirectory(updatePath); } if (File.Exists(batFilePath) && !string.Equals(File.ReadAllText(batFilePath), Resources.InstallUpdate) || !File.Exists(batFilePath)) { File.WriteAllText(batFilePath, Resources.InstallUpdate); } try { gitHubClient = new GitHubClient(new ProductHeaderValue(mainProjectName)) { Credentials = new Credentials(token) }; webClient = new WebClient(); webClient.DownloadFileCompleted += WebClient_DownloadFileCompleted; webClient.DownloadProgressChanged += WebClient_DownloadProgressChanged; } catch (Exception) { throw; } originalFilePath = Process.GetCurrentProcess().MainModule.FileName; changelogFilePath = $@"{downloadPath}\Update.changelog"; versionFilePath = $@"{downloadPath}\Update.version"; currentVersion = Version.ConvertToVersion(Assembly.GetEntryAssembly().GetName().Version.ToString(), true); }
/// <summary> /// Initializes a new instance of the updater /// </summary> /// <param name="gitHubUsername">The GitHub username</param> /// <param name="gitHubRepositoryName">The GitHub repository name</param> /// <param name="token">The GitHub personal access token</param> /// <param name="currentVersion">The current version of the application</param> public Updater(string gitHubUsername, string gitHubRepositoryName, string token, string currentVersion) : this(gitHubUsername, gitHubRepositoryName, token) { this.currentVersion = Version.ConvertToVersion(currentVersion, true); }