using System.Net; using System.Reflection; using System.Text.Json; using MassTransit; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Server.DB; using Server.Services; using Wonderking.Game.Mapping; var builder = Host.CreateApplicationBuilder(); #if DEBUG builder.Environment.EnvironmentName = "Development"; #endif builder.Configuration.AddJsonFile("settings.json", true, true) .AddJsonFile($"settings.{builder.Environment.EnvironmentName}.json", true) .AddEnvironmentVariables().Build(); builder.Services.AddSingleton<CharacterStatsMappingConfiguration>( JsonSerializer.Deserialize<CharacterStatsMappingConfiguration>( File.ReadAllText("config/character-stats.mapping.json")) ?? throw new InvalidOperationException()); builder.Services.AddLogging(); var loggerFactory = LoggerFactory.Create(loggingBuilder => { loggingBuilder.AddFile("logs/Server-{Date}.log", LogLevel.Trace); loggingBuilder.AddFile("logs/Server-{Date}.json.log", LogLevel.Trace, isJson: true); loggingBuilder.AddConsole(); }); builder.Services.AddDbContextPool<WonderkingContext>(o => { using var configuration = builder.Configuration; o.UseNpgsql( $"Host={configuration["DB:Host"]};Username={configuration["DB:Username"]};Password={configuration["DB:Password"]};Database={configuration["DB:Database"]};Port={configuration["DB:Port"]}") .EnableSensitiveDataLogging().UseLazyLoadingProxies().UseLoggerFactory(loggerFactory); }); builder.Services.AddSingleton<ILoggerFactory>(loggerFactory); builder.Services.AddSingleton<PacketDistributorService>(); builder.Services.AddSingleton<ItemObjectPoolService>(); builder.Services.AddHostedService(provider => provider.GetService<ItemObjectPoolService>() ?? throw new InvalidOperationException()); builder.Services.AddHostedService(provider => provider.GetService<PacketDistributorService>() ?? throw new InvalidOperationException()); builder.Services.AddMassTransit(x => { x.UsingInMemory((context, configurator) => configurator.ConfigureEndpoints(context)); x.AddMediator(cfg => cfg.AddConsumers(Assembly.GetExecutingAssembly())); }); builder.Services.AddHostedService(provider => new WonderkingAuthServer(IPAddress.Any, 10001, provider.GetService<ILogger<WonderkingAuthServer>>() ?? throw new InvalidOperationException(), provider.GetService<IServiceProvider>() ?? throw new InvalidOperationException())); using var host = builder.Build(); using (var scope = host.Services.CreateScope()) { var db = scope.ServiceProvider.GetRequiredService<WonderkingContext>(); await db.Database.MigrateAsync().ConfigureAwait(true); } await host.RunAsync().ConfigureAwait(true);