diff --git a/.clangd b/.clangd new file mode 100644 index 0000000..359a391 --- /dev/null +++ b/.clangd @@ -0,0 +1,2 @@ +CompileFlags: + Add: [-std=c++20] diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 3bec64e..b13d854 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -15,4 +15,9 @@ file(GLOB_RECURSE SOURCES "src/*.cpp" "src/*.h") add_library(openblocks STATIC ${SOURCES}) set_target_properties(openblocks PROPERTIES OUTPUT_NAME "openblocks") target_link_libraries(openblocks ${GLEW_LIBRARIES} OpenGL::GL ReactPhysics3D::ReactPhysics3D pugixml::pugixml) -target_include_directories(openblocks PUBLIC "src" "../include") \ No newline at end of file +target_include_directories(openblocks PUBLIC "src" "../include") + +# Windows-specific dependencies +if(WIN32) + target_link_libraries(openblocks shell32.lib) +endif() \ No newline at end of file diff --git a/core/src/logger.cpp b/core/src/logger.cpp new file mode 100644 index 0000000..f1f82a7 --- /dev/null +++ b/core/src/logger.cpp @@ -0,0 +1,43 @@ +#include "logger.h" +#include "platform.h" + +#include +#include +#include + +static std::ofstream logStream; + +void Logger::init() { + initProgramLogsDir(); + + const auto now = std::chrono::system_clock::now(); + + std::string fileName = std::format("log_{0:%Y%m%d}_{0:%H%M%S}.txt", now); + + logStream = std::ofstream(getProgramLogsDir() + "/" + fileName); + Logger::debug("Logger initialized"); +} + +void Logger::finish() { + Logger::debug("Closing logger..."); + logStream.close(); +} + +void log(std::string message, Logger::LogLevel logLevel) { + std::string logLevelStr = logLevel == Logger::LogLevel::INFO ? "INFO" : + logLevel == Logger::LogLevel::DEBUG ? "DEBUG" : + logLevel == Logger::LogLevel::WARNING ? "WARN" : + logLevel == Logger::LogLevel::ERROR ? "ERROR" : + logLevel == Logger::LogLevel::FATAL_ERROR ? "FATAL" : "?"; + + const auto now = std::chrono::system_clock::now(); + + std::string formattedLogLine = std::format("[{:%Y-%m-%d %X}] [{}] {}", now, logLevelStr, message); + + printf("%s\n", formattedLogLine.c_str()); + logStream << formattedLogLine << std::endl; + + if (logLevel == Logger::LogLevel::FATAL_ERROR) { + displayErrorMessage(formattedLogLine); + } +} \ No newline at end of file diff --git a/core/src/logger.h b/core/src/logger.h new file mode 100644 index 0000000..f4701f6 --- /dev/null +++ b/core/src/logger.h @@ -0,0 +1,23 @@ +#pragma once + +#include + +namespace Logger { + enum class LogLevel { + INFO, + DEBUG, + WARNING, + ERROR, + FATAL_ERROR, + }; + + void init(); + void finish(); + + void log(std::string message, LogLevel logLevel); + inline void info(std::string message) { log(message, LogLevel::INFO); } + inline void debug(std::string message) { log(message, LogLevel::DEBUG); } + inline void warning(std::string message) { log(message, LogLevel::WARNING); } + inline void error(std::string message) { log(message, LogLevel::ERROR); } + inline void fatalError(std::string message) { log(message, LogLevel::FATAL_ERROR); } +}; \ No newline at end of file diff --git a/core/src/platform.cpp b/core/src/platform.cpp index dd3cc2b..bd67175 100644 --- a/core/src/platform.cpp +++ b/core/src/platform.cpp @@ -22,7 +22,7 @@ std::string getProgramDataDir() { return std::string(homedir) + "/openblocks"; } -void printErrorMessage(std::string message) { +void displayErrorMessage(std::string message) { fprintf(stderr, "%s\n", message.c_str()); } @@ -46,7 +46,7 @@ std::string getProgramDataDir() { return localAppData + "/openblocks"; } -void printErrorMessage(std::string message) { +void displayErrorMessage(std::string message) { fprintf(stderr, "%s\n", message.c_str()); MessageBoxA(NULL, message.c_str(), "Fatal Error", MB_OK); } diff --git a/core/src/platform.h b/core/src/platform.h index 92a8767..ff26517 100644 --- a/core/src/platform.h +++ b/core/src/platform.h @@ -20,4 +20,4 @@ void initProgramDataDir(); void initProgramLogsDir(); // Displays an error message box on Windows, or prints to eprintf -void printErrorMessage(std::string message); \ No newline at end of file +void displayErrorMessage(std::string message); \ No newline at end of file