Files
hDM/src/DownloadManager.Core/Services/SchedulerWatchdog.cs
2026-05-04 01:19:04 +03:00

114 lines
3.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using DownloadManager.Core.Models;
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace DownloadManager.Core.Services;
public class SchedulerWatchdog
{
private readonly IScheduleService _scheduleService;
private readonly IDownloadService _downloadService;
private Timer? _timer;
private bool _isProcessing;
public SchedulerWatchdog(IScheduleService scheduleService, IDownloadService downloadService)
{
_scheduleService = scheduleService;
_downloadService = downloadService;
}
public void Start()
{
// Her 30 saniyede bir kontrol et
_timer = new Timer(async _ => await CheckScheduleAsync(), null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
Serilog.Log.Information("Zamanlayıcı İzleyici (Watchdog) başlatıldı.");
}
public void Stop()
{
_timer?.Dispose();
Serilog.Log.Information("Zamanlayıcı İzleyici durduruldu.");
}
private async Task CheckScheduleAsync()
{
if (_isProcessing) return;
_isProcessing = true;
try
{
var jobs = await _scheduleService.GetJobsAsync();
var activeJob = jobs.FirstOrDefault(j => j.IsActive);
if (activeJob == null) return;
var now = DateTime.Now;
var currentTime = now.TimeOfDay;
// Gün kontrolü
int dayIndex = (int)now.DayOfWeek; // 0=Pazar, 1=Pazartesi...
// Model Pt=0, Pz=6 şeklinde varsayılmıştı (1111111)
// .NET DayOfWeek: Sunday=0, Monday=1...
// Dönüştürelim: Pt=0 için
int adjustedIndex = dayIndex == 0 ? 6 : dayIndex - 1;
if (activeJob.DaysOfWeek[adjustedIndex] == '0') return;
// Başlatma kontrolü
if (activeJob.StartTime.HasValue)
{
var startTime = activeJob.StartTime.Value.TimeOfDay;
// Başlangıç vaktinden sonraki 1 dakika içindeysek başlat (sürekli tetiklenmemesi için)
if (currentTime >= startTime && currentTime < startTime.Add(TimeSpan.FromMinutes(1)))
{
await StartScheduledDownloads();
}
}
// Durdurma kontrolü
if (activeJob.EndTime.HasValue)
{
var endTime = activeJob.EndTime.Value.TimeOfDay;
if (currentTime >= endTime && currentTime < endTime.Add(TimeSpan.FromMinutes(1)))
{
await StopAllDownloads();
}
}
}
catch (Exception ex)
{
Serilog.Log.Error(ex, "Zamanlayıcı kontrolü sırasında hata oluştu.");
}
finally
{
_isProcessing = false;
}
}
private async Task StartScheduledDownloads()
{
Serilog.Log.Information("Zamanlayıcı: İndirmeler başlatılıyor...");
var downloads = await _downloadService.GetAllDownloadsAsync();
var pending = downloads.Where(d => d.Status == Enums.DownloadStatus.Paused || d.Status == Enums.DownloadStatus.Pending);
foreach (var item in pending)
{
await _downloadService.ResumeDownloadAsync(item.Id);
}
}
private async Task StopAllDownloads()
{
Serilog.Log.Information("Zamanlayıcı: İndirmeler durduruluyor...");
var downloads = await _downloadService.GetAllDownloadsAsync();
var active = downloads.Where(d => d.Status == Enums.DownloadStatus.Downloading || d.Status == Enums.DownloadStatus.Queued);
foreach (var item in active)
{
await _downloadService.PauseDownloadAsync(item.Id);
}
}
}