void CChat::JoinChannel(LPCTSTR pszName, LPCTSTR pszPassword, CChatMember *pMember) { ADDTOCALLSTACK("CChat::JoinChannel"); ASSERT(pMember); CClient *pMemberClient = pMember->GetClient(); ASSERT(pMemberClient); CChatChannel *pNewChannel = FindChannel(pszName); if ( !pNewChannel ) { pMemberClient->addChatSystemMessage(CHATMSG_NoConference, pszName); return; } pszName = pNewChannel->m_sName; // fix case-sensitive mismatch CChatChannel *pCurrentChannel = pMember->GetChannel(); if ( pCurrentChannel && (pCurrentChannel == pNewChannel) ) { pMember->SendChatMsg(CHATMSG_AlreadyInConference, pszName); return; } else if ( !pNewChannel->m_sPassword.IsEmpty() && (!pszPassword || (strcmp(static_cast<LPCTSTR>(pNewChannel->m_sPassword), pszPassword) != 0)) ) { if ( pMemberClient->m_UseNewChatSystem ) { CGString sName; FormatName(sName, NULL, true); pMember->SendChatMsg(CHATMSG_PlayerMessage, sName, " Your client version can't join channels with password."); } else pMemberClient->addChatSystemMessage(CHATMSG_IncorrectPassword); return; } /*else if ( pNewChannel->m_Members.GetCount() >= UCHAR_MAX ) { pMemberClient->addChatSystemMessage(CHATMSG_ConferenceIsFull, pszName); return; }*/ // Leave current channel if ( pCurrentChannel ) pCurrentChannel->RemoveMember(pMember); // Join the new channel pNewChannel->AddMember(pMember); pNewChannel->SendMember(pMember); // send this member to all others clients pMemberClient->addChatSystemMessage(CHATCMD_JoinedChannel, pszName); if ( !pMemberClient->m_UseNewChatSystem ) pNewChannel->FillMembersList(pMember); // fill the members list on this client }
bool CChat::JoinChannel(CChatChanMember * pMember, LPCTSTR pszChannel, LPCTSTR pszPassword) { ADDTOCALLSTACK("CChat::JoinChannel"); ASSERT(pMember != NULL); CClient * pMemberClient = pMember->GetClient(); ASSERT(pMemberClient != NULL); // Are we in a channel now? CChatChannel * pCurrentChannel = pMember->GetChannel(); if (pCurrentChannel != NULL) { // Is it the same channel as the one I'm already in? if (strcmp(pszChannel, pCurrentChannel->GetName()) == 0) { // Tell them and return pMember->SendChatMsg(CHATMSG_AlreadyInConference, pszChannel); return false; } } CChatChannel * pNewChannel = FindChannel(pszChannel); if (pNewChannel == NULL) { pMemberClient->addChatSystemMessage(CHATMSG_NoConference, pszChannel ); return false; } // If there's a password, is it the correct one? if (strcmp(pNewChannel->GetPassword(), pszPassword) != 0) { pMemberClient->addChatSystemMessage(CHATMSG_IncorrectPassword); return false; } // Leave the old channel 1st // Remove from old channel (if any) if (pCurrentChannel != NULL) { // Remove myself from the channels list of members pCurrentChannel->RemoveMember(pMember); // If noone is left, tell the chat system to delete it from memory if (pCurrentChannel->m_Members.GetCount() <= 0) { // Am I the last one here? Delete it from all other clients? DeleteChannel(pCurrentChannel); } // Since we left, clear all members from our client that might be in our list from the channel we just left pMemberClient->addChatSystemMessage(CHATMSG_ClearMemberList); } // Now join a new channel // Add all the members of the channel to the clients list of channel participants pNewChannel->SendMembers(pMember); // Add ourself to the channels list of members if (!pNewChannel->AddMember(pMember)) return false; // Set the channel name title bar pMemberClient->addChatSystemMessage(CHATMSG_UpdateChannelBar, pszChannel); // Now send out my name to all clients in this channel pNewChannel->SendThisMember(pMember); return true; }