using ArcaneLibs.Extensions; namespace SafeNSound.FakeUser; public class MonitorService(ILogger logger, UserStore userStore): IHostedService { private Task? _getAllAlarmsTask, _assignBudgetTask; private readonly CancellationTokenSource _cts = new(); public async Task StartAsync(CancellationToken cancellationToken) { _getAllAlarmsTask = GetAllAlarms(_cts.Token); _assignBudgetTask = AssignBudget(_cts.Token); } private async Task GetAllAlarms(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { try { var user = userStore.GetRandomMonitor(); var alarms = await user.Client!.GetAllAlarms(); if(alarms.Count > 0) logger.LogInformation("Monitor {UserId} has outstanding alarms: {Alarm}", user.Auth.Username, alarms.ToJson(indent: false)); // else // logger.LogInformation("Monitor {UserId} found no alarms to query", user.Auth.Username); await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); } catch (Exception ex) { logger.LogError(ex, "Error querying alarm"); } } } private async Task AssignBudget(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { try { var user = userStore.GetRandomMonitor(); // var alarms = await user.Client!.GetAllAlarms(); // if(alarms.Count > 0) // logger.LogInformation("Monitor {UserId} has outstanding alarms: {Alarm}", user.Auth.Username, alarms.ToJson(indent: false)); // else // logger.LogInformation("Monitor {UserId} found no alarms to query", user.Auth.Username); await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); } catch (Exception ex) { logger.LogError(ex, "Error querying alarm"); } } } public async Task StopAsync(CancellationToken cancellationToken) { await _cts.CancelAsync(); await _getAllAlarmsTask!; } }