diff --git a/OF DL/Entities/LatestReleaseAPIResponse.cs b/OF DL/Entities/LatestReleaseAPIResponse.cs new file mode 100644 index 0000000..1081765 --- /dev/null +++ b/OF DL/Entities/LatestReleaseAPIResponse.cs @@ -0,0 +1,9 @@ +using Newtonsoft.Json; + +namespace OF_DL.Entities; + +public class LatestReleaseAPIResponse +{ + [JsonProperty(PropertyName = "tag_name")] + public string TagName { get; set; } = ""; +} diff --git a/OF DL/Helpers/VersionHelper.cs b/OF DL/Helpers/VersionHelper.cs new file mode 100644 index 0000000..c21d835 --- /dev/null +++ b/OF DL/Helpers/VersionHelper.cs @@ -0,0 +1,52 @@ +using Newtonsoft.Json; +using OF_DL.Entities; +using Serilog; + +namespace OF_DL.Helpers; + +public static class VersionHelper +{ + public static string? GetLatestReleaseTag() + { + Log.Debug("Calling GetLatestReleaseTag"); + try + { + HttpClient client = new(); + HttpRequestMessage request = new(HttpMethod.Get, "https://git.ofdl.tools/api/v1/repos/sim0n00ps/OF-DL/releases/latest"); + using var response = client.Send(request); + + if (!response.IsSuccessStatusCode) + { + Log.Debug("GetLatestReleaseTag did not return a Success Status Code"); + return null; + } + + var body = response.Content.ReadAsStringAsync().Result; + + Log.Debug("GetLatestReleaseTag API Response: "); + Log.Debug(body); + + var versionCheckResponse = JsonConvert.DeserializeObject(body); + + if (versionCheckResponse == null || versionCheckResponse.TagName == "") + { + Log.Debug("GetLatestReleaseTag did not return a valid tag name"); + return null; + } + + return versionCheckResponse.TagName; + } + catch (Exception ex) + { + Console.WriteLine("Exception caught: {0}\n\nStackTrace: {1}", ex.Message, ex.StackTrace); + Log.Error("Exception caught: {0}\n\nStackTrace: {1}", ex.Message, ex.StackTrace); + if (ex.InnerException != null) + { + Console.WriteLine("\nInner Exception:"); + Console.WriteLine("Exception caught: {0}\n\nStackTrace: {1}", ex.InnerException.Message, ex.InnerException.StackTrace); + Log.Error("Inner Exception: {0}\n\nStackTrace: {1}", ex.InnerException.Message, ex.InnerException.StackTrace); + } + } + return null; + } +} diff --git a/OF DL/OF DL.csproj b/OF DL/OF DL.csproj index 8b35a6e..20dc207 100644 --- a/OF DL/OF DL.csproj +++ b/OF DL/OF DL.csproj @@ -19,7 +19,6 @@ - diff --git a/OF DL/Program.cs b/OF DL/Program.cs index 14b8820..67580f7 100644 --- a/OF DL/Program.cs +++ b/OF DL/Program.cs @@ -9,7 +9,6 @@ using OF_DL.Entities.Streams; using OF_DL.Enumerations; using OF_DL.Enumurations; using OF_DL.Helpers; -using Octokit; using Serilog; using Serilog.Core; using Serilog.Events; @@ -515,14 +514,54 @@ public class Program } } - #if !DEBUG + try + { + // Only run the version check if not in DEBUG mode + #if !DEBUG Version localVersion = Assembly.GetEntryAssembly()?.GetName().Version; //Only tested with numeric values. + String? latestReleaseTag = VersionHelper.GetLatestReleaseTag(); + + if (latestReleaseTag == null) + { + AnsiConsole.Markup("[yellow]Failed to verify that OF-DL is up-to-date.\n[/]"); + Log.Error("Failed to get the latest release tag."); + } + else + { + Version latestGiteaRelease = new Version(latestReleaseTag.Replace("OFDLV", "")); + + // Compare the Versions + int versionComparison = localVersion.CompareTo(latestGiteaRelease); + if (versionComparison < 0) + { + // The version on GitHub is more up to date than this local release. + AnsiConsole.Markup("[red]You are running OF-DL version " + $"{localVersion.Major}.{localVersion.Minor}.{localVersion.Build}\n[/]"); + AnsiConsole.Markup("[red]Please update to the current release, " + $"{latestGiteaRelease.Major}.{latestGiteaRelease.Minor}.{latestGiteaRelease.Build}: [link]https://git.ofdl.tools/sim0n00ps/OF-DL/releases[/]\n[/]"); + Log.Debug("Detected outdated client running version " + $"{localVersion.Major}.{localVersion.Minor}.{localVersion.Build}"); + Log.Debug("Latest release version " + $"{latestGiteaRelease.Major}.{latestGiteaRelease.Minor}.{latestGiteaRelease.Build}"); + } + else + { + // This local version is greater than the release version on GitHub. + AnsiConsole.Markup("[green]You are running OF-DL version " + $"{localVersion.Major}.{localVersion.Minor}.{localVersion.Build}\n[/]"); + AnsiConsole.Markup("[green]Latest Release version: " + $"{latestGiteaRelease.Major}.{latestGiteaRelease.Minor}.{latestGiteaRelease.Build}\n[/]"); + Log.Debug("Detected client running version " + $"{localVersion.Major}.{localVersion.Minor}.{localVersion.Build}"); + Log.Debug("Latest release version " + $"{latestGiteaRelease.Major}.{latestGiteaRelease.Minor}.{latestGiteaRelease.Build}"); + } + } + + #else + AnsiConsole.Markup("[yellow]Running in Debug/Local mode. Version check skipped.\n[/]"); + Log.Debug("Running in Debug/Local mode. Version check skipped."); + #endif + } + catch (Exception e) + { + AnsiConsole.Markup("[red]Error checking latest release on GitHub:\n[/]"); + Console.WriteLine(e); + Log.Error("Error checking latest release on GitHub.", e.Message); + } - AnsiConsole.Markup("[red]You are running OF-DL version " + $"{localVersion.Major}.{localVersion.Minor}.{localVersion.Build}\n[/]"); - #else - AnsiConsole.Markup("[yellow]Running in Debug/Local mode. Version check skipped.\n[/]"); - Log.Debug("Running in Debug/Local mode. Version check skipped."); - #endif if (File.Exists("auth.json")) {