1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00

Implemented update check

This commit is contained in:
SpoinkyNL 2016-02-29 00:29:05 +01:00
parent 426ebac079
commit 3aa53750f6
6 changed files with 277 additions and 191 deletions

View File

@ -325,6 +325,7 @@
<Compile Include="Utilities\Keyboard\Key.cs" /> <Compile Include="Utilities\Keyboard\Key.cs" />
<Compile Include="Utilities\Keyboard\KeyboardRectangle.cs" /> <Compile Include="Utilities\Keyboard\KeyboardRectangle.cs" />
<Compile Include="Utilities\ShellLink.cs" /> <Compile Include="Utilities\ShellLink.cs" />
<Compile Include="Utilities\Updater.cs" />
<Compile Include="ViewModels\Abstract\EffectViewModel.cs" /> <Compile Include="ViewModels\Abstract\EffectViewModel.cs" />
<Compile Include="ViewModels\EffectsViewModel.cs" /> <Compile Include="ViewModels\EffectsViewModel.cs" />
<Compile Include="Modules\Effects\AudioVisualizer\AudioVisualizerViewModel.cs" /> <Compile Include="Modules\Effects\AudioVisualizer\AudioVisualizerViewModel.cs" />

View File

@ -1,161 +1,161 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Settings; using Artemis.Settings;
using Artemis.Utilities; using Artemis.Utilities;
using Artemis.Utilities.Keyboard; using Artemis.Utilities.Keyboard;
using Artemis.Utilities.Memory; using Artemis.Utilities.Memory;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace Artemis.Modules.Games.RocketLeague namespace Artemis.Modules.Games.RocketLeague
{ {
public class RocketLeagueModel : GameModel public class RocketLeagueModel : GameModel
{ {
private int _boostAmount; private int _boostAmount;
private bool _boostGrowing; private bool _boostGrowing;
private KeyboardRectangle _boostRect; private KeyboardRectangle _boostRect;
private Memory _memory; private Memory _memory;
private GamePointersCollectionModel _pointer; private GamePointersCollectionModel _pointer;
private int _previousBoost; private int _previousBoost;
public RocketLeagueModel(MainManager mainManager, RocketLeagueSettings settings) : base(mainManager) public RocketLeagueModel(MainManager mainManager, RocketLeagueSettings settings) : base(mainManager)
{ {
Settings = settings; Settings = settings;
Name = "RocketLeague"; Name = "RocketLeague";
ProcessName = "RocketLeague"; ProcessName = "RocketLeague";
Scale = 4; Scale = 4;
Enabled = Settings.Enabled; Enabled = Settings.Enabled;
Initialized = false; Initialized = false;
ContextualColor = Settings.ContextualColor; ContextualColor = Settings.ContextualColor;
} }
public RocketLeagueSettings Settings { get; set; } public RocketLeagueSettings Settings { get; set; }
public int Scale { get; set; } public int Scale { get; set; }
public bool ContextualColor { get; set; } public bool ContextualColor { get; set; }
public override void Dispose() public override void Dispose()
{ {
Initialized = false; Initialized = false;
_memory = null; _memory = null;
} }
public override void Enable() public override void Enable()
{ {
Initialized = false; Initialized = false;
_boostRect = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0, 0, new List<Color> _boostRect = new KeyboardRectangle(MainManager.KeyboardManager.ActiveKeyboard, 0, 0, new List<Color>
{
ColorHelpers.ToDrawingColor(Settings.MainColor),
ColorHelpers.ToDrawingColor(Settings.SecondaryColor)
}, LinearGradientMode.Horizontal);
MemoryHelpers.GetPointers();
_pointer = JsonConvert.DeserializeObject<GamePointersCollectionModel>(Offsets.Default.RocketLeague);
var tempProcess = MemoryHelpers.GetProcessIfRunning(ProcessName);
_memory = new Memory(tempProcess);
Initialized = true;
}
public override void Update()
{
if (_boostGrowing)
return;
if (_memory == null)
return;
var offsets = _pointer.GameAddresses.First(ga => ga.Description == "Boost").ToString();
var boostAddress = _memory.GetAddress("\"RocketLeague.exe\"" + offsets);
var boostFloat = _memory.ReadFloat(boostAddress)*100/3;
_previousBoost = _boostAmount;
_boostAmount = (int) Math.Ceiling(boostFloat);
// Take care of any reading errors resulting in an OutOfMemory on draw
if (_boostAmount < 0)
_boostAmount = 0;
if (_boostAmount > 100)
_boostAmount = 100;
_boostRect.Width =
(int) Math.Ceiling(MainManager.KeyboardManager.ActiveKeyboard.Width*Scale/100.00*_boostAmount);
if (ContextualColor)
{
if(_boostAmount < 33)
_boostRect.Colors = new List<Color>{ Color.Red };
else if(_boostAmount >= 33 && _boostAmount < 66)
_boostRect.Colors = new List<Color> { Color.Yellow };
else if(_boostAmount >= 66)
_boostRect.Colors = new List<Color> { Color.Lime };
}
else
{ {
_boostRect.Colors = new List<Color> ColorHelpers.ToDrawingColor(Settings.MainColor),
{ ColorHelpers.ToDrawingColor(Settings.SecondaryColor)
ColorHelpers.ToDrawingColor(Settings.MainColor), }, LinearGradientMode.Horizontal);
ColorHelpers.ToDrawingColor(Settings.SecondaryColor)
}; Updater.GetPointers();
} _pointer = JsonConvert.DeserializeObject<GamePointersCollectionModel>(Offsets.Default.RocketLeague);
var tempProcess = MemoryHelpers.GetProcessIfRunning(ProcessName);
Task.Run(() => GrowIfHigher()); _memory = new Memory(tempProcess);
}
Initialized = true;
private void GrowIfHigher() }
{
if (_boostAmount <= _previousBoost || _boostGrowing) public override void Update()
return; {
if (_boostGrowing)
_boostGrowing = true; return;
const int amountOfSteps = 6; if (_memory == null)
return;
var difference = _boostAmount - _previousBoost;
var differenceStep = difference/amountOfSteps; var offsets = _pointer.GameAddresses.First(ga => ga.Description == "Boost").ToString();
var differenceStepRest = difference%amountOfSteps; var boostAddress = _memory.GetAddress("\"RocketLeague.exe\"" + offsets);
_boostAmount = _previousBoost; var boostFloat = _memory.ReadFloat(boostAddress)*100/3;
_boostRect.Width =
(int) Math.Ceiling(MainManager.KeyboardManager.ActiveKeyboard.Width*Scale/100.00*_boostAmount); _previousBoost = _boostAmount;
_boostAmount = (int) Math.Ceiling(boostFloat);
for (var i = 0; i < amountOfSteps; i++)
{ // Take care of any reading errors resulting in an OutOfMemory on draw
if (differenceStepRest > 0) if (_boostAmount < 0)
{ _boostAmount = 0;
differenceStepRest -= 1; if (_boostAmount > 100)
_boostAmount += 1; _boostAmount = 100;
_boostRect.Width =
(int) Math.Ceiling(MainManager.KeyboardManager.ActiveKeyboard.Width*Scale/100.00*_boostAmount); _boostRect.Width =
} (int) Math.Ceiling(MainManager.KeyboardManager.ActiveKeyboard.Width*Scale/100.00*_boostAmount);
_boostAmount += differenceStep;
_boostRect.Width = if (ContextualColor)
(int) Math.Ceiling(MainManager.KeyboardManager.ActiveKeyboard.Width*Scale/100.00*_boostAmount); {
if(_boostAmount < 33)
Thread.Sleep(50); _boostRect.Colors = new List<Color>{ Color.Red };
} else if(_boostAmount >= 33 && _boostAmount < 66)
_boostRect.Colors = new List<Color> { Color.Yellow };
_boostGrowing = false; else if(_boostAmount >= 66)
} _boostRect.Colors = new List<Color> { Color.Lime };
}
public override Bitmap GenerateBitmap() else
{ {
var bitmap = MainManager.KeyboardManager.ActiveKeyboard.KeyboardBitmap(Scale); _boostRect.Colors = new List<Color>
if (_boostRect == null) {
return null; ColorHelpers.ToDrawingColor(Settings.MainColor),
ColorHelpers.ToDrawingColor(Settings.SecondaryColor)
using (var g = Graphics.FromImage(bitmap)) };
{ }
g.Clear(Color.Transparent);
_boostRect.Draw(g);
} Task.Run(() => GrowIfHigher());
return bitmap; }
}
} private void GrowIfHigher()
{
if (_boostAmount <= _previousBoost || _boostGrowing)
return;
_boostGrowing = true;
const int amountOfSteps = 6;
var difference = _boostAmount - _previousBoost;
var differenceStep = difference/amountOfSteps;
var differenceStepRest = difference%amountOfSteps;
_boostAmount = _previousBoost;
_boostRect.Width =
(int) Math.Ceiling(MainManager.KeyboardManager.ActiveKeyboard.Width*Scale/100.00*_boostAmount);
for (var i = 0; i < amountOfSteps; i++)
{
if (differenceStepRest > 0)
{
differenceStepRest -= 1;
_boostAmount += 1;
_boostRect.Width =
(int) Math.Ceiling(MainManager.KeyboardManager.ActiveKeyboard.Width*Scale/100.00*_boostAmount);
}
_boostAmount += differenceStep;
_boostRect.Width =
(int) Math.Ceiling(MainManager.KeyboardManager.ActiveKeyboard.Width*Scale/100.00*_boostAmount);
Thread.Sleep(50);
}
_boostGrowing = false;
}
public override Bitmap GenerateBitmap()
{
var bitmap = MainManager.KeyboardManager.ActiveKeyboard.KeyboardBitmap(Scale);
if (_boostRect == null)
return null;
using (var g = Graphics.FromImage(bitmap))
{
g.Clear(Color.Transparent);
_boostRect.Draw(g);
}
return bitmap;
}
}
} }

View File

@ -1,6 +1,7 @@
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Settings; using Artemis.Settings;
using Artemis.Utilities;
using Artemis.Utilities.Memory; using Artemis.Utilities.Memory;
using Caliburn.Micro; using Caliburn.Micro;
using Newtonsoft.Json; using Newtonsoft.Json;
@ -62,7 +63,7 @@ namespace Artemis.Modules.Games.RocketLeague
return; return;
} }
MemoryHelpers.GetPointers(); Updater.GetPointers();
var version = JsonConvert var version = JsonConvert
.DeserializeObject<GamePointersCollectionModel>(Offsets.Default.RocketLeague) .DeserializeObject<GamePointersCollectionModel>(Offsets.Default.RocketLeague)
.GameVersion; .GameVersion;

View File

@ -43,35 +43,5 @@ namespace Artemis.Utilities.Memory
} }
return address; 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<List<GamePointersCollectionModel>>(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
}
}
} }
} }

View File

@ -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<string>()}.\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<string>()));
}
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<JObject>(json);
// Parse a version number string to an int
var remoteVersion = int.Parse(release["tag_name"].Value<string>().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<List<GamePointersCollectionModel>>(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
}
}
}
}

View File

@ -1,7 +1,13 @@
using System; using System;
using System.Windows; using System.Diagnostics;
using System.Threading.Tasks;
using System.Windows.Forms;
using Artemis.Events; using Artemis.Events;
using Artemis.Utilities;
using Caliburn.Micro; using Caliburn.Micro;
using Newtonsoft.Json.Linq;
using Application = System.Windows.Application;
using Screen = Caliburn.Micro.Screen;
namespace Artemis.ViewModels namespace Artemis.ViewModels
{ {
@ -10,6 +16,7 @@ namespace Artemis.ViewModels
private readonly ShellViewModel _shellViewModel; private readonly ShellViewModel _shellViewModel;
private readonly IWindowManager _windowManager; private readonly IWindowManager _windowManager;
private bool _checkedForUpdate;
private bool _enabled; private bool _enabled;
private string _toggleText; private string _toggleText;
/* /*
@ -27,6 +34,7 @@ namespace Artemis.ViewModels
_shellViewModel = shellViewModel; _shellViewModel = shellViewModel;
_shellViewModel.MainManager.Events.Subscribe(this); _shellViewModel.MainManager.Events.Subscribe(this);
_shellViewModel.MainManager.EnableProgram(); _shellViewModel.MainManager.EnableProgram();
_checkedForUpdate = false;
// TODO: Check if show on startup is enabled, if so, show window. // TODO: Check if show on startup is enabled, if so, show window.
} }
@ -85,6 +93,13 @@ namespace Artemis.ViewModels
if (!CanShowWindow) if (!CanShowWindow)
return; return;
if (!_checkedForUpdate)
{
_checkedForUpdate = true;
var updateTask = new Task(Updater.CheckForUpdate);
updateTask.Start();
}
// manually show the next window view-model // manually show the next window view-model
_windowManager.ShowWindow(_shellViewModel); _windowManager.ShowWindow(_shellViewModel);
@ -92,6 +107,7 @@ namespace Artemis.ViewModels
NotifyOfPropertyChange(() => CanHideWindow); NotifyOfPropertyChange(() => CanHideWindow);
} }
public void HideWindow() public void HideWindow()
{ {
if (!CanHideWindow) if (!CanHideWindow)