using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using PluginManager.Interfaces.Updater; namespace PluginManager.Updater.Application { public class AppUpdater { private static readonly string _DefaultUpdateUrl = "https://github.com/andreitdr/SethDiscordBot/releases/latest"; private async Task GetOnlineVersion() { HttpClient client = new HttpClient(); var response = await client.GetAsync("https://github.com/andreitdr/SethDiscordBot/releases/latest"); if (response.IsSuccessStatusCode) { var content = await response.Content.ReadAsStringAsync(); var version = Regex.Match(content, @".+?v(\d+\.\d+\.\d+.\d+).+?").Groups[1].Value; return new AppVersion(version); } return AppVersion.CurrentAppVersion; } public async Task CheckForUpdates() { var latestVersion = await GetOnlineVersion(); if(latestVersion.IsNewerThan(AppVersion.CurrentAppVersion)) { return new Update(AppVersion.CurrentAppVersion, latestVersion, _DefaultUpdateUrl, await GetUpdateNotes()); } return Update.None; } private async Task GetUpdateNotes() { HttpClient client = new HttpClient(); var response = await client.GetAsync("https://github.com/andreitdr/SethDiscordBot/releases/latest"); if (!response.IsSuccessStatusCode) { return string.Empty; } var content = await response.Content.ReadAsStringAsync(); var markdownStart = content.IndexOf("
", markdownStart) + 1; // Move past the opening tag var markdownEnd = content.IndexOf("
", markdownStart); var markdown = content.Substring(markdownStart, markdownEnd - markdownStart).Trim(); markdown = RemoveHtmlTags(markdown); markdown = ApplyMarkdownFormatting(markdown); return markdown; } private string RemoveHtmlTags(string text) { return Regex.Replace(text, "<.*?>", "").Trim(); } private string ApplyMarkdownFormatting(string markdown) { // Apply markdown formatting markdown = markdown.Replace("**", "**"); // Bold markdown = markdown.Replace("*", "*"); // Italic markdown = markdown.Replace("`", "`"); // Inline code markdown = markdown.Replace("```", "```"); // Code block markdown = markdown.Replace(">", ">"); // Greater than symbol markdown = markdown.Replace("<", "<"); // Less than symbol markdown = markdown.Replace("&", "&"); // Ampersand markdown = markdown.Replace(""", "\""); // Double quote markdown = markdown.Replace("'", "'"); // Single quote markdown = markdown.Replace(" - ", "\n- "); // Convert bullet points to markdown list items return markdown; } } }