示例#1
0
void CChat::QuitChat(CChatMember *pClient)
{
	ADDTOCALLSTACK("CChat::QuitChat");
	// Remove from old channel (if any)

	CChatChannel *pCurrentChannel = pClient->GetChannel();
	if ( pCurrentChannel )
		pCurrentChannel->RemoveMember(pClient);
}
示例#2
0
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
}
示例#3
0
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();
}
示例#4
0
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;
}
示例#5
0
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;
		}
	}
}