private static IHostBuilder CreateHostBuilder(string[] args) { return(Host .CreateDefaultBuilder(args) .ConfigureServices((hostBuilderContext, serviceCollection) => { // Options serviceCollection.Configure <SerilogOptions>(hostBuilderContext.Configuration.GetSection("Serilog:MinimumLevel")); serviceCollection.Configure <DiscordOptions>(hostBuilderContext.Configuration.GetSection("Discord")); serviceCollection.Configure <BlockchainOptions>(hostBuilderContext.Configuration.GetSection("Blockchain")); // Database serviceCollection.AddDbContextFactory <SqliteDatabaseContext>(builder => { builder.UseSqlite($"Data Source={Path.Combine(hostBuilderContext.HostingEnvironment.ContentRootPath, "data.db")}"); }); serviceCollection.AddHostedService <SqliteDatabaseHostedService>(); // Logger serviceCollection.AddSingleton <LoggingLevelSwitch>(); serviceCollection.AddSingleton <Logger>(); // Discord serviceCollection.AddSingleton(_ => new DiscordShardedClient(new DiscordSocketConfig { LogLevel = LogSeverity.Verbose, RateLimitPrecision = RateLimitPrecision.Millisecond })); serviceCollection.AddSingleton(serviceProvider => { var commandService = new CommandService(new CommandServiceConfig { CaseSensitiveCommands = false, IgnoreExtraArgs = true }); commandService.AddTypeReader <IEmote>(new EmoteTypeReader()); commandService.AddModulesAsync(Assembly.GetExecutingAssembly(), serviceProvider); return commandService; }); serviceCollection.AddHostedService <DiscordHostedService>(); // Rpc serviceCollection.AddSingleton(_ => new DaemonRpcClient(hostBuilderContext.Configuration["Blockchain:Rpc:Daemon:Host"], int.Parse(hostBuilderContext.Configuration["Blockchain:Rpc:Daemon:Port"]))); serviceCollection.AddSingleton(_ => new WalletRpcClient(hostBuilderContext.Configuration["Blockchain:Rpc:Wallet:Host"], int.Parse(hostBuilderContext.Configuration["Blockchain:Rpc:Wallet:Port"]))); serviceCollection.AddHostedService <DaemonHostedService>(); }) .UseSerilog((hostBuilderContext, serviceProvider, loggerConfiguration) => { var configuration = loggerConfiguration .ReadFrom.Configuration(hostBuilderContext.Configuration) .MinimumLevel.ControlledBy(serviceProvider.GetRequiredService <LoggingLevelSwitch>()); var outputTemplateTextFormatter = new OutputTemplateTextFormatter("{Message}{NewLine}{Exception}"); configuration.WriteTo.AnsiConsole(outputTemplateTextFormatter); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup <Startup>(); })); }
private static IHostBuilder CreateHostBuilder(string[] args) { return(Host .CreateDefaultBuilder(args) .ConfigureServices((hostBuilderContext, serviceCollection) => { var configuration = hostBuilderContext.Configuration; // Options serviceCollection.Configure <SerilogOptions>(configuration.GetSection("Serilog:MinimumLevel")); serviceCollection.Configure <ApplicationOptions>(configuration.GetSection("Application")); serviceCollection.Configure <ServerOptions>(configuration.GetSection("Server")); serviceCollection.Configure <NetworkOptions>(configuration.GetSection("Server:Network")); serviceCollection.Configure <WorldOptions>(configuration.GetSection("Server:World")); // Database serviceCollection.AddDbContextFactory <SqliteDatabaseContext>(builder => { builder.UseSqlite($"Data Source={Path.Combine(hostBuilderContext.HostingEnvironment.ContentRootPath, "data.db")}"); }); // Logger serviceCollection.AddSingleton <LoggingLevelSwitch>(); serviceCollection.AddSingleton <Logger>(); // Network serviceCollection.AddSingleton <NatDevices>(); serviceCollection.AddSingleton <TcpClientListener>(); serviceCollection.AddSingleton <TcpClientCollection>(); // Player serviceCollection.AddSingleton <PlayerCollection>(); // World serviceCollection.AddSingleton <World>(); serviceCollection.AddSingleton <GameServer>(); var headlessMode = configuration.GetValue("Application:HeadlessMode", true); if (headlessMode) { serviceCollection.AddSingleton <ConsoleWindow>(); serviceCollection.AddSingleton <ConsoleWindowViewModel>(); serviceCollection.AddHostedService <ConsoleHostedService>(); } else { serviceCollection.AddSingleton(_ => new ClassicDesktopStyleApplicationLifetime { Args = args, ShutdownMode = ShutdownMode.OnMainWindowClose }); serviceCollection.AddSingleton <ActionLogger>(); serviceCollection.AddSingleton <MainWindowViewModel>(); serviceCollection.AddHostedService <AvaloniaHostedService>(); } }) .UseSerilog((hostBuilderContext, serviceProvider, loggerConfiguration) => { var configuration = loggerConfiguration .ReadFrom.Configuration(hostBuilderContext.Configuration) .MinimumLevel.ControlledBy(serviceProvider.GetRequiredService <LoggingLevelSwitch>()); var headlessMode = hostBuilderContext.Configuration.GetValue("Application:HeadlessMode", true); var outputTemplateTextFormatter = new OutputTemplateTextFormatter("{Message}{NewLine}{Exception}"); if (headlessMode) { configuration.WriteTo.AnsiConsole(outputTemplateTextFormatter); } else { configuration.WriteTo.Logger(subLogger => subLogger .Filter.ByExcluding(Matching.FromSource <Logger>()) .WriteTo.AnsiConsole(outputTemplateTextFormatter)); configuration.WriteTo.Logger(subLogger => subLogger .Filter.ByIncludingOnly(Matching.FromSource <Logger>()) .WriteTo.Action(serviceProvider.GetRequiredService <ActionLogger>().WriteToLogEvent, outputTemplateTextFormatter)); } })); }