Files
Client/Server/RylServerProject/RylUIDServer/HanUnitedDisconnID.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
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>
2025-11-29 20:17:20 +09:00

169 lines
5.8 KiB
C++

#include "stdAfx.h"
#include "HanUnitedDisconnID.h"
#include "SendAgentPacket.h"
#include <DB/DBComponent.h>
#include <DB/BillingDBComponent.h>
#include <Log/ServerLog.h>
CHanUnitedDisconnectID& CHanUnitedDisconnectID::GetInstance()
{
static CHanUnitedDisconnectID hanUnitedDisconnectID;
return hanUnitedDisconnectID;
}
CHanUnitedDisconnectID::CHanUnitedDisconnectID()
{
}
CHanUnitedDisconnectID::~CHanUnitedDisconnectID()
{
}
void CHanUnitedDisconnectID::UpdateDisconnectInfo(const DisconnectInfo& disconnectInfo)
{
DisconnectInfoMap::iterator pos = m_DisconnectInfoMap.find(disconnectInfo.m_nUID);
if(pos == m_DisconnectInfoMap.end())
{
m_DisconnectInfoMap.insert(DisconnectInfoMap::value_type(
disconnectInfo.m_nUID, disconnectInfo));
}
else
{
pos->second = disconnectInfo;
}
}
bool CHanUnitedDisconnectID::RemoveDisconnectInfo(int nUID)
{
DisconnectInfoMap::iterator pos = m_DisconnectInfoMap.find(nUID);
if(pos != m_DisconnectInfoMap.end())
{
m_DisconnectInfoMap.erase(pos);
return true;
}
return false;
}
CHanUnitedDisconnectID::DisconnectInfo* CHanUnitedDisconnectID::GetDisconnectInfo(int nUID)
{
DisconnectInfoMap::iterator pos = m_DisconnectInfoMap.find(nUID);
if(pos != m_DisconnectInfoMap.end())
{
return &pos->second;
}
return 0;
}
void CHanUnitedDisconnectID::CheckDisconnect()
{
#pragma pack(1)
struct HanUnitedUserData
{
int m_nUID; //
int m_nServerID; //
int m_nRemainMin; //
char m_cBillingType[2]; // E : 개인정량, T : 개인정액, F : 무료사용자
int m_nEndTime; // 무료, 정액 : 20030225, 정량 : RemainMin
int m_nCRMIndex; // 개인은 0, PC방은 0이상. 보통 개인만 들어온다.
};
#pragma pack()
const int MAX_DATA = CDBSingleObject::MaxRowNum;
HanUnitedUserData hanUnitedUserData[MAX_DATA];
if(!DBComponent::BillingDB::USPCheckTimeoutUser(CDBSingleObject::GetInstance()))
{
ERRLOG1(g_Log, "과금 만료 유저를 얻어오는 데 실패했습니다. GetErrorString() :%s",
CDBSingleObject::GetInstance().GetErrorString());
}
else
{
int nRowNum = 0;
while(CDBSingleObject::GetInstance().GetData(
(void**)hanUnitedUserData, sizeof(HanUnitedUserData), MAX_DATA, &nRowNum))
{
if(0 == nRowNum)
{
break;
}
// 테이블에 UID가 들어 있는지 살핀다.
// 1. 들어 있지 않다.
// 남은 시간을 체크한 후, 0 < time <5 이면 과금 경고 메시지를 보내고 테이블에 삽입.
// 2. 들어 있다.
// 남은 시간을 체크한 후, time <= 0 이면 UserKill을 보내고 테이블에서 제거.
// 유저가 로그아웃하면 테이블에서 제거한다.
HanUnitedUserData* lpHanUnitedUserData = hanUnitedUserData;
HanUnitedUserData* lpHanUnitedUserDataEnd = hanUnitedUserData + nRowNum;
for(; lpHanUnitedUserData != lpHanUnitedUserDataEnd; ++lpHanUnitedUserData)
{
DisconnectInfo* lpDisconnectInfo = GetDisconnectInfo(lpHanUnitedUserData->m_nUID);
if(0 == lpDisconnectInfo)
{
// 남은 시간을 체크한 후, timeout을 보낸다.
AgentSendPacket::SendHanBTN(lpHanUnitedUserData->m_nServerID,
lpHanUnitedUserData->m_nUID, lpHanUnitedUserData->m_nRemainMin,
lpHanUnitedUserData->m_cBillingType[0]);
DETLOG5(g_Log, "UID:%u/ServerID:%u/cRemainMinute:%d/cBillingType:%c/EndTime:%d/유저에게 과금 만료 경고를 보냈습니다.",
lpHanUnitedUserData->m_nUID, lpHanUnitedUserData->m_nServerID,
lpHanUnitedUserData->m_nRemainMin, lpHanUnitedUserData->m_cBillingType[0],
lpHanUnitedUserData->m_nEndTime);
DisconnectInfo disconnInfo;
disconnInfo.m_nUID = lpHanUnitedUserData->m_nUID;
disconnInfo.m_nServerID = lpHanUnitedUserData->m_nServerID;
disconnInfo.m_nRemainMin = lpHanUnitedUserData->m_nRemainMin;
disconnInfo.m_nEndTime = lpHanUnitedUserData->m_nEndTime;
disconnInfo.m_nCRMIndex = lpHanUnitedUserData->m_nCRMIndex;
disconnInfo.m_cBillingType = lpHanUnitedUserData->m_cBillingType[0];
UpdateDisconnectInfo(disconnInfo);
}
else
{
lpDisconnectInfo->m_nServerID = lpHanUnitedUserData->m_nServerID;
lpDisconnectInfo->m_nRemainMin = lpHanUnitedUserData->m_nRemainMin;
lpDisconnectInfo->m_nEndTime = lpHanUnitedUserData->m_nEndTime;
lpDisconnectInfo->m_nCRMIndex = lpHanUnitedUserData->m_nCRMIndex;
lpDisconnectInfo->m_cBillingType = lpHanUnitedUserData->m_cBillingType[0];
if(lpDisconnectInfo->m_nRemainMin <= 0)
{
AgentSendPacket::SendUserKill(lpDisconnectInfo->m_nServerID, lpDisconnectInfo->m_nUID);
DETLOG5(g_Log, "UID:%u/ServerID:%u/cRemainMinute:%d/cBillingType:%c/EndTime:%d/과금이 만료되어 유저의 접속을 끊습니다.",
lpHanUnitedUserData->m_nUID, lpHanUnitedUserData->m_nServerID,
lpHanUnitedUserData->m_nRemainMin, lpHanUnitedUserData->m_cBillingType[0],
lpHanUnitedUserData->m_nEndTime);
RemoveDisconnectInfo(lpDisconnectInfo->m_nUID);
}
}
}
}
}
}