#include "stdAfx.h" #include ".\gmcmdmanager.h" #include "User.h" #include "UserManager.h" //#include #include #include // °øÁö À§ÇØ #include "BaseZone.h" #include "Channel.h" #include "ChannelManager.h" GMCmdManager::GMCmdManager(void) { m_vecCmd.reserve( 10 ); m_GMString.Init(); } GMCmdManager::~GMCmdManager(void) { } bool GMCmdManager::ParseCommand( User* pUser, const char* szCmd ) { m_vecCmd.clear(); if( !IsGMUser( pUser ) ) { // ÀÌ °æ¿ì´Â Å©·¡Å·À̳ª ÇÁ·ÎÅäÄÝ Å¸ÀÔ ¹ö±×ÀÏ °¡´É¼ºÀÌ ÀÖ´Ù MessageOut(eCRITICAL_LOG, "GM ¾Æ´Ñ À¯Àú°¡ °øÁö ¿äû!!!(%s)", pUser->GetCharName().c_str()); return false; } if( !m_Parser.Parsing( szCmd, m_vecCmd ) ) return false; if( !ProcessCommand( pUser, m_vecCmd ) ) return false; return true; } bool GMCmdManager::ProcessCommand(User* gm_player, GM_CMD_STRING& gm_command) { bool is_success = false; if (gm_command.size() > 0) { const STLX_TSTRING& gm_command_head = gm_command[0]; if (gm_command_head.compare(m_GMString.GetWorldNotice()) == 0) // ¿ùµå °øÁö { is_success = ProcessWorldNotice(gm_player, gm_command); } else if (gm_command_head.compare(m_GMString.GetChannelNotice()) == 0) // ä³Î °øÁö { is_success = ProcessChannelNotice(gm_player, gm_command); } else if (gm_command_head.compare(m_GMString.GetZoneNotice()) == 0) // Áö¿ª °øÁö { is_success = ProcessZoneNotice(gm_player, gm_command); } } return is_success; } BOOL GMCmdManager::IsGMUser( User *pUser ) { if( pUser->GetGMGrade() <= eGM_GRADE_BASE || pUser->GetGMGrade() >= eGM_GRADE_MAX ) { MSG_CW_GM_STRING_CMD_NAK NakMsg; NakMsg.m_byErrorCode = RC::RC_GM_ISNOT_GM; // GMÀÌ ¾Æ´Ï´Ù. pUser->SendPacket( (BYTE*)&NakMsg, sizeof(NakMsg) ); return FALSE; } return TRUE; } // ¿ùµå °øÁö bool GMCmdManager::ProcessWorldNotice( User* pUser, GM_CMD_STRING& vecCmd ) { // TODO: f101210.2L, this logic is terrible... // vecCmd °³¼ö¸¸Å­ Àд´٠TCHAR tszNoticeMsg[100]={0,}; WORD wCount=0; for(DWORD i = 1; i MAX_NOTICE_LEN ) { // °øÁö ±æÀÌ ÀÌ»óÀº À߸°´Ù break; } _tcscat( tszNoticeMsg + wCount, vecCmd[i].c_str() ); wCount += static_cast( vecCmd[i].size() ); tszNoticeMsg[wCount++] = ' '; } tszNoticeMsg[wCount]='\0'; MSG_CW_NOTICE_BRD noticeMsg; noticeMsg.m_byCategory = CW_CHAT; noticeMsg.m_byProtocol = CW_NOTICE_BRD; noticeMsg.wLen = wCount; memset(noticeMsg.szMsg, 0, sizeof(noticeMsg.szMsg)); memcpy( noticeMsg.szMsg, tszNoticeMsg, noticeMsg.wLen ); // °®°í ÀÖ´Â ¸ðµç À¯Àúµé¿¡°Ô ³¯¸°´Ù UserManager::Instance()->SendToAll( (BYTE*)¬iceMsg, noticeMsg.GetSize() ); char szNotice[MAX_NOTICE_LEN + 1]; ZeroMemory( szNotice, sizeof(szNotice) ); strncpy( szNotice, noticeMsg.szMsg, noticeMsg.wLen ); MessageOut(eCRITICAL_LOG, "-----------------------------<< Àüü°øÁö >>-----------------------------" ); MessageOut(eCRITICAL_LOG, "%s(%u)", noticeMsg.szMsg, noticeMsg.wLen ); MessageOut(eCRITICAL_LOG, "------------------------------------------------------------------------" ); return true; } // ä³Î °øÁö bool GMCmdManager::ProcessChannelNotice( User* pUser, GM_CMD_STRING& vecCmd ) { // TODO: f101210.2L, this logic is terrible... // vecCmd °³¼ö¸¸Å­ Àд´٠TCHAR tszNoticeMsg[100]={0,}; WORD wCount=0; for(DWORD i = 1; i MAX_NOTICE_LEN ) { // °øÁö ±æÀÌ ÀÌ»óÀº À߸°´Ù break; } _tcscat( tszNoticeMsg + wCount, vecCmd[i].c_str() ); wCount += static_cast( vecCmd[i].size() ); tszNoticeMsg[wCount++] = ' '; } tszNoticeMsg[wCount]='\0'; MSG_CW_NOTICE_BRD noticeMsg; noticeMsg.m_byCategory = CW_CHAT; noticeMsg.m_byProtocol = CW_NOTICE_BRD; noticeMsg.wLen = wCount; memset(noticeMsg.szMsg, 0, sizeof(noticeMsg.szMsg)); memcpy( noticeMsg.szMsg, tszNoticeMsg, noticeMsg.wLen ); // ÇØ´ç À¯Àú°¡ Á¢¼ÓÇÑ Ã¤³Î¿¡¸¸ ³¯·ÁÁØ´Ù Channel *pChannel = ChannelManager::Instance()->GetChannel( pUser->GetChannelID() ); if(!pChannel) { // »ç¿ëÀÚÀÇ Ã¤³Î ID°¡ Ʋ·È´Ù. Ä¡¸íÀûÀÎ ¹ö±× MessageOut( eCRITICAL_LOG, "»ç¿ëÀÚ %sÀÇ Ã¤³Î %u°¡ Á¸ÀçÇÏÁö ¾ÊÀ½!! °øÁö ½ÇÆÐ!!", pUser->GetCharName().c_str(), pUser->GetChannelID() ); return false; } // ¸¶À», ¹èƲÁ¸ ¸ðµÎ °øÁö pChannel->SendToAll( (BYTE*)¬iceMsg, noticeMsg.GetSize() ); char szNotice[MAX_NOTICE_LEN + 1]; ZeroMemory( szNotice, sizeof(szNotice) ); strncpy( szNotice, noticeMsg.szMsg, noticeMsg.wLen ); MessageOut(eCRITICAL_LOG, "----------------------------<< %dä³Î °øÁö >>----------------------------", pUser->GetChannelID() ); MessageOut(eCRITICAL_LOG, "%s(%u)", noticeMsg.szMsg, noticeMsg.wLen ); MessageOut(eCRITICAL_LOG, "------------------------------------------------------------------------" ); return true; } // Áö¿ª °øÁö bool GMCmdManager::ProcessZoneNotice( User* pUser, GM_CMD_STRING& vecCmd ) { // TODO: f101210.2L, this logic is terrible... // vecCmd °³¼ö¸¸Å­ Àд´٠TCHAR tszNoticeMsg[100]={0,}; WORD wCount=0; for(DWORD i = 1; i MAX_NOTICE_LEN ) { // °øÁö ±æÀÌ ÀÌ»óÀº À߸°´Ù break; } _tcscat( tszNoticeMsg + wCount, vecCmd[i].c_str() ); wCount += static_cast( vecCmd[i].size() ); tszNoticeMsg[wCount++] = ' '; } tszNoticeMsg[wCount]='\0'; MSG_CW_NOTICE_BRD noticeMsg; noticeMsg.m_byCategory = CW_CHAT; noticeMsg.m_byProtocol = CW_NOTICE_BRD; noticeMsg.wLen = wCount; memset(noticeMsg.szMsg, 0, sizeof(noticeMsg.szMsg)); memcpy( noticeMsg.szMsg, tszNoticeMsg, noticeMsg.wLen ); Channel *pChannel = ChannelManager::Instance()->GetChannel( pUser->GetChannelID() ); if(!pChannel) { // »ç¿ëÀÚÀÇ Ã¤³Î ID°¡ Ʋ·È´Ù. Ä¡¸íÀûÀÎ ¹ö±× MessageOut( eCRITICAL_LOG, "»ç¿ëÀÚ %sÀÇ Ã¤³Î %u°¡ Á¸ÀçÇÏÁö ¾ÊÀ½!! Áö¿ª°øÁö ½ÇÆÐ!!", pUser->GetCharName().c_str(), pUser->GetChannelID() ); return false; } BaseZone *pZone = NULL; pZone = pChannel->FindZone( pUser->GetZoneKey() ); if( !pZone ) { // »ç¿ëÀÚÀÇ Zone ID°¡ Ʋ·È´Ù. Ä¡¸íÀûÀÎ ¹ö±× MessageOut( eCRITICAL_LOG, "»ç¿ëÀÚ %sÀÇ ¸¶À» %u°¡ Á¸ÀçÇÏÁö ¾ÊÀ½!! °øÁö ½ÇÆÐ!!", pUser->GetCharName().c_str(), pUser->GetZoneKey() ); return false; } pZone->Send( (BYTE*)¬iceMsg, noticeMsg.GetSize() ); char szNotice[MAX_NOTICE_LEN + 1]; ZeroMemory( szNotice, sizeof(szNotice) ); strncpy( szNotice, noticeMsg.szMsg, vecCmd.begin()->size() ); MessageOut(eCRITICAL_LOG, "---------------------------<< %uä³Î %uZone°øÁö[ZT:%u] >>-------------------------", pUser->GetChannelID(), pUser->GetZoneKey(), pUser->GetStatus() ); MessageOut(eCRITICAL_LOG, "%s(%u)", noticeMsg.szMsg, noticeMsg.wLen ); MessageOut(eCRITICAL_LOG, "------------------------------------------------------------------------" ); return true; } bool GMCmdManager::ProcessNoticeType(User *pUser, eNOTICE_TYPE eType, TCHAR *ptszNoticeMsg) { switch(eType) { case eNOTICE_WORLD: { ProcessWorldNotice(pUser, ptszNoticeMsg); return true; } break; case eNOTICE_CHANNEL: { ProcessChannelNotice(pUser, ptszNoticeMsg); return true; } break; case eNOTICE_ZONE: { ProcessZoneNotice(pUser, ptszNoticeMsg); return true; } break; } return false; } VOID GMCmdManager::ProcessWorldNotice(User *pUser, TCHAR *ptszNoticeMsg) { MSG_CW_NOTICE_BRD msgBRD; msgBRD.m_byCategory = CW_CHAT; msgBRD.m_byProtocol = CW_NOTICE_BRD; msgBRD.m_byRed = 236; msgBRD.m_byGreen = 96; msgBRD.m_byBlue = 12; // CHANGES: f101210.2L, check boundary if (size_t str_len = strlen(ptszNoticeMsg) + 1) { // NOTE: always true, because wLen need consider with null-terminated position strncpy(msgBRD.szMsg, ptszNoticeMsg, _countof(msgBRD.szMsg)); msgBRD.szMsg[_countof(msgBRD.szMsg) - 1] = '\0'; str_len = min(_countof(msgBRD.szMsg), str_len); msgBRD.wLen = static_cast(str_len); } // °®°í ÀÖ´Â ¸ðµç À¯Àúµé¿¡°Ô ³¯¸°´Ù UserManager::Instance()->SendToAll( (BYTE*)&msgBRD, msgBRD.GetSize() ); char szNotice[MAX_NOTICE_LEN + 1]; ZeroMemory( szNotice, sizeof(szNotice) ); strncpy( szNotice, msgBRD.szMsg, msgBRD.wLen ); MessageOut(eCRITICAL_LOG, "-----------------------------<< Àüü°øÁö >>-----------------------------" ); MessageOut(eCRITICAL_LOG, "%s(%u)", msgBRD.szMsg, msgBRD.wLen ); MessageOut(eCRITICAL_LOG, "------------------------------------------------------------------------" ); } VOID GMCmdManager::ProcessChannelNotice(User *pUser, TCHAR *ptszNoticeMsg) { MSG_CW_NOTICE_BRD msgBRD; msgBRD.m_byCategory = CW_CHAT; msgBRD.m_byProtocol = CW_NOTICE_BRD; msgBRD.m_byRed = 236; msgBRD.m_byGreen = 96; msgBRD.m_byBlue = 12; // CHANGES: f101210.2L, check boundary if (size_t str_len = strlen(ptszNoticeMsg) + 1) { // NOTE: always true, because wLen need consider with null-terminated position strncpy(msgBRD.szMsg, ptszNoticeMsg, _countof(msgBRD.szMsg)); msgBRD.szMsg[_countof(msgBRD.szMsg) - 1] = '\0'; str_len = min(_countof(msgBRD.szMsg), str_len); msgBRD.wLen = static_cast(str_len); } // ÇØ´ç À¯Àú°¡ Á¢¼ÓÇÑ Ã¤³Î¿¡¸¸ ³¯·ÁÁØ´Ù Channel *pChannel = ChannelManager::Instance()->GetChannel(pUser->GetChannelID()); if(!pChannel) { // »ç¿ëÀÚÀÇ Ã¤³Î ID°¡ Ʋ·È´Ù. Ä¡¸íÀûÀÎ ¹ö±× MessageOut( eCRITICAL_LOG, "»ç¿ëÀÚ %sÀÇ Ã¤³Î %u°¡ Á¸ÀçÇÏÁö ¾ÊÀ½!! °øÁö ½ÇÆÐ!!", pUser->GetCharName().c_str(), pUser->GetChannelID() ); return; } // ¸¶À», ¹èƲÁ¸ ¸ðµÎ °øÁö pChannel->SendToAll( (BYTE*)&msgBRD, msgBRD.GetSize() ); char szNotice[MAX_NOTICE_LEN + 1]; ZeroMemory( szNotice, sizeof(szNotice) ); strncpy( szNotice, msgBRD.szMsg, msgBRD.wLen ); MessageOut(eCRITICAL_LOG, "----------------------------<< %dä³Î °øÁö >>----------------------------", pUser->GetChannelID() ); MessageOut(eCRITICAL_LOG, "%s(%u)", msgBRD.szMsg, msgBRD.wLen ); MessageOut(eCRITICAL_LOG, "------------------------------------------------------------------------" ); } VOID GMCmdManager::ProcessZoneNotice(User *pUser, TCHAR *ptszNoticeMsg) { MSG_CW_NOTICE_BRD msgBRD; msgBRD.m_byCategory = CW_CHAT; msgBRD.m_byProtocol = CW_NOTICE_BRD; msgBRD.m_byRed = 236; msgBRD.m_byGreen = 96; msgBRD.m_byBlue = 12; // CHANGES: f101210.2L, check boundary if (size_t str_len = strlen(ptszNoticeMsg) + 1) { // NOTE: always true, because wLen need consider with null-terminated position strncpy(msgBRD.szMsg, ptszNoticeMsg, _countof(msgBRD.szMsg)); msgBRD.szMsg[_countof(msgBRD.szMsg) - 1] = '\0'; str_len = min(_countof(msgBRD.szMsg), str_len); msgBRD.wLen = static_cast(str_len); } Channel *pChannel = ChannelManager::Instance()->GetChannel(pUser->GetChannelID()); if(!pChannel) { // »ç¿ëÀÚÀÇ Ã¤³Î ID°¡ Ʋ·È´Ù. Ä¡¸íÀûÀÎ ¹ö±× MessageOut(eCRITICAL_LOG, "»ç¿ëÀÚ %sÀÇ Ã¤³Î %u°¡ Á¸ÀçÇÏÁö ¾ÊÀ½!! Áö¿ª°øÁö ½ÇÆÐ!!", pUser->GetCharName().c_str(), pUser->GetChannelID()); return; } BaseZone *pZone = NULL; pZone = pChannel->FindZone( pUser->GetZoneKey() ); if( !pZone ) { // »ç¿ëÀÚÀÇ Zone ID°¡ Ʋ·È´Ù. Ä¡¸íÀûÀÎ ¹ö±× MessageOut( eCRITICAL_LOG, "»ç¿ëÀÚ %sÀÇ ¸¶À» %u°¡ Á¸ÀçÇÏÁö ¾ÊÀ½!! °øÁö ½ÇÆÐ!!", pUser->GetCharName().c_str(), pUser->GetZoneKey() ); return; } pZone->Send( (BYTE*)&msgBRD, msgBRD.GetSize() ); char szNotice[MAX_NOTICE_LEN + 1]; ZeroMemory( szNotice, sizeof(szNotice) ); strncpy( szNotice, msgBRD.szMsg, msgBRD.wLen ); MessageOut(eCRITICAL_LOG, "---------------------------<< %uä³Î %uZone°øÁö[ZT:%u] >>-------------------------", pUser->GetChannelID(), pUser->GetZoneKey(), pUser->GetStatus() ); MessageOut(eCRITICAL_LOG, "%s(%u)", msgBRD.szMsg, msgBRD.wLen ); MessageOut(eCRITICAL_LOG, "------------------------------------------------------------------------" ); }