/* IRC plugin for Miranda IM Copyright (C) 2003-05 Jurgen Persson Copyright (C) 2007-09 George Hazan This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "irc.h" static CMString FormatOutput(const CIrcMessage* pmsg) { CMString sMessage; if (pmsg->m_bIncoming) { // Is it an incoming message? if (pmsg->sCommand == _T("WALLOPS") && pmsg->parameters.getCount() > 0) { TCHAR temp[200]; *temp = '\0'; mir_sntprintf(temp, SIZEOF(temp), TranslateT("WallOps from %s: "), pmsg->prefix.sNick.c_str()); sMessage = temp; for (int i = 0; i < (int)pmsg->parameters.getCount(); i++) { sMessage += pmsg->parameters[i]; if (i != pmsg->parameters.getCount() - 1) sMessage += _T(" "); } goto THE_END; } if (pmsg->sCommand == _T("INVITE") && pmsg->parameters.getCount() > 1) { TCHAR temp[256]; *temp = '\0'; mir_sntprintf(temp, SIZEOF(temp), TranslateT("%s invites you to %s"), pmsg->prefix.sNick.c_str(), pmsg->parameters[1].c_str()); sMessage = temp; for (int i = 2; i < (int)pmsg->parameters.getCount(); i++) { sMessage += _T(": ") + pmsg->parameters[i]; if (i != pmsg->parameters.getCount() - 1) sMessage += _T(" "); } goto THE_END; } int index = StrToInt(pmsg->sCommand.c_str()); if (index == 301 && pmsg->parameters.getCount() > 0) { TCHAR temp[500]; *temp = '\0'; mir_sntprintf(temp, SIZEOF(temp), TranslateT("%s is away"), pmsg->parameters[1].c_str()); sMessage = temp; for (int i = 2; i < (int)pmsg->parameters.getCount(); i++) { sMessage += _T(": ") + pmsg->parameters[i]; if (i != pmsg->parameters.getCount() - 1) sMessage += _T(" "); } goto THE_END; } if ((index == 443 || index == 441) && pmsg->parameters.getCount() > 3) return pmsg->parameters[1] + _T(" ") + pmsg->parameters[3] + _T(": ") + pmsg->parameters[2]; if (index == 303) { // ISON command sMessage = TranslateT("These are online: "); for (int i = 1; i < (int)pmsg->parameters.getCount(); i++) { sMessage += pmsg->parameters[i]; if (i != pmsg->parameters.getCount() - 1) sMessage += _T(", "); } goto THE_END; } if ((index > 400 || index < 500) && pmsg->parameters.getCount() > 2 && pmsg->sCommand[0] == '4') //all error messages return pmsg->parameters[2] + _T(": ") + pmsg->parameters[1]; } else if (pmsg->sCommand == _T("NOTICE") && pmsg->parameters.getCount() > 1) { TCHAR temp[500]; *temp = '\0'; int l = pmsg->parameters[1].GetLength(); if (l > 3 && pmsg->parameters[1][0] == 1 && pmsg->parameters[1][l - 1] == 1) { // CTCP reply CMString tempstr = pmsg->parameters[1]; tempstr.Delete(0, 1); tempstr.Delete(tempstr.GetLength() - 1, 1); CMString type = GetWord(tempstr.c_str(), 0); if (lstrcmpi(type.c_str(), _T("ping")) == 0) mir_sntprintf(temp, SIZEOF(temp), TranslateT("CTCP %s reply sent to %s"), type.c_str(), pmsg->parameters[0].c_str()); else mir_sntprintf(temp, SIZEOF(temp), TranslateT("CTCP %s reply sent to %s: %s"), type.c_str(), pmsg->parameters[0].c_str(), GetWordAddress(tempstr.c_str(), 1)); sMessage = temp; } else { mir_sntprintf(temp, SIZEOF(temp), TranslateT("Notice to %s: "), pmsg->parameters[0].c_str()); sMessage = temp; for (int i = 1; i < (int)pmsg->parameters.getCount(); i++) { sMessage += pmsg->parameters[i]; if (i != pmsg->parameters.getCount() - 1) sMessage += _T(" "); } } goto THE_END; } // Default Message handler. if (pmsg->m_bIncoming) { if (pmsg->parameters.getCount() < 2 && pmsg->parameters.getCount() > 0) return pmsg->sCommand + _T(" : ") + pmsg->parameters[0]; if (pmsg->parameters.getCount() > 1) for (int i = 1; i < (int)pmsg->parameters.getCount(); i++) sMessage += pmsg->parameters[i] + _T(" "); } else { if (pmsg->prefix.sNick.GetLength()) sMessage = pmsg->prefix.sNick + _T(" "); sMessage += pmsg->sCommand + _T(" "); for (int i = 0; i < (int)pmsg->parameters.getCount(); i++) sMessage += pmsg->parameters[i] + _T(" "); } THE_END: return sMessage; } BOOL CIrcProto::ShowMessage(const CIrcMessage* pmsg) { CMString mess = FormatOutput(pmsg); if (!pmsg->m_bIncoming) ReplaceString(mess, _T("%%"), _T("%")); int iTemp = StrToInt(pmsg->sCommand.c_str()); //To active window if ((iTemp > 400 || iTemp < 500) && pmsg->sCommand[0] == '4' //all error messages || pmsg->sCommand == _T("303") //ISON command || pmsg->sCommand == _T("INVITE") || ((pmsg->sCommand == _T("NOTICE")) && ((pmsg->parameters.getCount() > 2) ? (_tcsstr(pmsg->parameters[1].c_str(), _T("\001")) == NULL) : false)) // CTCP answers should go to m_network Log window! || pmsg->sCommand == _T("515")) //chanserv error { DoEvent(GC_EVENT_INFORMATION, NULL, pmsg->m_bIncoming ? pmsg->prefix.sNick.c_str() : m_info.sNick.c_str(), mess.c_str(), NULL, NULL, NULL, true, pmsg->m_bIncoming ? false : true); return TRUE; } if (m_useServer) { DoEvent(GC_EVENT_INFORMATION, SERVERWINDOW, (pmsg->m_bIncoming) ? pmsg->prefix.sNick.c_str() : m_info.sNick.c_str(), mess.c_str(), NULL, NULL, NULL, true, pmsg->m_bIncoming ? false : true); return true; } return false; }