This repository has been archived on 2024-06-01. You can view files and clone it, but cannot push or open issues or pull requests.
cathook/src/chatlog.cpp
2018-05-01 17:09:15 +02:00

140 lines
2.9 KiB
C++

/*
* chatlog.cpp
*
* Created on: Jul 28, 2017
* Author: nullifiedcat
*/
#include "common.hpp"
#include "init.hpp"
#include <pwd.h>
#include <unistd.h>
#include <hacks/Spam.hpp>
namespace chatlog
{
static CatVar enabled(CV_SWITCH, "chat_log", "0", "Chat log", "Log chat to file");
static CatVar dont_log_spam(CV_SWITCH, "chat_log_nospam", "1", "No Spam",
"Don't log your messages if spam is active");
static CatVar dont_log_ipc(CV_SWITCH, "chat_log_noipc", "1", "No IPC",
"Don't log messages sent by bots");
class csv_stream
{
public:
struct end_t
{
};
static end_t end;
public:
csv_stream()
{
open();
}
~csv_stream()
{
stream.close();
}
bool open()
{
logging::Info("csvstream: Trying to open log file");
uid_t uid = geteuid();
struct passwd *pw = getpwuid(uid);
std::string uname = "";
if (pw)
{
uname = std::string(pw->pw_name);
}
stream.open(DATA_PATH "/chat-" + uname + ".csv",
std::ios::out | std::ios::app);
return stream.good();
}
public:
int columns{ 0 };
std::ofstream stream;
};
csv_stream::end_t csv_stream::end{};
csv_stream &operator<<(csv_stream &log, const std::string &string)
{
if (!log.stream.good())
{
logging::Info("[ERROR] csvstream is not open!");
if (!log.open())
return log;
}
if (log.columns)
log.stream << ',';
log.stream << '"';
for (const auto &i : string)
{
if (i == '"')
{
log.stream << '"';
}
log.stream << i;
}
log.stream << '"';
log.columns++;
return log;
}
csv_stream &operator<<(csv_stream &log, const csv_stream::end_t &end)
{
if (!log.stream.good())
{
logging::Info("[ERROR] csvstream is not open!");
if (!log.open())
return log;
}
log.stream << '\n';
log.stream.flush();
log.columns = 0;
return log;
}
csv_stream &logger()
{
static csv_stream object{};
return object;
}
void LogMessage(int eid, std::string message)
{
if (!enabled)
{
return;
}
if (dont_log_spam && hacks::shared::spam::spam_source and
eid == g_IEngine->GetLocalPlayer())
return;
player_info_s info;
if (not g_IEngine->GetPlayerInfo(eid, &info))
return;
if (dont_log_ipc &&
playerlist::AccessData(info.friendsID).state ==
playerlist::k_EState::IPC)
return;
std::string name(info.name);
for (auto &x : name)
{
if (x == '\n' || x == '\r')
x = '*';
}
for (auto &x : message)
{
if (x == '\n' || x == '\r')
x = '*';
}
logger() << std::to_string(time(nullptr)) << std::to_string(info.friendsID)
<< name << message << csv_stream::end;
}
}