using System; using System.Threading.Tasks; using Byond.TopicSender; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Octokit.Webhooks; using Octokit.Webhooks.AspNetCore; using Prometheus; namespace Tgstation.PRAnnouncer { /// /// The program. /// public class Program { /// /// Program entrypoint. /// /// Command line arguments. /// A representing the lifetime of the program. public static async Task Main(string[] args) { var appBuilder = WebApplication.CreateBuilder(args); appBuilder.Host.UseSystemd(); var servicesBuilder = appBuilder.Services; servicesBuilder.AddOptions(); servicesBuilder.AddHealthChecks() .AddCheck(GameServersConnectivityHealthCheck.Name) .ForwardToPrometheus(); servicesBuilder.AddLogging(loggingBuilder => loggingBuilder.AddConsole()); servicesBuilder.Configure(appBuilder.Configuration.GetSection("Settings")); servicesBuilder.AddSingleton(services => { var timeouts = services.GetRequiredService>().Value.TopicTimeouts; return new TopicClient( new SocketParameters { ConnectTimeout = TimeSpan.FromSeconds(timeouts?.ConnectTimeoutSeconds ?? TopicTimeouts.DefaultTimeoutSeconds), SendTimeout = TimeSpan.FromSeconds(timeouts?.SendTimeoutSeconds ?? TopicTimeouts.DefaultTimeoutSeconds), ReceiveTimeout = TimeSpan.FromSeconds(timeouts?.ReceiveTimeoutSeconds ?? TopicTimeouts.DefaultTimeoutSeconds), DisconnectTimeout = TimeSpan.FromSeconds(timeouts?.DisconnectTimeoutSeconds ?? TopicTimeouts.DefaultTimeoutSeconds), }, services.GetService>()); }); servicesBuilder.AddSingleton(_ => Metrics.DefaultFactory); servicesBuilder.AddSingleton(); await using var app = appBuilder.Build(); var services = app.Services; var logger = services.GetRequiredService>(); try { var settings = services.GetRequiredService>(); var secret = settings.Value.GitHubSecret; app.MapGitHubWebhooks(secret: secret); app.MapMetrics(); app.MapHealthChecks("/health"); await app.RunAsync(); } catch (Exception ex) { logger.LogCritical(ex, "Application crashed!"); } } } }