using LANCommander.SDK; using LANCommander.SDK.Abstractions; using LANCommander.SDK.Interceptors; using LANCommander.SDK.Models; using LANCommander.SDK.PowerShell; using LANCommander.SDK.Services; using LANCommander.Server.Services.Abstractions; using LANCommander.Server.Services.Factories; using LANCommander.Server.Services.Interceptors; using LANCommander.Server.Services.MediaGrabbers; using LANCommander.Server.Services.PowerShell; using LANCommander.HQ.SDK; using LANCommander.Server.Services.Providers; using LANCommander.Server.Services.Providers.Metadata; using LANCommander.Server.Services.ServerEngines; using Microsoft.Extensions.DependencyInjection; using ZiggyCreatures.Caching.Fusion; namespace LANCommander.Server.Services.Extensions; public static class IServiceCollectionExtensions { public static IServiceCollection AddLANCommanderServer(this IServiceCollection services) { services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(sp => { var settings = sp.GetRequiredService>(); var hqSettings = settings.CurrentValue.Server.HQ; return new HQClient(new HQClientOptions { BaseAddress = new Uri(hqSettings.BaseUrl), Token = hqSettings.IsAuthenticated ? hqSettings.AccessToken : null, }); }); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddTransient(); // Register metadata providers services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); // Register server engines services.AddSingleton(); services.AddSingleton(); services.AddSingleton(provider => provider.GetService()); services.AddSingleton(); services.AddSingleton(provider => provider.GetService()); services.AddSingleton(); // Default single-instance coordinator election. Replaced by a Redis-backed lease in the // Server project when horizontal scaling is enabled. services.AddSingleton(); services.AddSingleton(); services.AddHostedService(); services.AddSingleton(); services.AddSingleton(sp => sp.GetRequiredService()); services.AddSingleton(); services.AddSingleton(); // Mapperly mappers (stateless, thread-safe compile-time source generators). services.AddSingleton(); services.AddSingleton(); // TryWithAutoSetup wires up a registered serializer, distributed cache (Redis L2), and // backplane when scaling mode has registered them; otherwise FusionCache stays in-memory. services.AddFusionCache().TryWithAutoSetup(); return services; } }