using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using RdtClient.Data.Enums; using RdtClient.Data.Models.Internal; using RdtClient.Service.Services; namespace RdtClient.Service.BackgroundServices; public class ProviderUpdater(ILogger logger, IServiceProvider serviceProvider, ISettings settings) : BackgroundService { private static DateTime _nextUpdate = DateTime.UtcNow; protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!Startup.Ready) { await Task.Delay(1000, stoppingToken); } logger.LogInformation("ProviderUpdater started."); while (!stoppingToken.IsCancellationRequested) { using var scope = serviceProvider.CreateScope(); var torrentService = scope.ServiceProvider.GetRequiredService(); var torrentRunner = scope.ServiceProvider.GetRequiredService(); try { var torrents = await torrentService.Get(); if (_nextUpdate < DateTime.UtcNow && (settings.Current.Provider.AutoImport || torrents.Any(t => t.RdStatus != TorrentStatus.Finished) || RdtHub.HasConnections)) { logger.LogDebug($"Updating torrent info from debrid provider"); var updateTime = settings.Current.Provider.CheckInterval * 3; if (updateTime < 30) { updateTime = 30; } if (RdtHub.HasConnections) { updateTime = settings.Current.Provider.CheckInterval; if (updateTime < 5) { updateTime = 5; } } _nextUpdate = DateTime.UtcNow.AddSeconds(updateTime); await torrentService.UpdateRdData(); logger.LogDebug("Finished updating torrent info from debrid provider, next update in {updateTime} seconds", updateTime); } } catch (RateLimitException ex) { await torrentRunner.SetRateLimit(ex.RetryAfter, ex.Message); _nextUpdate = DateTime.UtcNow.Add(ex.RetryAfter); } catch (Exception ex) { logger.LogError(ex, "Unexpected error occurred in ProviderUpdater: {ex.Message}", ex.Message); } await Task.Delay(TimeSpan.FromSeconds(1), stoppingToken); } logger.LogInformation("ProviderUpdater stopped."); } }