diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj index a414a6ddb..688c9aad9 100644 --- a/Artemis/Artemis/Artemis.csproj +++ b/Artemis/Artemis/Artemis.csproj @@ -325,6 +325,7 @@ + diff --git a/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueViewModel.cs b/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueViewModel.cs index 1b05445cd..c7b9787e3 100644 --- a/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueViewModel.cs +++ b/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueViewModel.cs @@ -1,6 +1,7 @@ using Artemis.Managers; using Artemis.Models; using Artemis.Settings; +using Artemis.Utilities; using Artemis.Utilities.Memory; using Caliburn.Micro; using Newtonsoft.Json; @@ -62,7 +63,7 @@ namespace Artemis.Modules.Games.RocketLeague return; } - MemoryHelpers.GetPointers(); + Updater.GetPointers(); var version = JsonConvert .DeserializeObject(Offsets.Default.RocketLeague) .GameVersion; diff --git a/Artemis/Artemis/Utilities/Memory/MemoryHelpers.cs b/Artemis/Artemis/Utilities/Memory/MemoryHelpers.cs index 61df97f21..a36f3eb9c 100644 --- a/Artemis/Artemis/Utilities/Memory/MemoryHelpers.cs +++ b/Artemis/Artemis/Utilities/Memory/MemoryHelpers.cs @@ -43,35 +43,5 @@ namespace Artemis.Utilities.Memory } return address; } - - public static void GetPointers() - { - if (!General.Default.EnablePointersUpdate) - return; - - try - { - var jsonClient = new WebClient(); - // Random number to get around cache issues - var rand = new Random(DateTime.Now.Millisecond); - var json = - jsonClient.DownloadString( - "https://raw.githubusercontent.com/SpoinkyNL/Artemis/master/pointers.json?random=" + rand.Next()); - - // Get a list of pointers - var pointers = JsonConvert.DeserializeObject>(json); - // Assign each pointer to the settings file - var rlPointers = JsonConvert.SerializeObject(pointers.FirstOrDefault(p => p.Game == "RocketLeague")); - if (rlPointers != null) - { - Offsets.Default.RocketLeague = rlPointers; - Offsets.Default.Save(); - } - } - catch (Exception) - { - // ignored - } - } } } \ No newline at end of file diff --git a/Artemis/Artemis/Utilities/Updater.cs b/Artemis/Artemis/Utilities/Updater.cs new file mode 100644 index 000000000..ba1585175 --- /dev/null +++ b/Artemis/Artemis/Utilities/Updater.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net; +using System.Windows.Forms; +using Artemis.Models; +using Artemis.Settings; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Artemis.Utilities +{ + public static class Updater + { + public static int CurrentVersion = 100; + + public static void CheckForUpdate() + { + var newRelease = IsUpdateAvailable(); + if (newRelease == null) + return; + + var viewUpdate = + MessageBox.Show( + $"A new version of Artemis is available, version {newRelease["tag_name"].Value()}.\n" + + "Do you wish to view the update on GitHub now?\n\n" + + "Note: You can disable update notifications in the settings menu", "Artemis - Update available", + MessageBoxButtons.YesNo, MessageBoxIcon.Information); + if (viewUpdate == DialogResult.Yes) + Process.Start(new ProcessStartInfo(newRelease["html_url"].Value())); + } + + public static JObject IsUpdateAvailable() + { + if (!General.Default.EnablePointersUpdate) + return null; + + try + { + var jsonClient = new WebClient(); + + // GitHub trips if we don't add a user agent + jsonClient.Headers.Add("user-agent", + "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); + + // Random number to get around cache issues + var rand = new Random(DateTime.Now.Millisecond); + var json = + jsonClient.DownloadString("https://api.github.com/repos/SpoinkyNL/Artemis/releases/latest?random=" + + rand.Next()); + + // Get a list of pointers + var release = JsonConvert.DeserializeObject(json); + + // Parse a version number string to an int + var remoteVersion = int.Parse(release["tag_name"].Value().Replace(".", "")); + + return remoteVersion > CurrentVersion ? release : null; + } + catch (Exception) + { + return null; + } + } + + public static void GetPointers() + { + if (!General.Default.EnablePointersUpdate) + return; + + try + { + var jsonClient = new WebClient(); + + // Random number to get around cache issues + var rand = new Random(DateTime.Now.Millisecond); + var json = + jsonClient.DownloadString( + "https://raw.githubusercontent.com/SpoinkyNL/Artemis/master/pointers.json?random=" + rand.Next()); + + // Get a list of pointers + var pointers = JsonConvert.DeserializeObject>(json); + // Assign each pointer to the settings file + var rlPointers = JsonConvert.SerializeObject(pointers.FirstOrDefault(p => p.Game == "RocketLeague")); + if (rlPointers != null) + { + Offsets.Default.RocketLeague = rlPointers; + Offsets.Default.Save(); + } + } + catch (Exception) + { + // ignored + } + } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/ViewModels/SystemTrayViewModel.cs b/Artemis/Artemis/ViewModels/SystemTrayViewModel.cs index 426754abb..25b25a4c2 100644 --- a/Artemis/Artemis/ViewModels/SystemTrayViewModel.cs +++ b/Artemis/Artemis/ViewModels/SystemTrayViewModel.cs @@ -1,7 +1,13 @@ using System; -using System.Windows; +using System.Diagnostics; +using System.Threading.Tasks; +using System.Windows.Forms; using Artemis.Events; +using Artemis.Utilities; using Caliburn.Micro; +using Newtonsoft.Json.Linq; +using Application = System.Windows.Application; +using Screen = Caliburn.Micro.Screen; namespace Artemis.ViewModels { @@ -10,6 +16,7 @@ namespace Artemis.ViewModels private readonly ShellViewModel _shellViewModel; private readonly IWindowManager _windowManager; + private bool _checkedForUpdate; private bool _enabled; private string _toggleText; /* @@ -27,6 +34,7 @@ namespace Artemis.ViewModels _shellViewModel = shellViewModel; _shellViewModel.MainManager.Events.Subscribe(this); _shellViewModel.MainManager.EnableProgram(); + _checkedForUpdate = false; // TODO: Check if show on startup is enabled, if so, show window. } @@ -85,6 +93,13 @@ namespace Artemis.ViewModels if (!CanShowWindow) return; + if (!_checkedForUpdate) + { + _checkedForUpdate = true; + var updateTask = new Task(Updater.CheckForUpdate); + updateTask.Start(); + } + // manually show the next window view-model _windowManager.ShowWindow(_shellViewModel); @@ -92,6 +107,7 @@ namespace Artemis.ViewModels NotifyOfPropertyChange(() => CanHideWindow); } + public void HideWindow() { if (!CanHideWindow)