using Microsoft.Extensions.Configuration; using MMOserver.Config; using MMOserver.Game.Service; using MMOserver.RDB; using Serilog; using ServerLib.Utils; namespace MMOserver; class Program { private static async Task Main() { // 크래시 덤프 핸들러 (Release: .log + .dmp / Debug: .log) CrashDumpHandler.Register(); // .MinimumLevel.Warning() // Warning 이상만 출력 배포시 IConfigurationRoot config = new ConfigurationBuilder() .SetBasePath(AppContext.BaseDirectory) .AddJsonFile("config.json", optional: true) // 로컬 개발용 .AddEnvironmentVariables() // 도커 배포용 .Build(); AppConfig.Initialize(config); // DB 연결 // DbConnectionFactory dbFactory = new DbConnectionFactory(config); string timestamp = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss"); Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.Console() .WriteTo.File($"logs/log_{timestamp}.txt") .CreateLogger(); Log.Information("Write Log Started"); int port = AppConfig.Server.Port; string connectionString = "test"; GameServer gameServer = new GameServer(port, connectionString); // Ctrl+C → Stop() 호출 → Run() 루프 탈출 → serverThread 종료 Console.CancelKeyPress += (_, e) => { // 프로세스 즉시 종료 막기 e.Cancel = true; gameServer.Stop(); }; // 게임 서버 스레드 생성 // Thread serverThread = new Thread(() => // { // gameServer.Init(); // gameServer.Run(); // }); // 게임 서버 스레드 시작 // serverThread.Start(); // Run()이 끝날 때까지 대기 // serverThread.Join(); // 비동기 변경 await Task.Run(async () => { gameServer.Init(); await gameServer.Run(); }); // Log 종료 Log.CloseAndFlush(); } }