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!");
}
}
}
}