UpdateChecker.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System.Globalization;
  2. using System.Net;
  3. using System.Net.Http;
  4. using System.Text.Json;
  5. using System.Threading.Tasks;
  6. namespace PixiEditor.UpdateModule
  7. {
  8. public class UpdateChecker
  9. {
  10. private const string ReleaseApiUrl = "https://api.github.com/repos/PixiEditor/PixiEditor/releases/latest";
  11. public UpdateChecker(string currentVersionTag)
  12. {
  13. CurrentVersionTag = currentVersionTag;
  14. }
  15. public ReleaseInfo LatestReleaseInfo { get; private set; }
  16. private string CurrentVersionTag { get; }
  17. /// <summary>
  18. /// Compares version strings and returns true if newVer > originalVer.
  19. /// </summary>
  20. /// <param name="originalVer" />
  21. /// <param name="newVer"></param>
  22. /// <returns></returns>
  23. public static bool VersionBigger(string originalVer, string newVer)
  24. {
  25. if (!ParseVersionString(originalVer, out float ver1))
  26. {
  27. return false;
  28. }
  29. if (ParseVersionString(newVer, out float ver2))
  30. {
  31. return ver2 > ver1;
  32. }
  33. return false;
  34. }
  35. public async Task<bool> CheckUpdateAvailable()
  36. {
  37. LatestReleaseInfo = await GetLatestReleaseInfo_Async();
  38. return CheckUpdateAvailable(LatestReleaseInfo);
  39. }
  40. public bool CheckUpdateAvailable(ReleaseInfo latestRelease)
  41. {
  42. return latestRelease.WasDataFetchSuccessful && VersionBigger(CurrentVersionTag, latestRelease.TagName);
  43. }
  44. private static async Task<ReleaseInfo> GetLatestReleaseInfo_Async()
  45. {
  46. using (HttpClient client = new HttpClient())
  47. {
  48. client.DefaultRequestHeaders.Add("User-Agent", "PixiEditor");
  49. HttpResponseMessage response = await client.GetAsync(ReleaseApiUrl);
  50. if (response.StatusCode == HttpStatusCode.OK)
  51. {
  52. string content = await response.Content.ReadAsStringAsync();
  53. return JsonSerializer.Deserialize<ReleaseInfo>(content);
  54. }
  55. }
  56. return new ReleaseInfo(false);
  57. }
  58. private static bool ParseVersionString(string versionString, out float version)
  59. {
  60. return float.TryParse(versionString.Replace(".", string.Empty).Insert(1, "."), NumberStyles.Any, CultureInfo.InvariantCulture, out version);
  61. }
  62. }
  63. }