using System; using System.Threading.Tasks; using Onova; using Onova.Exceptions; using Onova.Services; namespace DiscordChatExporter.Gui.Services { public class UpdateService : IDisposable { private readonly IUpdateManager _updateManager = new UpdateManager( new GithubPackageResolver("Tyrrrz", "DiscordChatExporter", "DiscordChatExporter.zip"), new ZipPackageExtractor() ); private readonly SettingsService _settingsService; private Version? _updateVersion; private bool _updatePrepared; private bool _updaterLaunched; public UpdateService(SettingsService settingsService) { _settingsService = settingsService; } public async ValueTask CheckForUpdatesAsync() { if (!_settingsService.IsAutoUpdateEnabled) return null; var check = await _updateManager.CheckForUpdatesAsync(); return check.CanUpdate ? check.LastVersion : null; } public async ValueTask PrepareUpdateAsync(Version version) { if (!_settingsService.IsAutoUpdateEnabled) return; try { await _updateManager.PrepareUpdateAsync(_updateVersion = version); _updatePrepared = true; } catch (UpdaterAlreadyLaunchedException) { // Ignore race conditions } catch (LockFileNotAcquiredException) { // Ignore race conditions } } public void FinalizeUpdate(bool needRestart) { if (!_settingsService.IsAutoUpdateEnabled) return; if (_updateVersion is null || !_updatePrepared || _updaterLaunched) return; try { _updateManager.LaunchUpdater(_updateVersion, needRestart); _updaterLaunched = true; } catch (UpdaterAlreadyLaunchedException) { // Ignore race conditions } catch (LockFileNotAcquiredException) { // Ignore race conditions } } public void Dispose() => _updateManager.Dispose(); } }