Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
146 lines
4.8 KiB
C++
146 lines
4.8 KiB
C++
#include "stdafx.h"
|
|
#include "MonitoringTool.h"
|
|
#include "MonitoringToolLog.h"
|
|
#include "MonitoringToolSetup.h"
|
|
|
|
#include <Log/ServerLog.h>
|
|
#include <Network/Packet/PacketStruct/CharCommunityPacket.h>
|
|
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
|
#include <UserManage/UserStatistics.h>
|
|
#include <Utility/Setup/ServerSetup.h>
|
|
|
|
CServerLog g_ChattingLog("ChatLog", 0);
|
|
CServerLog g_UserStatLog("UserStatLog", 0);
|
|
|
|
CMonitoringToolLog::CMonitoringToolLog()
|
|
{
|
|
}
|
|
|
|
CMonitoringToolLog::~CMonitoringToolLog()
|
|
{
|
|
}
|
|
|
|
/// \brief 채팅 패킷을 파싱하여 로그로 출력
|
|
/// \param lpChatData 채팅 패킷
|
|
bool CMonitoringToolLog::WriteChatLog(ChatToolPkt::ChatDataSend* lpChatData)
|
|
{
|
|
SYSTEMTIME sysTime;
|
|
GetLocalTime(&sysTime);
|
|
|
|
SERVER_ID serverID;
|
|
serverID.dwID = lpChatData->m_dwServerID;
|
|
|
|
char strRecvMsg[UCHAR_MAX * 2];
|
|
memcpy(strRecvMsg, reinterpret_cast<char*>(lpChatData + 1), lpChatData->m_cChatMsgLen);
|
|
strRecvMsg[lpChatData->m_cChatMsgLen] = 0;
|
|
|
|
if(lpChatData->m_cChatType == PktChat::DICE)
|
|
{
|
|
g_ChattingLog.Log("[%04d-%02d-%02d %02d:%02d:%02d]"
|
|
"[ServerID:0x%08x][Group:%-15s][Zone:%2d][CH:%2d][X:%4d][Z:%4d][UID:%10d][CID:%10d][Type:%2d][S:%-15s][T:%-15s][주사위:%s]\r\n",
|
|
sysTime.wYear, sysTime.wMonth, sysTime.wDay,
|
|
sysTime.wHour, sysTime.wMinute, sysTime.wSecond,
|
|
lpChatData->m_dwServerID, theApp.GetServerName((unsigned int)serverID.GetGroup()), serverID.GetZone(), serverID.GetChannel(),
|
|
lpChatData->m_usXPos, lpChatData->m_usZPos, lpChatData->m_dwUID, lpChatData->m_dwCID, lpChatData->m_cChatType + 1,
|
|
lpChatData->m_szSenderName, lpChatData->m_szTargetName, strRecvMsg);
|
|
}
|
|
else
|
|
{
|
|
g_ChattingLog.Log("[%04d-%02d-%02d %02d:%02d:%02d]"
|
|
"[ServerID:0x%08x][Group:%-15s][Zone:%2d][CH:%2d][X:%4d][Z:%4d][UID:%10d][CID:%10d][Type:%2d][S:%-15s][T:%-15s][%s]\r\n",
|
|
sysTime.wYear, sysTime.wMonth, sysTime.wDay,
|
|
sysTime.wHour, sysTime.wMinute, sysTime.wSecond,
|
|
lpChatData->m_dwServerID, theApp.GetServerName((unsigned int)serverID.GetGroup()), serverID.GetZone(), serverID.GetChannel(),
|
|
lpChatData->m_usXPos, lpChatData->m_usZPos, lpChatData->m_dwUID, lpChatData->m_dwCID, lpChatData->m_cChatType + 1,
|
|
lpChatData->m_szSenderName, lpChatData->m_szTargetName, strRecvMsg);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CMonitoringToolLog::WriteAdminLog(unsigned char cChatType, unsigned char* szGMName, unsigned char* szUserName, unsigned char* strRecvMsg)
|
|
{
|
|
SYSTEMTIME sysTime;
|
|
GetLocalTime(&sysTime);
|
|
|
|
g_ChattingLog.Log("[%04d-%02d-%02d %02d:%02d:%02d]"
|
|
"[ServerID:0x%08x][Group:%-15s][Zone:%2d][CH:%2d][X:%4d][Z:%4d][UID:%10d][CID:%10d][Type:%2d][S:%-15s][T:%-15s][%s]\r\n",
|
|
sysTime.wYear, sysTime.wMonth, sysTime.wDay,
|
|
sysTime.wHour, sysTime.wMinute, sysTime.wSecond,
|
|
0, "Tool", 0, 0, 0, 0, 0, 0, cChatType,
|
|
szGMName, szUserName, strRecvMsg);
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
/// \brief 동시 접속자 정보를 로그로 출력
|
|
/// \note 관리서버로부터 동접정보를 전달받음
|
|
bool CMonitoringToolLog::WriteUserStatLog()
|
|
{
|
|
CMonitoringToolSetup Setup = CMonitoringToolSetup::GetInstance();
|
|
|
|
const unsigned int nMaxZone = Setup.GetInt(_T("ZONE_INFO"), _T("ZONE_NUM"), 0);
|
|
const unsigned int nMaxGroup = Setup.GetInt(_T("SERVER_GROUP_INFO"), _T("SERVER_GROUP_NUM"), 0);
|
|
const unsigned int nMaxChannel = Setup.GetInt(_T("CHANNEL_INFO"), _T("CHANNEL_NUM"), 0);
|
|
|
|
SYSTEMTIME sysTime;
|
|
GetLocalTime(&sysTime);
|
|
char szKey[MAX_PATH];
|
|
|
|
CString strLog;
|
|
for (unsigned int nIndex = 0; nIndex < nMaxGroup; ++nIndex)
|
|
{
|
|
strLog.AppendFormat(_T("%04d-%02d-%02d %02d:%02d:%02d"),
|
|
sysTime.wYear, sysTime.wMonth, sysTime.wDay,
|
|
sysTime.wHour, sysTime.wMinute, sysTime.wSecond);
|
|
|
|
SERVER_ID serverID;
|
|
serverID.dwID = 0;
|
|
serverID.sID.Type = CServerSetup::GameServer;
|
|
|
|
_snprintf(szKey, MAX_PATH, _T("SERVER_GROUP_INDEX_%02d"), nIndex);
|
|
serverID.sID.Group = Setup.GetInt(_T("SERVER_GROUP_INFO"), szKey, 100);
|
|
|
|
strLog.AppendFormat(_T("\t%02d"), serverID.GetGroup());
|
|
|
|
for (unsigned int nIdx = 0; nIdx < nMaxZone; ++nIdx)
|
|
{
|
|
for (unsigned int nCH = 0; nCH < nMaxChannel; ++nCH)
|
|
{
|
|
_snprintf(szKey, MAX_PATH, _T("ZONE_INDEX_%02d"), nIdx);
|
|
serverID.sID.ID = Setup.GetInt(_T("ZONE_INFO"), szKey, 100);
|
|
serverID.sID.Channel = nCH;
|
|
|
|
strLog.AppendFormat(_T("\t%4d"), CUserStatistics::GetInstance().GetUserNum(serverID.dwID));
|
|
}
|
|
}
|
|
strLog.Append(_T("\r\n"));
|
|
|
|
g_UserStatLog.Log(strLog);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/// \brief 동접로그의 컬럼명을 출력
|
|
/// \param strLog 컬럼명(예: WriteTime GroupIndex Z:01 C: 01 Z02: C:01)
|
|
/// \note 셋업에따라 컬럼명이 달라지며 로그 출력시 처음 한번만 호출된다.
|
|
bool CMonitoringToolLog::WriteUserStatLog(const CString& strLog)
|
|
{
|
|
g_UserStatLog.Log(strLog);
|
|
|
|
return true;
|
|
}
|
|
|
|
/// \brief 버퍼에 누적된 채팅로그를 출력
|
|
void CMonitoringToolLog::FlushChatLog()
|
|
{
|
|
g_ChattingLog.Flush();
|
|
}
|
|
|
|
/// \brief 버퍼에 누적된 동접로그를 출력
|
|
void CMonitoringToolLog::FlushStatLog()
|
|
{
|
|
g_UserStatLog.Flush();
|
|
} |