diff --git a/src/Client.cpp b/src/Client.cpp index 90373218..cc188b57 100644 --- a/src/Client.cpp +++ b/src/Client.cpp @@ -225,170 +225,183 @@ void CClient::ReadLine(const CString& sData) { } return; // If the server understands it, we already enabled namesx / uhnames } else if (sCommand.Equals("NOTICE")) { - CString sTarget = sLine.Token(1); + CString sTargets = sLine.Token(1).TrimPrefix_n(); CString sMsg = sLine.Token(2, true).TrimPrefix_n(); - if (sTarget.TrimPrefix(m_pUser->GetStatusPrefix())) { - if (!sTarget.Equals("status")) { - CALLMOD(sTarget, this, m_pUser, m_pNetwork, OnModNotice(sMsg)); - } - return; - } - - if (sMsg.WildCmp("\001*\001")) { - CString sCTCP = sMsg; - sCTCP.LeftChomp(); - sCTCP.RightChomp(); - - NETWORKMODULECALL(OnUserCTCPReply(sTarget, sCTCP), m_pUser, m_pNetwork, this, &bReturn); - if (bReturn) return; - - sMsg = "\001" + sCTCP + "\001"; - } else { - NETWORKMODULECALL(OnUserNotice(sTarget, sMsg), m_pUser, m_pNetwork, this, &bReturn); - if (bReturn) return; - } - - if (!GetIRCSock()) { - // Some lagmeters do a NOTICE to their own nick, ignore those. - if (!sTarget.Equals(m_sNick)) - PutStatus("Your notice to [" + sTarget + "] got lost, " - "you are not connected to IRC!"); - return; - } - - if (m_pNetwork) { - CChan* pChan = m_pNetwork->FindChan(sTarget); - - if ((pChan) && (!pChan->AutoClearChanBuffer())) { - pChan->AddBuffer(":" + _NAMEDFMT(GetNickMask()) + " NOTICE " + _NAMEDFMT(sTarget) + " :{text}", sMsg); - } - - // Relay to the rest of the clients that may be connected to this user - if (m_pNetwork->IsChan(sTarget)) { - vector& vClients = GetClients(); - - for (unsigned int a = 0; a < vClients.size(); a++) { - CClient* pClient = vClients[a]; - - if (pClient != this) { - pClient->PutClient(":" + GetNickMask() + " NOTICE " + sTarget + " :" + sMsg); - } - } - } - - PutIRC("NOTICE " + sTarget + " :" + sMsg); - return; - } - } else if (sCommand.Equals("PRIVMSG")) { - CString sTarget = sLine.Token(1); - CString sMsg = sLine.Token(2, true).TrimPrefix_n(); - - if (sMsg.WildCmp("\001*\001")) { - CString sCTCP = sMsg; - sCTCP.LeftChomp(); - sCTCP.RightChomp(); + VCString vTargets; + sTargets.Split(",", vTargets, false); + for (CString& sTarget : vTargets) { if (sTarget.TrimPrefix(m_pUser->GetStatusPrefix())) { - if (sTarget.Equals("status")) { - StatusCTCP(sCTCP); - } else { - CALLMOD(sTarget, this, m_pUser, m_pNetwork, OnModCTCP(sCTCP)); + if (!sTarget.Equals("status")) { + CALLMOD(sTarget, this, m_pUser, m_pNetwork, OnModNotice(sMsg)); } - return; + continue; + } + + bool bContinue = false; + if (sMsg.WildCmp("\001*\001")) { + CString sCTCP = sMsg; + sCTCP.LeftChomp(); + sCTCP.RightChomp(); + + NETWORKMODULECALL(OnUserCTCPReply(sTarget, sCTCP), m_pUser, m_pNetwork, this, &bContinue); + if (bContinue) continue; + + sMsg = "\001" + sCTCP + "\001"; + } else { + NETWORKMODULECALL(OnUserNotice(sTarget, sMsg), m_pUser, m_pNetwork, this, &bContinue); + if (bContinue) continue; + } + + if (!GetIRCSock()) { + // Some lagmeters do a NOTICE to their own nick, ignore those. + if (!sTarget.Equals(m_sNick)) + PutStatus("Your notice to [" + sTarget + "] got lost, " + "you are not connected to IRC!"); + continue; } if (m_pNetwork) { - if (sCTCP.Token(0).Equals("ACTION")) { - CString sMessage = sCTCP.Token(1, true); - NETWORKMODULECALL(OnUserAction(sTarget, sMessage), m_pUser, m_pNetwork, this, &bReturn); - if (bReturn) return; - sCTCP = "ACTION " + sMessage; + CChan* pChan = m_pNetwork->FindChan(sTarget); - if (m_pNetwork->IsChan(sTarget)) { - CChan* pChan = m_pNetwork->FindChan(sTarget); + if ((pChan) && (!pChan->AutoClearChanBuffer())) { + pChan->AddBuffer(":" + _NAMEDFMT(GetNickMask()) + " NOTICE " + _NAMEDFMT(sTarget) + " :{text}", sMsg); + } - if (pChan && (!pChan->AutoClearChanBuffer() || !m_pNetwork->IsUserOnline())) { - pChan->AddBuffer(":" + _NAMEDFMT(GetNickMask()) + " PRIVMSG " + _NAMEDFMT(sTarget) + " :\001ACTION {text}\001", sMessage); + // Relay to the rest of the clients that may be connected to this user + if (m_pNetwork->IsChan(sTarget)) { + vector& vClients = GetClients(); + + for (unsigned int a = 0; a < vClients.size(); a++) { + CClient* pClient = vClients[a]; + + if (pClient != this) { + pClient->PutClient(":" + GetNickMask() + " NOTICE " + sTarget + " :" + sMsg); } + } + } - // Relay to the rest of the clients that may be connected to this user - vector& vClients = GetClients(); + PutIRC("NOTICE " + sTarget + " :" + sMsg); + } + } - for (unsigned int a = 0; a < vClients.size(); a++) { - CClient* pClient = vClients[a]; + return; + } else if (sCommand.Equals("PRIVMSG")) { + CString sTargets = sLine.Token(1); + CString sMsg = sLine.Token(2, true).TrimPrefix_n(); - if (pClient != this) { - pClient->PutClient(":" + GetNickMask() + " PRIVMSG " + sTarget + " :\001" + sCTCP + "\001"); + VCString vTargets; + sTargets.Split(",", vTargets, false); + + for (CString& sTarget : vTargets) { + bool bContinue = false; + if (sMsg.WildCmp("\001*\001")) { + CString sCTCP = sMsg; + sCTCP.LeftChomp(); + sCTCP.RightChomp(); + + if (sTarget.TrimPrefix(m_pUser->GetStatusPrefix())) { + if (sTarget.Equals("status")) { + StatusCTCP(sCTCP); + } else { + CALLMOD(sTarget, this, m_pUser, m_pNetwork, OnModCTCP(sCTCP)); + } + continue; + } + + if (m_pNetwork) { + if (sCTCP.Token(0).Equals("ACTION")) { + CString sMessage = sCTCP.Token(1, true); + NETWORKMODULECALL(OnUserAction(sTarget, sMessage), m_pUser, m_pNetwork, this, &bContinue); + if (bContinue) continue; + sCTCP = "ACTION " + sMessage; + + if (m_pNetwork->IsChan(sTarget)) { + CChan* pChan = m_pNetwork->FindChan(sTarget); + + if (pChan && (!pChan->AutoClearChanBuffer() || !m_pNetwork->IsUserOnline())) { + pChan->AddBuffer(":" + _NAMEDFMT(GetNickMask()) + " PRIVMSG " + _NAMEDFMT(sTarget) + " :\001ACTION {text}\001", sMessage); + } + + // Relay to the rest of the clients that may be connected to this user + vector& vClients = GetClients(); + + for (unsigned int a = 0; a < vClients.size(); a++) { + CClient* pClient = vClients[a]; + + if (pClient != this) { + pClient->PutClient(":" + GetNickMask() + " PRIVMSG " + sTarget + " :\001" + sCTCP + "\001"); + } + } + } else { + if (!m_pUser->AutoClearQueryBuffer() || !m_pNetwork->IsUserOnline()) { + CQuery* pQuery = m_pNetwork->AddQuery(sTarget); + if (pQuery) { + pQuery->AddBuffer(":" + _NAMEDFMT(GetNickMask()) + " PRIVMSG " + _NAMEDFMT(sTarget) + " :\001ACTION {text}\001", sMessage); + } } } } else { - if (!m_pUser->AutoClearQueryBuffer() || !m_pNetwork->IsUserOnline()) { - CQuery* pQuery = m_pNetwork->AddQuery(sTarget); - if (pQuery) { - pQuery->AddBuffer(":" + _NAMEDFMT(GetNickMask()) + " PRIVMSG " + _NAMEDFMT(sTarget) + " :\001ACTION {text}\001", sMessage); - } - } + NETWORKMODULECALL(OnUserCTCP(sTarget, sCTCP), m_pUser, m_pNetwork, this, &bContinue); + if (bContinue) continue; + } + + PutIRC("PRIVMSG " + sTarget + " :\001" + sCTCP + "\001"); + } + + continue; + } + + if (sTarget.TrimPrefix(m_pUser->GetStatusPrefix())) { + if (sTarget.Equals("status")) { + UserCommand(sMsg); + } else { + CALLMOD(sTarget, this, m_pUser, m_pNetwork, OnModCommand(sMsg)); + } + continue; + } + + NETWORKMODULECALL(OnUserMsg(sTarget, sMsg), m_pUser, m_pNetwork, this, &bContinue); + if (bContinue) continue; + + if (!GetIRCSock()) { + // Some lagmeters do a PRIVMSG to their own nick, ignore those. + if (!sTarget.Equals(m_sNick)) + PutStatus("Your message to [" + sTarget + "] got lost, " + "you are not connected to IRC!"); + continue; + } + + if (m_pNetwork) { + if (m_pNetwork->IsChan(sTarget)) { + CChan* pChan = m_pNetwork->FindChan(sTarget); + + if ((pChan) && (!pChan->AutoClearChanBuffer() || !m_pNetwork->IsUserOnline())) { + pChan->AddBuffer(":" + _NAMEDFMT(GetNickMask()) + " PRIVMSG " + _NAMEDFMT(sTarget) + " :{text}", sMsg); } } else { - NETWORKMODULECALL(OnUserCTCP(sTarget, sCTCP), m_pUser, m_pNetwork, this, &bReturn); - if (bReturn) return; - } - - PutIRC("PRIVMSG " + sTarget + " :\001" + sCTCP + "\001"); - } - - return; - } - - if (sTarget.TrimPrefix(m_pUser->GetStatusPrefix())) { - if (sTarget.Equals("status")) { - UserCommand(sMsg); - } else { - CALLMOD(sTarget, this, m_pUser, m_pNetwork, OnModCommand(sMsg)); - } - return; - } - - NETWORKMODULECALL(OnUserMsg(sTarget, sMsg), m_pUser, m_pNetwork, this, &bReturn); - if (bReturn) return; - - if (!GetIRCSock()) { - // Some lagmeters do a PRIVMSG to their own nick, ignore those. - if (!sTarget.Equals(m_sNick)) - PutStatus("Your message to [" + sTarget + "] got lost, " - "you are not connected to IRC!"); - return; - } - - if (m_pNetwork) { - if (m_pNetwork->IsChan(sTarget)) { - CChan* pChan = m_pNetwork->FindChan(sTarget); - - if ((pChan) && (!pChan->AutoClearChanBuffer() || !m_pNetwork->IsUserOnline())) { - pChan->AddBuffer(":" + _NAMEDFMT(GetNickMask()) + " PRIVMSG " + _NAMEDFMT(sTarget) + " :{text}", sMsg); - } - } else { - if (!m_pUser->AutoClearQueryBuffer() || !m_pNetwork->IsUserOnline()) { - CQuery* pQuery = m_pNetwork->AddQuery(sTarget); - if (pQuery) { - pQuery->AddBuffer(":" + _NAMEDFMT(GetNickMask()) + " PRIVMSG " + _NAMEDFMT(sTarget) + " :{text}", sMsg); + if (!m_pUser->AutoClearQueryBuffer() || !m_pNetwork->IsUserOnline()) { + CQuery* pQuery = m_pNetwork->AddQuery(sTarget); + if (pQuery) { + pQuery->AddBuffer(":" + _NAMEDFMT(GetNickMask()) + " PRIVMSG " + _NAMEDFMT(sTarget) + " :{text}", sMsg); + } } } - } - PutIRC("PRIVMSG " + sTarget + " :" + sMsg); + PutIRC("PRIVMSG " + sTarget + " :" + sMsg); - // Relay to the rest of the clients that may be connected to this user + // Relay to the rest of the clients that may be connected to this user - if (m_pNetwork->IsChan(sTarget)) { - vector& vClients = GetClients(); + if (m_pNetwork->IsChan(sTarget)) { + vector& vClients = GetClients(); - for (unsigned int a = 0; a < vClients.size(); a++) { - CClient* pClient = vClients[a]; + for (unsigned int a = 0; a < vClients.size(); a++) { + CClient* pClient = vClients[a]; - if (pClient != this) { - pClient->PutClient(":" + GetNickMask() + " PRIVMSG " + sTarget + " :" + sMsg); + if (pClient != this) { + pClient->PutClient(":" + GetNickMask() + " PRIVMSG " + sTarget + " :" + sMsg); + } } } }