//////////////////////////////////////////////////////////////////////////////////////
// akashi - a server for Attorney Online 2 //
// Copyright (C) 2020 scatterflower //
// //
// This program is free software: you can redistribute it and/or modify //
// it under the terms of the GNU Affero General Public License as //
// published by the Free Software Foundation, either version 3 of the //
// License, or (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU Affero General Public License for more details. //
// //
// You should have received a copy of the GNU Affero General Public License //
// along with this program. If not, see . //
//////////////////////////////////////////////////////////////////////////////////////
#include "logger/u_logger.h"
ULogger::ULogger(QObject *parent) :
QObject(parent)
{
switch (ConfigManager::loggingType()) {
case DataTypes::LogType::MODCALL:
writerModcall = new WriterModcall;
break;
case DataTypes::LogType::FULL:
case DataTypes::LogType::FULLAREA:
writerFull = new WriterFull;
break;
}
loadLogtext();
}
ULogger::~ULogger()
{
switch (ConfigManager::loggingType()) {
case DataTypes::LogType::MODCALL:
writerModcall->deleteLater();
break;
case DataTypes::LogType::FULL:
case DataTypes::LogType::FULLAREA:
writerFull->deleteLater();
break;
}
}
void ULogger::logIC(const QString &f_char_name, const QString &f_ooc_name, const QString &f_ipid,
const QString &f_area_name, const QString &f_message)
{
QString l_time = QDateTime::currentDateTime().toString("ddd MMMM d yyyy | hh:mm:ss");
QString l_logEntry = QString(m_logtext.value("ic") + "\n").arg(l_time, f_char_name, f_ooc_name, f_ipid, f_area_name, f_message);
updateAreaBuffer(f_area_name, l_logEntry);
}
void ULogger::logOOC(const QString &f_char_name, const QString &f_ooc_name, const QString &f_ipid,
const QString &f_area_name, const QString &f_message)
{
QString l_time = QDateTime::currentDateTime().toString("ddd MMMM d yyyy | hh:mm:ss");
QString l_logEntry = QString(m_logtext.value("ooc") + "\n")
.arg(l_time, f_char_name, f_ooc_name, f_ipid, f_area_name, f_message);
updateAreaBuffer(f_area_name, l_logEntry);
}
void ULogger::logLogin(const QString &f_char_name, const QString &f_ooc_name, const QString &f_moderator_name,
const QString &f_ipid, const QString &f_area_name, const bool &f_success)
{
QString l_time = QDateTime::currentDateTime().toString("ddd MMMM d yyyy | hh:mm:ss");
QString l_success = f_success ? "SUCCESS][" + f_moderator_name : "FAILED][" + f_moderator_name;
QString l_logEntry = QString(m_logtext.value("login") + "\n")
.arg(l_time, l_success, f_ipid, f_char_name, f_ooc_name);
updateAreaBuffer(f_area_name, l_logEntry);
}
void ULogger::logCMD(const QString &f_char_name, const QString &f_ipid, const QString &f_ooc_name, const QString &f_command,
const QStringList &f_args, const QString &f_area_name)
{
QString l_time = QDateTime::currentDateTime().toString("ddd MMMM d yyyy | hh:mm:ss");
QString l_logEntry;
// Some commands contain sensitive data, like passwords
// These must be filtered out
if (f_command == "login") {
l_logEntry = QString(m_logtext.value("cmdlogin") + "\n")
.arg(l_time, f_area_name, f_char_name, f_ooc_name, f_ipid);
}
else if (f_command == "rootpass") {
l_logEntry = QString(m_logtext.value("cmdrootpass") + "\n")
.arg(l_time, f_area_name, f_char_name, f_ooc_name, f_ipid);
}
else if (f_command == "adduser" && !f_args.isEmpty()) {
l_logEntry = QString(m_logtext.value("adduser") + "\n")
.arg(l_time, f_area_name, f_char_name, f_ooc_name, f_args.at(0), f_ipid);
}
else if (f_command == "pm") {
l_logEntry = QString(m_logtext.value("pm") + "\n")
.arg(l_time, f_area_name, f_char_name, f_ooc_name, f_ipid);
}
else {
l_logEntry = QString(m_logtext.value("cmd") + "\n")
.arg(l_time, f_area_name, f_char_name, f_ooc_name, f_command, f_args.join(" "), f_ipid);
}
updateAreaBuffer(f_area_name, l_logEntry);
}
void ULogger::logKick(const QString &f_moderator, const QString &f_target_ipid)
{
QString l_time = QDateTime::currentDateTime().toString("ddd MMMM d yyyy | hh:mm:ss");
QString l_logEntry = QString(m_logtext.value("kick") + "\n")
.arg(l_time, f_moderator, f_target_ipid);
updateAreaBuffer("SERVER", l_logEntry);
}
void ULogger::logBan(const QString &f_moderator, const QString &f_target_ipid, const QString &f_duration)
{
QString l_time = QDateTime::currentDateTime().toString("ddd MMMM d yyyy | hh:mm:ss");
QString l_logEntry = QString(m_logtext.value("ban") + "\n")
.arg(l_time, f_moderator, f_target_ipid, f_duration);
updateAreaBuffer("SERVER", l_logEntry);
}
void ULogger::logModcall(const QString &f_char_name, const QString &f_ipid, const QString &f_ooc_name, const QString &f_area_name)
{
QString l_time = QDateTime::currentDateTime().toString("ddd MMMM d yyyy | hh:mm:ss");
QString l_logEvent = QString(m_logtext.value("modcall") + "\n")
.arg(l_time, f_area_name, f_char_name, f_ooc_name, f_ipid);
updateAreaBuffer(f_area_name, l_logEvent);
if (ConfigManager::loggingType() == DataTypes::LogType::MODCALL) {
writerModcall->flush(f_area_name, buffer(f_area_name));
}
}
void ULogger::logConnectionAttempt(const QString &f_ip_address, const QString &f_ipid, const QString &f_hwid)
{
QString l_time = QDateTime::currentDateTime().toString("ddd MMMM d yyyy | hh:mm:ss");
QString l_logEntry = QString(m_logtext.value("connect") + "\n")
.arg(l_time, f_ip_address, f_ipid, f_hwid);
updateAreaBuffer("SERVER", l_logEntry);
}
void ULogger::loadLogtext()
{
// All of this to prevent one single clazy warning from appearing.
for (auto iterator = m_logtext.keyBegin(), end = m_logtext.keyEnd(); iterator != end; ++iterator) {
QString l_tempstring = ConfigManager::LogText(iterator.operator*());
if (!l_tempstring.isEmpty()) {
m_logtext[iterator.operator*()] = l_tempstring;
}
}
}
void ULogger::updateAreaBuffer(const QString &f_area_name, const QString &f_log_entry)
{
QQueue l_buffer = m_bufferMap.value(f_area_name);
if (l_buffer.length() <= ConfigManager::logBuffer()) {
l_buffer.enqueue(f_log_entry);
}
else {
l_buffer.dequeue();
l_buffer.enqueue(f_log_entry);
}
m_bufferMap.insert(f_area_name, l_buffer);
if (ConfigManager::loggingType() == DataTypes::LogType::FULL) {
writerFull->flush(f_log_entry);
}
if (ConfigManager::loggingType() == DataTypes::LogType::FULLAREA) {
writerFull->flush(f_log_entry, f_area_name);
}
}
QQueue ULogger::buffer(const QString &f_area_name)
{
return m_bufferMap.value(f_area_name);
}