Ejemplo n.º 1
0
void C4Network2IRCClient::OnCommand(const char *szSender, const char *szCommand, const char *szParameters)
	{
	CStdLock Lock(&CSec);
	// Numeric command?
	if(isdigit((unsigned char)*szCommand) && SLen(szCommand) == 3)
		{
		OnNumericCommand(szSender, atoi(szCommand), szParameters);
		return;
		}
	// Sender's nick
	StdStrBuf SenderNick;
	if(szSender) SenderNick.CopyUntil(szSender, '!');
	// Ping?
	if(SEqualNoCase(szCommand, "PING"))
		Send("PONG", szParameters);
	// Message?
	if(SEqualNoCase(szCommand, "NOTICE") || SEqualNoCase(szCommand, "PRIVMSG"))
		{
		// Get target
		StdStrBuf Target = ircExtractPar(&szParameters);
		// Get text
		StdStrBuf Text = ircExtractPar(&szParameters);
		// Process message
		OnMessage(SEqualNoCase(szCommand, "NOTICE"), szSender, Target.getData(), Text.getData());
		}
	// Channel join?
	if(SEqualNoCase(szCommand, "JOIN"))
		{
		// Get channel
		StdStrBuf Channel = ircExtractPar(&szParameters);
		C4Network2IRCChannel *pChan = AddChannel(Channel.getData());
		// Add user
		pChan->OnJoin(SenderNick.getData());
		// Myself?
		if(SenderNick == Nick)
			PushMessage(MSG_Status, szSender, Channel.getData(), FormatString(LoadResStr("IDS_MSG_YOUHAVEJOINEDCHANNEL"), Channel.getData()).getData());
		else
			PushMessage(MSG_Status, szSender, Channel.getData(), FormatString(LoadResStr("IDS_MSG_HASJOINEDTHECHANNEL"), SenderNick.getData()).getData());
		}
	// Channel part?
	if(SEqualNoCase(szCommand, "PART"))
		{
		// Get channel
		StdStrBuf Channel = ircExtractPar(&szParameters);
		C4Network2IRCChannel *pChan = AddChannel(Channel.getData());
		// Get message
		StdStrBuf Comment = ircExtractPar(&szParameters);
		// Remove user
		pChan->OnPart(SenderNick.getData(), Comment.getData());
		// Myself?
		if(SenderNick == Nick)
			{
			DeleteChannel(pChan);
			PushMessage(MSG_Status, szSender, Nick.getData(), FormatString(LoadResStr("IDS_MSG_YOUHAVELEFTCHANNEL"), Channel.getData(), Comment.getData()).getData());
			}
		else
			PushMessage(MSG_Status, szSender, Channel.getData(), FormatString(LoadResStr("IDS_MSG_HASLEFTTHECHANNEL"), SenderNick.getData(), Comment.getData()).getData());
		}
	// Kick?
	if(SEqualNoCase(szCommand, "KICK"))
		{
		// Get channel
		StdStrBuf Channel = ircExtractPar(&szParameters);
		C4Network2IRCChannel *pChan = AddChannel(Channel.getData());
		// Get kicked user
		StdStrBuf Kicked = ircExtractPar(&szParameters);
		// Get message
		StdStrBuf Comment = ircExtractPar(&szParameters);
		// Remove user
		pChan->OnKick(Kicked.getData(), Comment.getData());
		// Myself? 
		if(Kicked == Nick)
			{
			DeleteChannel(pChan);
			PushMessage(MSG_Status, szSender, Nick.getData(), FormatString(LoadResStr("IDS_MSG_YOUWEREKICKEDFROMCHANNEL"), Channel.getData(), Comment.getData()).getData());
			}
		else
			PushMessage(MSG_Status, szSender, Channel.getData(), FormatString(LoadResStr("IDS_MSG_WASKICKEDFROMTHECHANNEL"), Kicked.getData(), Comment.getData()).getData());
		}
	// Quit?
	if(SEqualNoCase(szCommand, "QUIT"))
		{
		// Get comment
		StdStrBuf Comment = ircExtractPar(&szParameters);
		// Format status message
    StdStrBuf Message = FormatString(LoadResStr("IDS_MSG_HASDISCONNECTED"), SenderNick.getData(), Comment.getData());
    // Remove him from all channels
    for(C4Network2IRCChannel *pChan = pChannels; pChan; pChan = pChan->Next)
      if(pChan->getUser(SenderNick.getData()))
        {
        pChan->OnPart(SenderNick.getData(), "Quit");
        PushMessage(MSG_Status, szSender, pChan->getName(), Message.getData());
        }
		}
	// Topic change?
	if(SEqualNoCase(szCommand, "TOPIC"))
		{
		// Get channel and topic
		StdStrBuf Channel = ircExtractPar(&szParameters);
		StdStrBuf Topic = ircExtractPar(&szParameters);
		// Set topic
		AddChannel(Channel.getData())->OnTopic(Topic.getData());
		// Message
		PushMessage(MSG_Status, szSender, Channel.getData(), FormatString(LoadResStr("IDS_MSG_CHANGESTHETOPICTO"), SenderNick.getData(), Topic.getData()).getData());
		}
	// Mode?
	if(SEqualNoCase(szCommand, "MODE"))
		{
		// Get all data
		StdStrBuf Channel = ircExtractPar(&szParameters);
		StdStrBuf Flags = ircExtractPar(&szParameters);
		StdStrBuf What = ircExtractPar(&szParameters);
		// Make sure it's a channel
		C4Network2IRCChannel *pChan = getChannel(Channel.getData());
		if(pChan)
			// Ask for names, because user prefixes might be out of sync
			Send("NAMES", Channel.getData());
		// Show Message
		PushMessage(MSG_Status, szSender, Channel.getData(), FormatString(LoadResStr("IDS_MSG_SETSMODE"), SenderNick.getData(), Flags.getData(), What.getData()).getData());
		}
	// Error?
	if(SEqualNoCase(szCommand, "ERROR"))
		{
		// Get message
		StdStrBuf Message = ircExtractPar(&szParameters);
		// Push it
		PushMessage(MSG_Server, szSender, Nick.getData(), Message.getData());
		}
	// Nickchange?
	if(SEqualNoCase(szCommand, "NICK"))
		{
		// Get new nick
		StdStrBuf NewNick = ircExtractPar(&szParameters);
		// Format status message
    StdStrBuf Message = FormatString(LoadResStr("IDS_MSG_ISNOWKNOWNAS"), SenderNick.getData(), NewNick.getData());
    // Rename on all channels
    for(C4Network2IRCChannel *pChan = pChannels; pChan; pChan = pChan->Next)
      if(pChan->getUser(SenderNick.getData()))
        {
        pChan->OnPart(SenderNick.getData(), "Nickchange");
        pChan->OnJoin(NewNick.getData());
        PushMessage(MSG_Status, szSender, pChan->getName(), Message.getData());
        }
    // Self?
    if(SenderNick == Nick)
      Nick = NewNick;
		}
	}