using LANCommander.Server.Data; using LANCommander.Server.Data.Enums; using LANCommander.Server.Hubs; using LANCommander.Server.Services; using LANCommander.Server.Services.Abstractions; using LANCommander.Server.Settings.Enums; using Microsoft.AspNetCore.SignalR; namespace LANCommander.Server.Startup; public static class Servers { public static WebApplicationBuilder AddServerProcessStatusMonitor(this WebApplicationBuilder builder) { builder.Services.AddSingleton(); return builder; } public static async Task StartServersAsync(this WebApplication app) { if (DatabaseContext.Provider != DatabaseProvider.Unknown) { using var scope = app.Services.CreateScope(); var serverManager = scope.ServiceProvider.GetRequiredService(); var logger = scope.ServiceProvider.GetRequiredService>(); // Initialize engines and prime tracking before starting anything. await serverManager.InitializeAsync(); logger.LogDebug("Autostarting Servers"); // Autostart IPX relay scope.ServiceProvider.GetService(); await serverManager.AutostartApplicationServersAsync(); } } public class ServerEngineStatusService { public ServerEngineStatusService( IServiceProvider serviceProvider, IHubContext hubContext) { foreach (var engine in serviceProvider.GetServices()) { engine.OnServerStatusUpdate += async (sender, args) => { await hubContext.Clients.All.SendAsync("StatusUpdate", args.Status.ToString()); }; } } } }