using System; using System.Threading; using System.Threading.Tasks; using TwitchDownloaderCore; using TwitchDownloaderCore.Options; using TwitchDownloaderWPF.Utils; namespace TwitchDownloaderWPF.TwitchTasks { internal class ChatUpdateTask : TwitchTask { public ChatUpdateOptions UpdateOptions { get; init; } public override string TaskType { get; } = Translations.Strings.ChatUpdate; public override string OutputFile => UpdateOptions.OutputFile; public override void Reinitialize() { Progress = 0; TokenSource = new CancellationTokenSource(); Exception = null; CanReinitialize = false; ChangeStatus(TwitchTaskStatus.Ready); } public override bool CanRun() { return Status == TwitchTaskStatus.Ready; } public override async Task RunAsync() { if (TokenSource.IsCancellationRequested) { TokenSource.Dispose(); ChangeStatus(TwitchTaskStatus.Canceled); CanReinitialize = true; return; } var progress = new WpfTaskProgress(i => Progress = i, s => DisplayStatus = s); ChatUpdater updater = new ChatUpdater(UpdateOptions, progress); ChangeStatus(TwitchTaskStatus.Running); try { await updater.ParseJsonAsync(TokenSource.Token); await updater.UpdateAsync(TokenSource.Token); if (TokenSource.IsCancellationRequested) { ChangeStatus(TwitchTaskStatus.Canceled); CanReinitialize = true; } else { progress.ReportProgress(100); ChangeStatus(TwitchTaskStatus.Finished); } } catch (Exception ex) when (ex is OperationCanceledException or TaskCanceledException && TokenSource.IsCancellationRequested) { ChangeStatus(TwitchTaskStatus.Canceled); CanReinitialize = true; } catch (Exception ex) { ChangeStatus(TwitchTaskStatus.Failed); Exception = ex; CanReinitialize = true; } TokenSource.Dispose(); GC.Collect(-1, GCCollectionMode.Default, false); } } }