using ArcaneLibs.Extensions; using MatrixContentFilter; using MatrixContentFilter.Handlers; using LibMatrix.Services; using LibMatrix.Utilities.Bot; using MatrixContentFilter.Abstractions; using MatrixContentFilter.Handlers.Filters; using MatrixContentFilter.Services; using MatrixContentFilter.Services.AsyncActionQueues; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Diagnostics.Metrics; using Microsoft.Extensions.Hosting; using OpenTelemetry.Metrics; using OpenTelemetry.Resources; using OpenTelemetry.Trace; var builder = Host.CreateDefaultBuilder(args); if (Environment.GetEnvironmentVariable("MATRIXCONTENTFILTER_APPSETTINGS_PATH") is string path) builder.ConfigureAppConfiguration(x => x.AddJsonFile(path)); var host = builder.ConfigureServices((ctx, services) => { var config = new MatrixContentFilterConfiguration(ctx.Configuration); Console.WriteLine("Configuration: {0}", config.ToJson()); services.AddSingleton(config); services.AddMetrics(m => m.AddDebugConsole()); services.AddSingleton(); if (config.OpenTelemetry.Enabled) { services.AddOpenTelemetry() .ConfigureResource(resource => resource.AddService("MatrixContentFilter")) .WithTracing(tracing => tracing .AddAspNetCoreInstrumentation() .AddConsoleExporter()) .WithMetrics(metrics => metrics .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddRuntimeInstrumentation() .AddConsoleExporter()); } services.AddRoryLibMatrixServices(new() { AppName = "MatrixContentFilter" }); services.AddMatrixBot().AddCommandHandler().DiscoverAllCommands() .WithInviteHandler() .WithCommandResultHandler(CommandResultHandler.HandleAsync); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(s => s.GetRequiredService()); services.AddSingleton(); services.AddSingleton(s => s.GetRequiredService()); switch (config.AppMode) { case "bot": services.AddHostedService(); if (config.SanityCheck.Enabled) services.AddHostedService(); break; default: throw new NotSupportedException($"Unknown app mode: {config.AppMode}"); } switch (config.AsyncQueueImplementation) { case "lifo": services.AddSingleton(); services.AddSingleton(s => s.GetRequiredService()); services.AddSingleton(s => s.GetRequiredService()); break; case "fifo": services.AddSingleton(); services.AddSingleton(s => s.GetRequiredService()); services.AddSingleton(s => s.GetRequiredService()); break; default: throw new NotSupportedException($"Unknown async queue implementation: {config.AsyncQueueImplementation}"); } }) // .ConfigureLogging((ctx, lb) => { // lb.AddOpenTelemetry(options => { // options // .SetResourceBuilder( // ResourceBuilder.CreateDefault() // .AddService("MatrixContentFilter")) // .AddConsoleExporter(); // }); // }) .UseConsoleLifetime().Build(); await host.RunAsync();