using System.Data; using Gatus.To.MonA.Models; using Microsoft.Extensions.Hosting.WindowsServices; namespace Gatus.To.MonA; public partial class Worker : BackgroundService { private bool? _First; private readonly bool _IsWindowsService; private readonly ILogger _Logger; private readonly AppSettings _AppSettings; private readonly IHttpClientFactory _HttpClientFactory; public Worker(IHttpClientFactory httpClientFactory, ILogger logger, IServiceProvider serviceProvider, AppSettings appSettings, List collection) { _Logger = logger; _AppSettings = appSettings; _HttpClientFactory = httpClientFactory; logger.LogInformation(string.Join(Environment.NewLine, collection)); try { logger.LogInformation("<{folder}>", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)); } catch (Exception) { } _First = null; _IsWindowsService = collection.Contains(nameof(WindowsServiceLifetime)); } public override Task StopAsync(CancellationToken cancellationToken) { if (_AppSettings.GatusToMonaConfiguration.Helper == nameof(Helpers.HelperGatusToMona)) Helpers.HelperGatusToMona.Heartbeat(_AppSettings, _HttpClientFactory, _Logger, Infineon.Monitoring.MonA.State.Down, cancellationToken); return base.StopAsync(cancellationToken); } private async Task Body(CancellationToken cancellationToken) { if (!_IsWindowsService) { _Logger.LogInformation("Set break point and skip to run {_AppSettings.GatusToMonaConfiguration.Helper}!", _AppSettings.GatusToMonaConfiguration.Helper); throw new EvaluateException($"Set break point and skip to run {_AppSettings.GatusToMonaConfiguration.Helper}!"); } if (!_IsWindowsService) { for (int i = 0; i < int.MaxValue; i++) { BodyInner(cancellationToken); Thread.Sleep(_AppSettings.GatusToMonaConfiguration.MillisecondsDelay); } } while (_IsWindowsService && !cancellationToken.IsCancellationRequested) { BodyInner(cancellationToken); await Task.Delay(_AppSettings.GatusToMonaConfiguration.MillisecondsDelay, cancellationToken); } } private void BodyInner(CancellationToken cancellationToken) { _Logger.LogInformation("A) Next execute will be at {date}", DateTime.Now.AddMilliseconds(_AppSettings.GatusToMonaConfiguration.MillisecondsDelay).ToString("yyyy-MM-dd hh:mm:ss.fff tt")); if (_First is null || _First.Value) { _First = false; if (_AppSettings.GatusToMonaConfiguration.Helper == nameof(Helpers.HelperGatusToMona)) Helpers.HelperGatusToMona.Heartbeat(_AppSettings, _HttpClientFactory, _Logger, Infineon.Monitoring.MonA.State.Up, cancellationToken); } if (!Directory.Exists(_AppSettings.GatusToMonaConfiguration.Directory)) _ = Directory.CreateDirectory(_AppSettings.GatusToMonaConfiguration.Directory); else { _ = _AppSettings.GatusToMonaConfiguration.Helper switch { nameof(Helpers.HelperGatusToMona) => Helpers.HelperGatusToMona.UpdateCount(_AppSettings, _Logger, cancellationToken), _ => throw new NotSupportedException() }; } _Logger.LogInformation("B) Next execute will be at {date}", DateTime.Now.AddMilliseconds(_AppSettings.GatusToMonaConfiguration.MillisecondsDelay).ToString("yyyy-MM-dd hh:mm:ss.fff tt")); } protected override async Task ExecuteAsync(CancellationToken cancellationToken) => await Body(cancellationToken); }