#include "core/config.h" #include "core/server.h" #include "core/ssl_server.h" #include "lib/database.h" #include #include #include #include #include // Global flag for graceful shutdown std::atomic g_running{true}; std::shared_ptr g_sslServer = nullptr; std::shared_ptr g_server = nullptr; // Signal handler for graceful shutdown void signalHandler(int signal) { std::cout << "\n[YourChat] Received signal " << signal << ", shutting down gracefully..." << std::endl; g_running = false; if (g_sslServer) { g_sslServer->stop(); } if (g_server) { g_server->stop(); } } // main function int main(int, char **) { // Set up signal handlers std::signal(SIGINT, signalHandler); std::signal(SIGTERM, signalHandler); auto config = std::make_shared(); auto database = std::make_shared(config); // Check if SSL is enabled bool sslEnabled = config->value("server", "ssl_enabled").asBool(); try { if (sslEnabled) { std::cout << "[YourChat] Starting with SSL/TLS support" << std::endl; g_sslServer = std::make_shared(config, database); g_sslServer->createRooms(); g_sslServer->run(); // Give the SSL server a moment to initialize std::this_thread::sleep_for(std::chrono::milliseconds(100)); } else { std::cout << "[YourChat] Starting without SSL/TLS support" << std::endl; g_server = std::make_shared(config, database); g_server->createRooms(config->group("rooms")); g_server->run(); } // Main loop - wait for shutdown signal while (g_running) { std::this_thread::sleep_for(std::chrono::milliseconds(100)); } // Clean up servers before exit if (g_sslServer) { g_sslServer->stop(); g_sslServer.reset(); } if (g_server) { g_server->stop(); g_server.reset(); } std::cout << "[YourChat] Shutdown complete." << std::endl; } catch (const std::exception& e) { std::cerr << "[YourChat] Error: " << e.what() << std::endl; return 1; } return 0; }