private void checkLatestVersion() { NetHelper.Request($"https://api.github.com/repos/{Program.Repository}/releases?per_page=10&page=1", "cache/net/releases", 15 * 60, (response, exception) => { if (IsDisposed) { return; } if (exception != null) { handleLastestVersionException(exception); return; } try { var hasLatest = false; var latestVersion = Program.Version; var description = ""; var downloadUrl = (string)null; var releases = TinyToken.ReadString <JsonFormat>(response); foreach (var release in releases.Values <TinyObject>()) { var isDraft = release.Value <bool>("draft"); var isPrerelease = release.Value <bool>("prerelease"); if (isDraft || isPrerelease) { continue; } var name = release.Value <string>("name"); var version = new Version(name); if (!hasLatest) { hasLatest = true; latestVersion = version; foreach (var asset in release.Values <TinyObject>("assets")) { var downloadName = asset.Value <string>("name"); if (downloadName.EndsWith(".zip")) { downloadUrl = asset.Value <string>("browser_download_url"); break; } } } if (Program.Version < version || Program.Version >= latestVersion) { var publishedAt = release.Value <string>("published_at"); var publishDate = DateTime.ParseExact(publishedAt, @"yyyy-MM-dd\THH:mm:ss\Z", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); var authorName = release.Value <string>("author", "login"); var body = release.Value <string>("body"); if (body.Contains("---")) { body = body.Substring(0, body.IndexOf("---")); } body = body.Replace("\r\n", "\n").Trim(' ', '\n'); body = $"v{version} - {authorName}, {publishDate.ToTimeAgo()}\n{body}\n\n"; var newDescription = description + body; if (description.Length > 0 && newDescription.Count(c => c == '\n') > 35) { break; } description = newDescription; } else { break; } } if (Program.Version < latestVersion) { updateButton.Text = $"Version {latestVersion} available!"; updateButton.Tooltip = $"What's new:\n\n{description.TrimEnd('\n')}"; updateButton.OnClick += (sender, e) => { if (downloadUrl != null && latestVersion >= new Version(1, 4)) { Manager.Add(new UpdateMenu(downloadUrl)); } else { Updater.OpenLastestReleasePage(); } }; updateButton.StyleName = ""; updateButton.Disabled = false; } else { versionLabel.Tooltip = $"Recent changes:\n\n{description.TrimEnd('\n')}"; updateButton.Displayed = false; } bottomLayout.Pack(600); } catch (Exception e) { handleLastestVersionException(e); } }); }