#include "StdAfx.h" #include "ChatRoomManager.h" #include "UserManager.h" #include "User.h" #include "BaseZone.h" #include // ä³Î äÆÃ ¶§¹® #include #include ChatRoomManager::ChatRoomManager(void) { m_pChatRoomPool = NULL; } ChatRoomManager::~ChatRoomManager(void) { assert( m_pChatRoomPool == NULL ); } VOID ChatRoomManager::Init() { m_pChatRoomPool = new util::CMemoryPoolFactory; //m_pChatRoomPool->Initialize( 10000, 5000 ); m_pChatRoomPool->Initialize( 50, 50 ); } VOID ChatRoomManager::Release() { CHATROOM_MAP_ITER it; CommChatZone *pChatRoom; CHATROOM_MAP& mapClone = m_mapChatRoom; for( it = mapClone.begin(); it != mapClone.end(); ++it ) { pChatRoom = it->second; FreeChatRoom( pChatRoom ); } mapClone.clear(); m_pChatRoomPool->Release(); SAFE_DELETE(m_pChatRoomPool); } VOID ChatRoomManager::Update() { } CommChatZone* ChatRoomManager::AllocChatRoom() { CommChatZone *pChatRoom = (CommChatZone *)m_pChatRoomPool->Alloc(); pChatRoom->Init(); return pChatRoom; } VOID ChatRoomManager::FreeChatRoom( CommChatZone *pChatRoom ) { pChatRoom->Release(); m_pChatRoomPool->Free( pChatRoom ); } CommChatZone *ChatRoomManager::AddChatRoom( TCHAR *ptszChatRoomName ) { CHATROOM_MAP_ITER it = m_mapChatRoom.find( ptszChatRoomName ); if( it != m_mapChatRoom.end() ) return NULL; CommChatZone *pChatRoom = AllocChatRoom(); // pChatRoom->SetChannelID( dwChannelID ); pChatRoom->SetChatRoomName( ptszChatRoomName ); m_mapChatRoom.insert( CHATROOM_MAP_PAIR( ptszChatRoomName, pChatRoom ) ); MessageOut( eFULL_LOG, "Add ChatRoom(%s)", ptszChatRoomName ); return pChatRoom; } VOID ChatRoomManager::RemoveChatRoom( TCHAR *ptszChatRoomName ) { CHATROOM_MAP_ITER it = m_mapChatRoom.find( ptszChatRoomName ); CommChatZone *pChatRoom; if( it != m_mapChatRoom.end() ) { pChatRoom = it->second; m_mapChatRoom.erase( it ); FreeChatRoom( pChatRoom ); MessageOut( eFULL_LOG, "Remove ChatRoom(%s)", ptszChatRoomName ); } } CommChatZone* ChatRoomManager::GetChatRoom( TCHAR *ptszChatRoomName ) { CHATROOM_MAP_ITER it = m_mapChatRoom.find( ptszChatRoomName ); if( it == m_mapChatRoom.end() ) { return NULL; } else { return it->second; } } // äÆÃ¹æ Âü¿© VOID ChatRoomManager::AddUser( User *pUser, BYTE byRoomNameLength, TCHAR* ptszChatRoomName ) { MSG_CW_CHAT_CHANNEL_JOIN_ACK ackMsg; MSG_CW_CHAT_CHANNEL_JOIN_BRD brdMsg; // ÀÌ¹Ì µé¾î°¡ Àִ äÆÃ¹æÀÌ ÀÖÀ¸¸é ¿À·ù if( pUser->GetChannelChatRoom() ) { MessageOut( eCRITICAL_LOG, "ChatRoomManager AddUser Error - Already Join ChatRoom[CharGuid:%u]", pUser->GetCharGuid() ); MSG_CW_CHAT_CHANNEL_JOIN_NAK nakMsg; nakMsg.m_byErrorCode = RC::RC_CHAT_ALREADYINROOM; pUser->SendPacket( (BYTE*)&nakMsg, sizeof(nakMsg) ); return; } // Ȥ½Ã³ª ÆÐŶÀÌ À߸øµÇ¾úÀ» °æ¿ì¸¦ ´ëºñÇØ ÃÖ´ë ±æÀ̸¦ º¸ÀåÇÑ´Ù TCHAR ptszRoomName[MAX_ROOMTITLE_LENGTH+1]={0,}; _tcsncpy( ptszRoomName, ptszChatRoomName, byRoomNameLength ); // äÆÃ¹æ Àִ°¡? ackMsg.m_bCreated = FALSE; CommChatZone *pChatZone = GetChatRoom( ptszRoomName ); if( !pChatZone ) { // ¾øÀ¸¸é »õ·Î °³¼³ pChatZone = AddChatRoom( ptszRoomName ); ackMsg.m_bCreated = TRUE; } // Àοø ´Ù Â÷ÀÖÀ¸¸é ¸ø µé¾î°£´Ù if( pChatZone->GetNumberOfUsers() >= MAX_CHATZONE_USER ) { MSG_CW_CHAT_CHANNEL_JOIN_NAK nakMsg; nakMsg.m_byErrorCode = RC::RC_CHAT_UNKNOWN; pUser->SendPacket( (BYTE*)&nakMsg, sizeof(nakMsg) ); MessageOut( eFULL_LOG, "ChannelChatZone Join Failed - User Full[%u]", pUser->GetCharGuid() ); return; } // ±âÁ¸ ¸â¹öµé¿¡°Ô ½Å±ÔÀ¯Àú µé¾î¿Â´Ù°í ¾Ë·ÁÁÖ°í brdMsg.m_byChannelID = static_cast( pUser->GetChannelID() ); _tcsncpy( brdMsg.m_ptszJoinMember, pUser->GetCharName().c_str(), MAX_CHARNAME_LENGTH ); brdMsg.m_ptszJoinMember[MAX_CHARNAME_LENGTH] = '\0'; DWORD number_of_users = pChatZone->GetNumberOfUsers(); ASSERT(SAFE_NUMERIC_TYPECAST(DWORD, number_of_users, BYTE)); brdMsg.m_byUserNum = (BYTE)number_of_users + 1; // (NOTE) (WAVERIX) +1ÀÌ ¹ºÁö...¸ô°Ú´ç. pChatZone->Send( (BYTE*)&brdMsg, sizeof(brdMsg) ); // µé¾î°£´Ù if( !pChatZone->AddUser( pUser->GetGUID(), pUser ) ) { MessageOut( eCRITICAL_LOG, "CHAT_CHANNEL_JOIN_SYN Error - AddUser Failed[CharGuid:%u]", pUser->GetCharGuid() ); MSG_CW_CHAT_CHANNEL_JOIN_NAK nakMsg; nakMsg.m_byErrorCode = RC::RC_CHAT_UNKNOWN; pUser->SendPacket( (BYTE*)&nakMsg, sizeof(nakMsg) ); // µé¾î¿ÀÁö ¾Ê¾Ò´Ù´Â °É È®ÀνÃÄÑÁØ´Ù MSG_CW_CHAT_CHANNEL_OUT_BRD outMsg; _tcsncpy( outMsg.m_ptszOutName, brdMsg.m_ptszJoinMember, MAX_CHARNAME_LENGTH ); outMsg.m_ptszOutName[MAX_CHARNAME_LENGTH] = '\0'; outMsg.m_byUserNum = (BYTE)number_of_users; pChatZone->Send( (BYTE*)&outMsg, sizeof(outMsg) ); return; } pUser->JoinChannelChatRoom( pChatZone ); { DWORD number_of_users = pChatZone->GetNumberOfUsers(); ASSERT(SAFE_NUMERIC_TYPECAST(DWORD, number_of_users, BYTE)); ackMsg.m_byUserNum = (BYTE)number_of_users; }; pUser->SendPacket( (BYTE*)&ackMsg, sizeof(ackMsg) ); } // äÆÃ¹æ ³ª°¨ VOID ChatRoomManager::RemoveUser( User *pUser ) { MSG_CW_CHAT_CHANNEL_OUT_ACK ackMsg; MSG_CW_CHAT_CHANNEL_OUT_NAK nakMsg; MSG_CW_CHAT_CHANNEL_OUT_BRD brdMsg; // äÆÃ¹æÀÌ Àִ°¡? CommChatZone* pChatZone = pUser->GetChannelChatRoom(); if( !pChatZone ) { MessageOut( eFULL_LOG, "CHAT_CHANNEL_OUT Error - No ChatRoom[CharGuid:%u]", pUser->GetCharGuid() ); nakMsg.m_byErrorCode = RC::RC_CHAT_NOROOM; pUser->SendPacket( (BYTE*)&nakMsg, sizeof(nakMsg) ); return; } // ÅðÀåÇÑ´Ù pChatZone->RemoveUser( pUser->GetGUID() ); pUser->OutChannelChatRoom(); pUser->SendPacket( (BYTE*)&ackMsg, sizeof(ackMsg) ); if( !pChatZone->GetNumberOfUsers() ) { RemoveChatRoom( pChatZone->GetChatRoomName() ); } else { // Âü¿©Àڵ鿡°Ô ¾Ë·ÁÁØ´Ù { DWORD number_of_users = pChatZone->GetNumberOfUsers(); ASSERT(SAFE_NUMERIC_TYPECAST(DWORD, number_of_users, BYTE)); brdMsg.m_byUserNum = (BYTE)number_of_users; }; _tcsncpy( brdMsg.m_ptszOutName, pUser->GetCharName().c_str(), MAX_CHARNAME_LENGTH ); brdMsg.m_ptszOutName[MAX_CHARNAME_LENGTH] = '\0'; pChatZone->Send( (BYTE*)&brdMsg, sizeof(brdMsg) ); } } VOID ChatRoomManager::DisplayChatRoomInfo() { CHATROOM_MAP_ITER it; if( m_mapChatRoom.empty() ) { MessageOut(eCRITICAL_LOG, "No Channel ChatRoom." ); return; } MessageOut( eCRITICAL_LOG, "ChannelChat Room Number:[%u]", m_mapChatRoom.size() ); }