1
0
mirror of https://github.com/chylex/TweetDuck.git synced 2025-04-28 18:15:47 +02:00
TweetDuck/lib/TweetLib.Core/Features/Updates/UpdateHandler.cs
Daniel Chýlek 1ccefe853a
Update .NET & begin refactoring code into a core lib ()
* Switch to .NET Framework 4.7.2 & C# 8.0, update libraries

* Add TweetLib.Core project targeting .NET Standard 2.0

* Enable reference nullability checks for TweetLib.Core

* Move a bunch of utility classes into TweetLib.Core & refactor

* Partially move TweetDuck plugin & update system to TweetLib.Core

* Move some constants and CultureInfo setup to TweetLib.Core

* Move some configuration classes to TweetLib.Core

* Minor refactoring and warning suppression

* Add App to TweetLib.Core

* Add IAppErrorHandler w/ implementation

* Continue moving config, plugin, and update classes to TweetLib.Core

* Fix a few nullability checks

* Update installers to check for .NET Framework 4.7.2
2019-05-26 14:55:12 +02:00

82 lines
2.7 KiB
C#

using System;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using TweetLib.Core.Data;
using Timer = System.Timers.Timer;
namespace TweetLib.Core.Features.Updates{
public sealed class UpdateHandler : IDisposable{
public const int CheckCodeUpdatesDisabled = -1;
private readonly IUpdateCheckClient client;
private readonly TaskScheduler scheduler;
private readonly Timer timer;
public event EventHandler<UpdateCheckEventArgs> CheckFinished;
private ushort lastEventId;
public UpdateHandler(IUpdateCheckClient client, TaskScheduler scheduler){
this.client = client;
this.scheduler = scheduler;
this.timer = new Timer{
AutoReset = false,
Enabled = false
};
this.timer.Elapsed += timer_Elapsed;
}
public void Dispose(){
timer.Dispose();
}
private void timer_Elapsed(object sender, ElapsedEventArgs e){
Check(false);
}
public void StartTimer(){
if (timer.Enabled){
return;
}
timer.Stop();
if (client.CanCheck){
DateTime now = DateTime.Now;
TimeSpan nextHour = now.AddSeconds(60 * (60 - now.Minute) - now.Second) - now;
if (nextHour.TotalMinutes < 15){
nextHour = nextHour.Add(TimeSpan.FromHours(1));
}
timer.Interval = (int)Math.Ceiling(nextHour.TotalMilliseconds);
timer.Start();
}
}
public int Check(bool force){
if (client.CanCheck || force){
int nextEventId = unchecked(++lastEventId);
Task<UpdateInfo> checkTask = client.Check();
checkTask.ContinueWith(task => HandleUpdateCheckSuccessful(nextEventId, task.Result), CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, scheduler);
checkTask.ContinueWith(task => HandleUpdateCheckFailed(nextEventId, task.Exception.InnerException), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler);
return nextEventId;
}
return CheckCodeUpdatesDisabled;
}
private void HandleUpdateCheckSuccessful(int eventId, UpdateInfo info){
CheckFinished?.Invoke(this, new UpdateCheckEventArgs(eventId, new Result<UpdateInfo>(info)));
}
private void HandleUpdateCheckFailed(int eventId, Exception exception){
CheckFinished?.Invoke(this, new UpdateCheckEventArgs(eventId, new Result<UpdateInfo>(exception)));
}
}
}