#include "stdafx.h" #include "Billing.h" #include "SessionData.h" #include #include #include #include namespace DBAgent { namespace DataStorage { enum BillingConst { SENDED_BILLING_TIMEOUT_NOTIFY = (1 << 0) }; CBilling::CBilling() : m_nLoginTime(0), m_nPlayTime(0), m_dwCRMIndex1(0), m_cBillingType(0), m_cFlags(0), m_eWarnMsgType(WARN_BEFORE_1SEC) { } CBilling::~CBilling() { } void CBilling::StartBilling(int nPlayTime, unsigned long dwCRMIndex1, unsigned char cBillingType) { m_nLoginTime = time(0); m_nPlayTime = nPlayTime; m_dwCRMIndex1 = dwCRMIndex1; m_cBillingType = cBillingType; m_cFlags = 0; } void CBilling::ClearBilling() { m_nLoginTime = 0; m_nPlayTime = 0; m_dwCRMIndex1 = 0; m_cBillingType = 0; m_cFlags = 0; } void CBilling::AddYouxiLandPoint(int nAdditionalPoint, unsigned char cBillingType) { m_nPlayTime += nAdditionalPoint; m_cBillingType = cBillingType; m_cFlags &= ~SENDED_BILLING_TIMEOUT_NOTIFY; } bool CBilling::CheckBilling(const CSessionData& SessionData, time_t nCurrentTime) { // ·Î±×ÀÎ Á¤º¸°¡ ¼¼ÆÃµÇ¾ú°í, PC¹æÀÌ ¾Æ´Ï°í, // ÇöÀç CHAR_ENABLED»óÅÂÀ̰í, // ÇѰÔÀÓ ÅëÇÕºô¸µÀÌ ¾Æ´Ñ °æ¿ì¿¡¸¸ ºô¸µ üũ. if (0 != m_nLoginTime && 0 == m_dwCRMIndex1 && CSessionData::SE_CHAR_ENABLED == SessionData.GetSessionState() && CServerSetup::GamaUnitedBilling != CServerSetup::GetInstance().GetBillingType()) { switch(m_cBillingType) { case 'T': // Á¤·®Á¦. m_nPlayTimeÀº ºÐ´ÜÀ§ { // Ãß°¡½Ã°£ 20ÃÊ ´õ ÁÜ. int nRemainSecond = int(m_nPlayTime * 60 + m_nLoginTime - nCurrentTime) + 20; // 5ºÐ ÀüºÎÅÍ °øÁö ³¯¸². if (0 < nRemainSecond && nRemainSecond <= 300 && !(m_cFlags & SENDED_BILLING_TIMEOUT_NOTIFY)) { // Ç÷¡±× ¼¼ÆÃ(µÎ¹ø ÀÌ ·çƾÀ¸·Î ¸ø µé¾î¿À°Ô Çϱâ À§Çؼ­.. m_cFlags |= SENDED_BILLING_TIMEOUT_NOTIFY; // Ŭ¶óÀÌ¾ðÆ®¿¡ ¸Å ºÐ¸¶´Ù °øÁö ³¯¸®¶ó°í ÆÐŶ º¸³»±â. SendPacket::BillingNotify(SessionData, static_cast((nRemainSecond + 30)/60), m_cBillingType); } else if (nRemainSecond <= 0) { DETLOG2(g_Log, "UID:%10u/CID:%10u/Á¤·®Á¦ »ç¿ë À¯Àú Á¢¼Ó ÇØÁ¦ : ½Ã°£ ¸¸·á", SessionData.GetUID(), SessionData.GetCID()); return false; } } break; case 'D': // Á¤¾×Á¦. m_nPlayTimeÀº ¸¸·á±îÁö ³²Àº ÀÏ ¼ö { const struct tm CurrentTime = *localtime(&nCurrentTime); const struct tm LoginTime = *localtime(&m_nLoginTime); // ÇÏ·ç ³²¾Ò°í, ÇöÀç ½Ã°£ÀÌ Á¤°¢¿¡¼­ 5ºÐ ÀüÀ̸é, ¸Å ºÐ¸¶´Ù °øÁö¸¦ ³¯¸®¶ó°í ÆÐŶÀ» º¸³½´Ù. if(LoginTime.tm_yday + m_nPlayTime - 1 == CurrentTime.tm_yday && 23 == CurrentTime.tm_hour && 55 <= CurrentTime.tm_min && !(m_cFlags & SENDED_BILLING_TIMEOUT_NOTIFY)) { // Ç÷¡±× ¼¼ÆÃ(µÎ¹ø ÀÌ ·çƾÀ¸·Î ¸ø µé¾î¿À°Ô Çϱâ À§Çؼ­.. m_cFlags |= SENDED_BILLING_TIMEOUT_NOTIFY; // Ŭ¶óÀÌ¾ðÆ®¿¡ ¸Å ºÐ¸¶´Ù °øÁö ³¯¸®¶ó°í ÆÐŶ º¸³»±â. SendPacket::BillingNotify(SessionData, static_cast(60 - CurrentTime.tm_min), m_cBillingType); } else if(LoginTime.tm_yday + static_cast(m_nPlayTime) <= CurrentTime.tm_yday) { DETLOG2(g_Log, "UID:%10u/CID:%10u/Á¤¾×Á¦ »ç¿ë À¯Àú Á¢¼Ó ÇØÁ¦ : ½Ã°£ ¸¸·á", SessionData.GetUID(), SessionData.GetCID()); return false; } } break; case 'Y': // ´ë¸¸ Æ÷ÀÎÆ®. m_nPlayTimeÀº ºÐ´ÜÀ§ { // Ãß°¡½Ã°£ 1ºÐ ´õ ÁÜ. int nRemainSecond = int(m_nPlayTime * 60 + m_nLoginTime - nCurrentTime) + 60; // Æ÷ÀÎÆ® Á¾·á 1ºÐÈÄ µ¥ÀÌÅÍ Ã¼Å· if (0 < nRemainSecond && nRemainSecond <= 60 && !(m_cFlags & SENDED_BILLING_TIMEOUT_NOTIFY)) { // Ç÷¡±× ¼¼ÆÃ(µÎ¹ø ÀÌ ·çƾÀ¸·Î ¸ø µé¾î¿À°Ô Çϱâ À§Çؼ­.. m_cFlags |= SENDED_BILLING_TIMEOUT_NOTIFY; // ŰÆÛ¿¡ ´Ù½Ã ¾Ë¾Æº¸±â DETLOG5(g_Log, "UID:%10u/CID:%10u/´ë¸¸ Æ÷ÀÎÆ® üũÇÕ´Ï´Ù. ³²Àº ÃÊ:%d, ·Î±×ÀÎ:%d ÇöÀç:%d", SessionData.GetUID(), SessionData.GetCID(), nRemainSecond, m_nLoginTime, nCurrentTime); // Àӽà // Ŭ¶óÀÌ¾ðÆ®¿¡ ¸Å ºÐ¸¶´Ù °øÁö ³¯¸®¶ó°í ÆÐŶ º¸³»±â. unsigned char cRemainMinute = static_cast((nRemainSecond + 30) / 60); if(WARN_BEFORE_1SEC == m_eWarnMsgType) { // Áß±¹ ÀÌ¿ÜÀÇ ³ª¶ó¿¡¸¸ Á¢¼Ó²÷±âÀü 1ºÐÀü¿¡ °æ°í¸Þ½ÃÁö º¸³½´Ù. SendPacket::BillingCheckNotify( SessionData, cRemainMinute, m_cBillingType); } // UID¼­¹öÂÊÀ¸·Î Æ÷ÀÎÆ® È®ÀÎ ÆÐŶ ³¯¸®±â SendPacket::UpdateUIDTable(PktUUT::UpdateUIDTableBillingCheck, SessionData.GetAccountName(), NULL, SessionData.GetUID(), SessionData.GetCID(), SessionData.GetSessionID(), SessionData.GetServerID(), SessionData.GetRemoteAddress()); } else if (nRemainSecond <= 0) { DETLOG6(g_Log, "UID:%10u/CID:%10u/´ë¸¸ Æ÷ÀÎÆ® »ç¿ë À¯Àú Á¢¼Ó ÇØÁ¦ : ½Ã°£ ¸¸·á " "³²Àº ÃÊ:%d ŸÀÓ:%d, ·Î±×ÀÎ:%d ÇöÀç½Ã°£:%d", SessionData.GetUID(), SessionData.GetCID(), nRemainSecond, m_nPlayTime, m_nLoginTime, nCurrentTime); return false; } } break; } } return true; } } }