using LightlessSyncServices.Discord; using LightlessSyncShared.Data; using LightlessSyncShared.Metrics; using Microsoft.EntityFrameworkCore; using Prometheus; using LightlessSyncShared.Utils; using LightlessSyncShared.Services; using StackExchange.Redis; using LightlessSyncShared.Utils.Configuration; namespace LightlessSyncServices; public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { var config = app.ApplicationServices.GetRequiredService>(); var metricServer = new KestrelMetricServer(config.GetValueOrDefault(nameof(LightlessConfigurationBase.MetricsPort), 4982)); metricServer.Start(); } public void ConfigureServices(IServiceCollection services) { var lightlessConfig = Configuration.GetSection("LightlessSync"); services.AddDbContextPool(options => { options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection"), builder => { builder.MigrationsHistoryTable("_efmigrationshistory", "public"); }).UseSnakeCaseNamingConvention(); options.EnableThreadSafetyChecks(false); }, Configuration.GetValue(nameof(LightlessConfigurationBase.DbContextPoolSize), 1024)); services.AddDbContextFactory(options => { options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection"), builder => { builder.MigrationsHistoryTable("_efmigrationshistory", "public"); builder.MigrationsAssembly("LightlessSyncShared"); }).UseSnakeCaseNamingConvention(); options.EnableThreadSafetyChecks(false); }); services.AddSingleton(m => new LightlessMetrics(m.GetService>(), new List { }, new List { })); var redis = lightlessConfig.GetValue(nameof(ServerConfiguration.RedisConnectionString), string.Empty); var options = ConfigurationOptions.Parse(redis); options.ClientName = "Lightless"; options.ChannelPrefix = "UserData"; ConnectionMultiplexer connectionMultiplexer = ConnectionMultiplexer.Connect(options); services.AddSingleton(connectionMultiplexer); services.Configure(Configuration.GetRequiredSection("LightlessSync")); services.Configure(Configuration.GetRequiredSection("LightlessSync")); services.Configure(Configuration.GetRequiredSection("LightlessSync")); services.AddSingleton(Configuration); services.AddSingleton(); services.AddSingleton(); services.AddHostedService(); services.AddSingleton, LightlessConfigurationServiceServer>(); services.AddSingleton, LightlessConfigurationServiceClient>(); services.AddSingleton, LightlessConfigurationServiceClient>(); services.AddHostedService(p => (LightlessConfigurationServiceClient)p.GetService>()); services.AddHostedService(p => (LightlessConfigurationServiceClient)p.GetService>()); } }