void CChat::QuitChat(CChatMember *pClient) { ADDTOCALLSTACK("CChat::QuitChat"); // Remove from old channel (if any) CChatChannel *pCurrentChannel = pClient->GetChannel(); if ( pCurrentChannel ) pCurrentChannel->RemoveMember(pClient); }
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 }
void CChat::QuitChat(CChatChanMember * pClient) { ADDTOCALLSTACK("CChat::QuitChat"); // Are we in a channel now? CChatChannel * pCurrentChannel = pClient->GetChannel(); // Remove from old channel (if any) if (pCurrentChannel) { // Remove myself from the channels list of members pCurrentChannel->RemoveMember( pClient ); // Am I the last one here? Delete it from all other clients? if (pCurrentChannel->m_Members.GetCount() <= 0) { // If noone is left, tell the chat system to delete it from memory DeleteChannel(pCurrentChannel); } } // Now tell the chat system you left pClient->SetChatInactive(); }
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; }
void CChat::Action(CClient *pClient, const NCHAR *pszText, int len, CLanguageID lang) { ADDTOCALLSTACK("CChat::Action"); // ARGS: // len = length of the pszText string in NCHAR's. if ( !(g_Cfg.m_iFeatureT2A & FEATURE_T2A_CHAT) ) return; CChatMember *pMe = static_cast<CChatMember *>(pClient); CChatChannel *pChannel = pMe->GetChannel(); TCHAR szFullText[MAX_TALK_BUFFER]; CvtNUNICODEToSystem(szFullText, sizeof(szFullText), pszText, len); TCHAR *pszMsg = szFullText + 1; switch ( szFullText[0] ) // the 1st character is a command byte (join channel, leave channel, etc) { case CHATACT_ChangeChannelPassword: // client shortcut: /pw { if ( !pChannel ) goto NoConference; pChannel->ChangePassword(pMe, pszMsg); break; } case CHATACT_LeaveChannel: { if ( !pChannel ) goto NoConference; pChannel->RemoveMember(pMe); break; } case CHATACT_LeaveChat: { if ( pChannel ) pChannel->RemoveMember(pMe); break; } case CHATACT_ChannelMessage: { if ( pChannel ) { pChannel->MemberTalk(pMe, pClient->m_UseNewChatSystem ? szFullText : pszMsg, lang); break; } NoConference: pMe->SendChatMsg(CHATMSG_MustBeInAConference); return; } case CHATACT_JoinChannel: // client shortcut: /conf { // Look for second double quote to separate channel from password size_t i = 1; for ( ; pszMsg[i] != '\0'; i++ ) { if ( pszMsg[i] == '"' ) break; } pszMsg[i] = '\0'; TCHAR *pszPassword = pszMsg + i + 1; if ( pszPassword[0] == ' ' ) // skip whitespaces pszPassword++; JoinChannel(pszMsg + 1, pszPassword, pMe); break; } case CHATACT_CreateChannel: // client shortcut: /newconf { TCHAR *pszPassword = NULL; size_t iMsgLength = strlen(pszMsg); for ( size_t i = 0; i < iMsgLength; i++ ) { if ( pszMsg[i] == '{' ) // there's a password here { pszMsg[i] = 0; pszPassword = pszMsg + i + 1; size_t iPasswordLength = strlen(pszPassword); for ( i = 0; i < iPasswordLength; i++ ) { if ( pszPassword[i] == '}' ) { pszPassword[i] = '\0'; break; } } break; } } if ( CreateChannel(pszMsg, pszPassword, pMe) ) JoinChannel(pszMsg, pszPassword, pMe); break; } case CHATACT_RenameChannel: // client shortcut: /rename { if ( !pChannel ) goto NoConference; pMe->RenameChannel(pszMsg); break; } case CHATACT_PrivateMessage: // client shortcut: /msg { if ( !pChannel ) goto NoConference; // Split the recipient from the message (look for a space) TCHAR buffer[2048]; strcpy(buffer, pszMsg); size_t bufferLength = strlen(buffer); size_t i = 0; for ( ; i < bufferLength; i++ ) { if ( buffer[i] == ' ' ) { buffer[i] = '\0'; break; } } pChannel->PrivateMessage(pMe, buffer, buffer + i + 1, lang); break; } case CHATACT_AddIgnore: // client shortcut: +ignore { pMe->AddIgnore(pszMsg); break; } case CHATACT_RemoveIgnore: // client shortcut: -ignore { pMe->RemoveIgnore(pszMsg); break; } case CHATACT_ToggleIgnore: // client shortcut: /ignore { pMe->ToggleIgnore(pszMsg); break; } case CHATACT_AddVoice: // client shortcut: +voice { if ( !pChannel ) goto NoConference; pChannel->AddVoice(pMe, pszMsg); break; } case CHATACT_RemoveVoice: // client shortcut: -voice { if ( !pChannel ) goto NoConference; pChannel->RemoveVoice(pMe, pszMsg); break; } case CHATACT_ToggleVoice: // client shortcut: /voice { if ( !pChannel ) goto NoConference; pChannel->ToggleVoice(pMe, pszMsg); break; } case CHATACT_AddModerator: // client shortcut: +ops { if ( !pChannel ) goto NoConference; pChannel->AddModerator(pMe, pszMsg); break; } case CHATACT_RemoveModerator: // client shortcut: -ops { if ( !pChannel ) goto NoConference; pChannel->RemoveModerator(pMe, pszMsg); break; } case CHATACT_ToggleModerator: // client shortcut: /ops { if ( !pChannel ) goto NoConference; pChannel->ToggleModerator(pMe, pszMsg); break; } case CHATACT_EnablePrivateMessages: // client shortcut: +receive { pMe->SetReceiving(true); break; } case CHATACT_DisablePrivateMessages: // client shortcut: -receive { pMe->SetReceiving(false); break; } case CHATACT_TogglePrivateMessages: // client shortcut: /receive { pMe->ToggleReceiving(); break; } case CHATACT_ShowCharacterName: // client shortcut: +showname { pMe->ShowCharacterName(); break; } case CHATACT_HideCharacterName: // client shortcut: -showname { pMe->HideCharacterName(); break; } case CHATACT_ToggleCharacterName: // client shortcut: /showname { pMe->ToggleCharacterName(); break; } case CHATACT_WhoIs: // client shortcut: /whois { if ( !pChannel ) goto NoConference; pChannel->WhoIs(pMe->GetChatName(), pszMsg); break; } case CHATACT_Kick: // client shortcut: /kick { if ( !pChannel ) goto NoConference; CChatMember *pMember = pChannel->FindMember(pszMsg); if ( pMember ) pChannel->KickMember(pMe, pMember); else pMe->SendChatMsg(CHATMSG_NoPlayer, pszMsg); break; } case CHATACT_EnableDefaultVoice: // client shortcut: +defaultvoice { if ( !pChannel ) goto NoConference; pChannel->EnableDefaultVoice(pMe->GetChatName()); break; } case CHATACT_DisableDefaultVoice: // client shortcut: -defaultvoice { if ( !pChannel ) goto NoConference; pChannel->DisableDefaultVoice(pMe->GetChatName()); break; } case CHATACT_ToggleDefaultVoice: // client shortcut: /defaultvoice { if ( !pChannel ) goto NoConference; pChannel->ToggleDefaultVoice(pMe->GetChatName()); break; } case CHATACT_EmoteMessage: // client shortcut: /emote or /em { if ( !pChannel ) goto NoConference; pChannel->Emote(pMe->GetChatName(), pszMsg, lang); break; } } }