using DataModel.Database.Common; using Microsoft.Extensions.DependencyInjection; using Timer = System.Timers.Timer; namespace Processor; public static class ExportProcessor { private static readonly Timer EXPORT_TIMER = new(); private static readonly SemaphoreSlim EXPORT_SEMAPHORE_BRICK_WALL = new(2); private static readonly SemaphoreSlim EXPORT_SEMAPHORE_EXPORTING = new(1); static ExportProcessor() { EXPORT_TIMER.Interval = 6_000; // 6 seconds EXPORT_TIMER.AutoReset = false; EXPORT_TIMER.Elapsed += async (sender, args) => await ExportToJson(); } private static async Task ExportToJson() { if(!await EXPORT_SEMAPHORE_BRICK_WALL.WaitAsync(1)) return; try { await EXPORT_SEMAPHORE_EXPORTING.WaitAsync(); await using var db = ProcessorMeta.ServiceProvider.GetRequiredService(); await db.ExportAsync(Environment.ExpandEnvironmentVariables(Path.Join(await AppSettings.GetAutoExportDestinationPath(), await AppSettings.GetAutoExportFilename()))); } finally { EXPORT_SEMAPHORE_EXPORTING.Release(); EXPORT_SEMAPHORE_BRICK_WALL.Release(); } } public static async Task TriggerExport() { if (!await AppSettings.GetAutoExportEnabled()) return; EXPORT_TIMER.Stop(); EXPORT_TIMER.Start(); } }