[Logger]: Make use of Scr_LogString & ScrCmd_LogString_Stub (#895)
This commit is contained in:
parent
3f5db59ff1
commit
daf6da1cfa
@ -3,10 +3,16 @@
|
|||||||
|
|
||||||
namespace Components
|
namespace Components
|
||||||
{
|
{
|
||||||
|
using namespace Utils::String;
|
||||||
|
|
||||||
std::mutex Logger::MessageMutex;
|
std::mutex Logger::MessageMutex;
|
||||||
std::vector<std::string> Logger::MessageQueue;
|
std::vector<std::string> Logger::MessageQueue;
|
||||||
|
|
||||||
|
std::mutex Logger::LoggingMutex;
|
||||||
std::vector<Network::Address> Logger::LoggingAddresses[2];
|
std::vector<Network::Address> Logger::LoggingAddresses[2];
|
||||||
|
|
||||||
|
Dvar::Var Logger::IW4x_oneLog;
|
||||||
|
|
||||||
void(*Logger::PipeCallback)(const std::string&) = nullptr;;
|
void(*Logger::PipeCallback)(const std::string&) = nullptr;;
|
||||||
|
|
||||||
bool Logger::IsConsoleReady()
|
bool Logger::IsConsoleReady()
|
||||||
@ -23,7 +29,7 @@ namespace Components
|
|||||||
vsnprintf_s(buf, _TRUNCATE, message, va);
|
vsnprintf_s(buf, _TRUNCATE, message, va);
|
||||||
va_end(va);
|
va_end(va);
|
||||||
|
|
||||||
MessagePrint(channel, {buf});
|
MessagePrint(channel, std::string{ buf });
|
||||||
}
|
}
|
||||||
|
|
||||||
void Logger::MessagePrint(const int channel, const std::string& msg)
|
void Logger::MessagePrint(const int channel, const std::string& msg)
|
||||||
@ -145,6 +151,7 @@ namespace Components
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::unique_lock lock(LoggingMutex);
|
||||||
for (const auto& addr : LoggingAddresses[gLog & 1])
|
for (const auto& addr : LoggingAddresses[gLog & 1])
|
||||||
{
|
{
|
||||||
Network::SendCommand(addr, "print", data);
|
Network::SendCommand(addr, "print", data);
|
||||||
@ -216,13 +223,13 @@ namespace Components
|
|||||||
|
|
||||||
void Logger::RedirectOSPath(const char* file, char* folder)
|
void Logger::RedirectOSPath(const char* file, char* folder)
|
||||||
{
|
{
|
||||||
if (Dvar::Var("g_log").get<std::string>() == file)
|
if (std::strcmp((*Game::g_log)->current.string, file) == 0)
|
||||||
{
|
{
|
||||||
if (folder != "userraw"s)
|
if (std::strcmp(folder, "userraw") != 0)
|
||||||
{
|
{
|
||||||
if (Dvar::Var("iw4x_onelog").get<bool>())
|
if (IW4x_oneLog.get<bool>())
|
||||||
{
|
{
|
||||||
strcpy_s(folder, 256, "userraw");
|
strncpy_s(folder, 256, "userraw", _TRUNCATE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -234,11 +241,9 @@ namespace Components
|
|||||||
{
|
{
|
||||||
pushad
|
pushad
|
||||||
|
|
||||||
push [esp + 28h]
|
push [esp + 20h + 8h]
|
||||||
push [esp + 30h]
|
push [esp + 20h + 10h]
|
||||||
|
|
||||||
call RedirectOSPath
|
call RedirectOSPath
|
||||||
|
|
||||||
add esp, 8h
|
add esp, 8h
|
||||||
|
|
||||||
popad
|
popad
|
||||||
@ -253,14 +258,25 @@ namespace Components
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Logger::LSP_LogString_Stub([[maybe_unused]] int localControllerIndex, const char* string)
|
||||||
|
{
|
||||||
|
NetworkLog(string, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Logger::LSP_LogStringAboutUser_Stub([[maybe_unused]] int localControllerIndex, std::uint64_t xuid, const char* string)
|
||||||
|
{
|
||||||
|
NetworkLog(VA("%" PRIx64 ";%s", xuid, string), false);
|
||||||
|
}
|
||||||
|
|
||||||
void Logger::AddServerCommands()
|
void Logger::AddServerCommands()
|
||||||
{
|
{
|
||||||
Command::AddSV("log_add", [](Command::Params* params)
|
Command::AddSV("log_add", [](Command::Params* params)
|
||||||
{
|
{
|
||||||
if (params->size() < 2) return;
|
if (params->size() < 2) return;
|
||||||
|
|
||||||
Network::Address addr(params->get(1));
|
std::unique_lock lock(LoggingMutex);
|
||||||
|
|
||||||
|
Network::Address addr(params->get(1));
|
||||||
if (std::find(LoggingAddresses[0].begin(), LoggingAddresses[0].end(), addr) == LoggingAddresses[0].end())
|
if (std::find(LoggingAddresses[0].begin(), LoggingAddresses[0].end(), addr) == LoggingAddresses[0].end())
|
||||||
{
|
{
|
||||||
LoggingAddresses[0].push_back(addr);
|
LoggingAddresses[0].push_back(addr);
|
||||||
@ -271,8 +287,10 @@ namespace Components
|
|||||||
{
|
{
|
||||||
if (params->size() < 2) return;
|
if (params->size() < 2) return;
|
||||||
|
|
||||||
|
std::unique_lock lock(LoggingMutex);
|
||||||
|
|
||||||
const auto num = std::atoi(params->get(1));
|
const auto num = std::atoi(params->get(1));
|
||||||
if (!std::strcmp(Utils::String::VA("%i", num), params->get(1)) && static_cast<unsigned int>(num) < LoggingAddresses[0].size())
|
if (!std::strcmp(VA("%i", num), params->get(1)) && static_cast<unsigned int>(num) < LoggingAddresses[0].size())
|
||||||
{
|
{
|
||||||
auto addr = Logger::LoggingAddresses[0].begin() + num;
|
auto addr = Logger::LoggingAddresses[0].begin() + num;
|
||||||
Print("Address {} removed\n", addr->getString());
|
Print("Address {} removed\n", addr->getString());
|
||||||
@ -300,6 +318,8 @@ namespace Components
|
|||||||
Print("# ID: Address\n");
|
Print("# ID: Address\n");
|
||||||
Print("-------------\n");
|
Print("-------------\n");
|
||||||
|
|
||||||
|
std::unique_lock lock(LoggingMutex);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < LoggingAddresses[0].size(); ++i)
|
for (unsigned int i = 0; i < LoggingAddresses[0].size(); ++i)
|
||||||
{
|
{
|
||||||
Print("#{:03d}: {}\n", i, LoggingAddresses[0][i].getString());
|
Print("#{:03d}: {}\n", i, LoggingAddresses[0][i].getString());
|
||||||
@ -310,8 +330,9 @@ namespace Components
|
|||||||
{
|
{
|
||||||
if (params->size() < 2) return;
|
if (params->size() < 2) return;
|
||||||
|
|
||||||
const Network::Address addr(params->get(1));
|
std::unique_lock lock(LoggingMutex);
|
||||||
|
|
||||||
|
const Network::Address addr(params->get(1));
|
||||||
if (std::find(LoggingAddresses[1].begin(), LoggingAddresses[1].end(), addr) == LoggingAddresses[1].end())
|
if (std::find(LoggingAddresses[1].begin(), LoggingAddresses[1].end(), addr) == LoggingAddresses[1].end())
|
||||||
{
|
{
|
||||||
LoggingAddresses[1].push_back(addr);
|
LoggingAddresses[1].push_back(addr);
|
||||||
@ -322,8 +343,10 @@ namespace Components
|
|||||||
{
|
{
|
||||||
if (params->size() < 2) return;
|
if (params->size() < 2) return;
|
||||||
|
|
||||||
|
std::unique_lock lock(LoggingMutex);
|
||||||
|
|
||||||
const auto num = std::atoi(params->get(1));
|
const auto num = std::atoi(params->get(1));
|
||||||
if (!std::strcmp(Utils::String::VA("%i", num), params->get(1)) && static_cast<unsigned int>(num) < LoggingAddresses[1].size())
|
if (!std::strcmp(VA("%i", num), params->get(1)) && static_cast<unsigned int>(num) < LoggingAddresses[1].size())
|
||||||
{
|
{
|
||||||
const auto addr = LoggingAddresses[1].begin() + num;
|
const auto addr = LoggingAddresses[1].begin() + num;
|
||||||
Print("Address {} removed\n", addr->getString());
|
Print("Address {} removed\n", addr->getString());
|
||||||
@ -332,7 +355,6 @@ namespace Components
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
const Network::Address addr(params->get(1));
|
const Network::Address addr(params->get(1));
|
||||||
|
|
||||||
const auto i = std::ranges::find(LoggingAddresses[1].begin(), LoggingAddresses[1].end(), addr);
|
const auto i = std::ranges::find(LoggingAddresses[1].begin(), LoggingAddresses[1].end(), addr);
|
||||||
if (i != LoggingAddresses[1].end())
|
if (i != LoggingAddresses[1].end())
|
||||||
{
|
{
|
||||||
@ -351,6 +373,7 @@ namespace Components
|
|||||||
Print("# ID: Address\n");
|
Print("# ID: Address\n");
|
||||||
Print("-------------\n");
|
Print("-------------\n");
|
||||||
|
|
||||||
|
std::unique_lock lock(LoggingMutex);
|
||||||
for (std::size_t i = 0; i < LoggingAddresses[1].size(); ++i)
|
for (std::size_t i = 0; i < LoggingAddresses[1].size(); ++i)
|
||||||
{
|
{
|
||||||
Print("#{:03d}: {}\n", i, LoggingAddresses[1][i].getString());
|
Print("#{:03d}: {}\n", i, LoggingAddresses[1][i].getString());
|
||||||
@ -360,7 +383,7 @@ namespace Components
|
|||||||
|
|
||||||
Logger::Logger()
|
Logger::Logger()
|
||||||
{
|
{
|
||||||
Dvar::Register<bool>("iw4x_onelog", false, Game::DVAR_LATCH | Game::DVAR_ARCHIVE, "Only write the game log to the 'userraw' OS folder");
|
IW4x_oneLog = Dvar::Register<bool>("iw4x_onelog", false, Game::DVAR_LATCH, "Only write the game log to the 'userraw' OS folder");
|
||||||
Utils::Hook(0x642139, BuildOSPath_Stub, HOOK_JUMP).install()->quick();
|
Utils::Hook(0x642139, BuildOSPath_Stub, HOOK_JUMP).install()->quick();
|
||||||
|
|
||||||
Scheduler::Loop(Frame, Scheduler::Pipeline::SERVER);
|
Scheduler::Loop(Frame, Scheduler::Pipeline::SERVER);
|
||||||
@ -368,6 +391,9 @@ namespace Components
|
|||||||
Utils::Hook(Game::G_LogPrintf, G_LogPrintf_Hk, HOOK_JUMP).install()->quick();
|
Utils::Hook(Game::G_LogPrintf, G_LogPrintf_Hk, HOOK_JUMP).install()->quick();
|
||||||
Utils::Hook(Game::Com_PrintMessage, PrintMessage_Stub, HOOK_JUMP).install()->quick();
|
Utils::Hook(Game::Com_PrintMessage, PrintMessage_Stub, HOOK_JUMP).install()->quick();
|
||||||
|
|
||||||
|
Utils::Hook(0x5F67AE, LSP_LogString_Stub, HOOK_CALL).install()->quick(); // Scr_LogString
|
||||||
|
Utils::Hook(0x5F67EE, LSP_LogStringAboutUser_Stub, HOOK_CALL).install()->quick(); // ScrCmd_LogString_Stub
|
||||||
|
|
||||||
if (Loader::IsPerformingUnitTests())
|
if (Loader::IsPerformingUnitTests())
|
||||||
{
|
{
|
||||||
Utils::Hook(Game::Com_Printf, Print_Stub, HOOK_JUMP).install()->quick();
|
Utils::Hook(Game::Com_Printf, Print_Stub, HOOK_JUMP).install()->quick();
|
||||||
@ -378,12 +404,12 @@ namespace Components
|
|||||||
|
|
||||||
Logger::~Logger()
|
Logger::~Logger()
|
||||||
{
|
{
|
||||||
|
std::unique_lock lock_logging(LoggingMutex);
|
||||||
LoggingAddresses[0].clear();
|
LoggingAddresses[0].clear();
|
||||||
LoggingAddresses[1].clear();
|
LoggingAddresses[1].clear();
|
||||||
|
|
||||||
std::unique_lock lock(MessageMutex);
|
std::unique_lock lock_message(MessageMutex);
|
||||||
MessageQueue.clear();
|
MessageQueue.clear();
|
||||||
lock.unlock();
|
|
||||||
|
|
||||||
// Flush the console log
|
// Flush the console log
|
||||||
if (*Game::logfile)
|
if (*Game::logfile)
|
||||||
|
@ -110,8 +110,12 @@ namespace Components
|
|||||||
private:
|
private:
|
||||||
static std::mutex MessageMutex;
|
static std::mutex MessageMutex;
|
||||||
static std::vector<std::string> MessageQueue;
|
static std::vector<std::string> MessageQueue;
|
||||||
|
|
||||||
|
static std::mutex LoggingMutex;
|
||||||
static std::vector<Network::Address> LoggingAddresses[2];
|
static std::vector<Network::Address> LoggingAddresses[2];
|
||||||
|
|
||||||
|
static Dvar::Var IW4x_oneLog;
|
||||||
|
|
||||||
static void(*PipeCallback)(const std::string&);
|
static void(*PipeCallback)(const std::string&);
|
||||||
|
|
||||||
static void MessagePrint(int channel, const std::string& msg);
|
static void MessagePrint(int channel, const std::string& msg);
|
||||||
@ -128,6 +132,9 @@ namespace Components
|
|||||||
|
|
||||||
static void NetworkLog(const char* data, bool gLog);
|
static void NetworkLog(const char* data, bool gLog);
|
||||||
|
|
||||||
|
static void LSP_LogString_Stub(int localControllerIndex, const char* string);
|
||||||
|
static void LSP_LogStringAboutUser_Stub(int localControllerIndex, std::uint64_t xuid, const char* string);
|
||||||
|
|
||||||
static void AddServerCommands();
|
static void AddServerCommands();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -71,6 +71,7 @@ namespace Game
|
|||||||
const dvar_t** g_oldVoting = reinterpret_cast<const dvar_t**>(0x1A45DEC);
|
const dvar_t** g_oldVoting = reinterpret_cast<const dvar_t**>(0x1A45DEC);
|
||||||
const dvar_t** g_gametype = reinterpret_cast<const dvar_t**>(0x1A45DC8);
|
const dvar_t** g_gametype = reinterpret_cast<const dvar_t**>(0x1A45DC8);
|
||||||
const dvar_t** g_password = reinterpret_cast<const dvar_t**>(0x18835C0);
|
const dvar_t** g_password = reinterpret_cast<const dvar_t**>(0x18835C0);
|
||||||
|
const dvar_t** g_log = reinterpret_cast<const dvar_t**>(0x1A45D9C);
|
||||||
|
|
||||||
const dvar_t** cg_chatHeight = reinterpret_cast<const dvar_t**>(0x7ED398);
|
const dvar_t** cg_chatHeight = reinterpret_cast<const dvar_t**>(0x7ED398);
|
||||||
const dvar_t** cg_chatTime = reinterpret_cast<const dvar_t**>(0x9F5DE8);
|
const dvar_t** cg_chatTime = reinterpret_cast<const dvar_t**>(0x9F5DE8);
|
||||||
|
@ -123,6 +123,7 @@ namespace Game
|
|||||||
extern const dvar_t** g_oldVoting;
|
extern const dvar_t** g_oldVoting;
|
||||||
extern const dvar_t** g_gametype;
|
extern const dvar_t** g_gametype;
|
||||||
extern const dvar_t** g_password;
|
extern const dvar_t** g_password;
|
||||||
|
extern const dvar_t** g_log;
|
||||||
|
|
||||||
extern const dvar_t** cg_chatHeight;
|
extern const dvar_t** cg_chatHeight;
|
||||||
extern const dvar_t** cg_chatTime;
|
extern const dvar_t** cg_chatTime;
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
#include <cinttypes>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
Loading…
Reference in New Issue
Block a user