iw5-mod/src/module/log_file.cpp
2023-01-29 16:31:52 +00:00

91 lines
2.2 KiB
C++

#include <std_include.hpp>
#include <loader/module_loader.hpp>
#include "game/game.hpp"
#include "game/engine/scoped_critical_section.hpp"
#include "log_file.hpp"
#include "file_system.hpp"
std::mutex log_file::log_file_mutex;
const char* log_file::log_file_name;
int log_file::opening_qconsole = 0;
int log_file::com_console_log_open_failed = 0;
const game::native::dvar_t* log_file::com_logfile;
void log_file::com_open_log_file()
{
time_t aclock;
char time_buffer[32]{};
if (game::native::Sys_IsMainThread() && !opening_qconsole)
{
opening_qconsole = 1;
tm new_time{};
_time64(&aclock);
_localtime64_s(&new_time, &aclock);
file_system::open_file_by_mode(log_file_name, game::native::logfile, game::native::FS_APPEND_SYNC);
asctime_s(time_buffer, sizeof(time_buffer), &new_time);
std::cout << "logfile opened on " << time_buffer << "\n"; // no recursive call to 'info'
opening_qconsole = 0;
com_console_log_open_failed = *game::native::logfile == 0;
}
}
void log_file::com_log_print_message(const std::string& msg)
{
char print_buffer[0x40]{};
game::engine::scoped_critical_section crit_sect_lock(game::native::CRITSECT_CONSOLE, game::native::SCOPED_CRITSECT_NORMAL);
if (!game::native::FS_Initialized())
{
return;
}
if (!*game::native::logfile)
{
com_open_log_file();
}
if (*game::native::logfile)
{
static auto log_next_time_stamp = true;
if (log_next_time_stamp)
{
const auto len = sprintf_s(print_buffer, "[%10i] ", game::native::Sys_Milliseconds());
file_system::write(print_buffer, len, *game::native::logfile);
}
log_next_time_stamp = (msg.find('\n') != std::string::npos);
file_system::write(msg.data(), static_cast<int>(msg.size()), *game::native::logfile);
}
}
void log_file::info(const std::string& msg)
{
std::lock_guard _(log_file_mutex);
if (com_logfile && com_logfile->current.integer)
{
com_log_print_message(msg);
}
}
void log_file::post_load()
{
// The game closes the logfile handle in Com_Quit_f
com_logfile = game::native::Dvar_RegisterInt("logfile", 1,
0, 2, game::native::DVAR_NONE, "Write to log file - 0 = disabled, 1 = async file write, 2 = Sync every write");
log_file_name = SELECT_VALUE("console_sp.log", "console_mp.log");
}
REGISTER_MODULE(log_file)