From 9e3019db72c1d49727766ff2b252acf3a3ec4c53 Mon Sep 17 00:00:00 2001 From: Uli Schlachter Date: Mon, 12 Sep 2011 17:26:32 +0200 Subject: [PATCH] Remove MODULECALL macro Depending on which of its arguments where NULL, that macro called network / user modules or not. While this is nice in that it avoids crashes, this behavior actually surprised me and I'd rather have the caller explicitly say what it wanted to do. This macro is replaced with explicit calls to {GLOBAL,USER,NETWORKMODULECALL}. Since there are actually module calls which do provide a CClient*, but may happen before login (OnUnknownUserRaw() and the 3 CAP hooks), those are changed to get the client pointer as their first argument. This should make it more obvious that these module calls are special. This commit should make it easier to catch bugs like the recent OnClientDisconnected() with m_pUser == NULL. Signed-off-by: Uli Schlachter --- Chan.cpp | 20 ++++++++++---------- Client.cpp | 38 +++++++++++++++++++------------------- ClientCommand.cpp | 2 +- IRCNetwork.cpp | 4 ++-- IRCSock.cpp | 46 +++++++++++++++++++++++----------------------- Listener.cpp | 4 ++-- Modules.cpp | 34 +++++++++++++++++----------------- Modules.h | 22 ++++++++++++---------- main.h | 19 +++++++++---------- znc.cpp | 8 ++++---- 10 files changed, 99 insertions(+), 98 deletions(-) diff --git a/Chan.cpp b/Chan.cpp index 31e74c0b..9d7be68b 100644 --- a/Chan.cpp +++ b/Chan.cpp @@ -251,7 +251,7 @@ void CChan::ModeChange(const CString& sModes, const CNick* pOpNick) { } if (pOpNick) { - MODULECALL(OnRawMode(*pOpNick, *this, sModeArg, sArgs), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); + NETWORKMODULECALL(OnRawMode(*pOpNick, *this, sModeArg, sArgs), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); } for (unsigned int a = 0; a < sModeArg.size(); a++) { @@ -284,19 +284,19 @@ void CChan::ModeChange(const CString& sModes, const CNick* pOpNick) { bool bNoChange = (pNick->HasPerm(uPerm) == bAdd); if (uMode && pOpNick) { - MODULECALL(OnChanPermission(*pOpNick, *pNick, *this, uMode, bAdd, bNoChange), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); + NETWORKMODULECALL(OnChanPermission(*pOpNick, *pNick, *this, uMode, bAdd, bNoChange), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); if (uMode == CChan::M_Op) { if (bAdd) { - MODULECALL(OnOp(*pOpNick, *pNick, *this, bNoChange), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); + NETWORKMODULECALL(OnOp(*pOpNick, *pNick, *this, bNoChange), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); } else { - MODULECALL(OnDeop(*pOpNick, *pNick, *this, bNoChange), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); + NETWORKMODULECALL(OnDeop(*pOpNick, *pNick, *this, bNoChange), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); } } else if (uMode == CChan::M_Voice) { if (bAdd) { - MODULECALL(OnVoice(*pOpNick, *pNick, *this, bNoChange), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); + NETWORKMODULECALL(OnVoice(*pOpNick, *pNick, *this, bNoChange), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); } else { - MODULECALL(OnDevoice(*pOpNick, *pNick, *this, bNoChange), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); + NETWORKMODULECALL(OnDevoice(*pOpNick, *pNick, *this, bNoChange), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); } } } @@ -332,7 +332,7 @@ void CChan::ModeChange(const CString& sModes, const CNick* pOpNick) { } else { bNoChange = !HasMode(uMode); } - MODULECALL(OnMode(*pOpNick, *this, uMode, sArg, bAdd, bNoChange), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); + NETWORKMODULECALL(OnMode(*pOpNick, *this, uMode, sArg, bAdd, bNoChange), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); if (!bList) { (bAdd) ? AddMode(uMode, sArg) : RemMode(uMode); @@ -545,7 +545,7 @@ void CChan::SendBuffer(CClient* pClient) { if (vsBuffer.size()) { bool bSkipStatusMsg = false; - MODULECALL(OnChanBufferStarting(*this, *pClient), m_pNetwork->GetUser(), m_pNetwork, NULL, bSkipStatusMsg = true); + NETWORKMODULECALL(OnChanBufferStarting(*this, *pClient), m_pNetwork->GetUser(), m_pNetwork, NULL, bSkipStatusMsg = true); if (!bSkipStatusMsg) { m_pNetwork->PutUser(":***!znc@znc.in PRIVMSG " + GetName() + " :Buffer Playback...", pClient); @@ -553,7 +553,7 @@ void CChan::SendBuffer(CClient* pClient) { for (unsigned int a = 0; a < vsBuffer.size(); a++) { CString sLine(vsBuffer[a]); - MODULECALL(OnChanBufferPlayLine(*this, *pClient, sLine), m_pNetwork->GetUser(), m_pNetwork, NULL, continue); + NETWORKMODULECALL(OnChanBufferPlayLine(*this, *pClient, sLine), m_pNetwork->GetUser(), m_pNetwork, NULL, continue); m_pNetwork->PutUser(sLine, pClient); } @@ -562,7 +562,7 @@ void CChan::SendBuffer(CClient* pClient) { } bSkipStatusMsg = false; - MODULECALL(OnChanBufferEnding(*this, *pClient), m_pNetwork->GetUser(), m_pNetwork, NULL, bSkipStatusMsg = true); + NETWORKMODULECALL(OnChanBufferEnding(*this, *pClient), m_pNetwork->GetUser(), m_pNetwork, NULL, bSkipStatusMsg = true); if (!bSkipStatusMsg) { m_pNetwork->PutUser(":***!znc@znc.in PRIVMSG " + GetName() + " :Playback Complete.", pClient); diff --git a/Client.cpp b/Client.cpp index e0725608..aded3c1e 100644 --- a/Client.cpp +++ b/Client.cpp @@ -77,9 +77,9 @@ void CClient::ReadLine(const CString& sData) { DEBUG("(" << GetFullName() << ") CLI -> ZNC [" << sLine << "]"); if (IsAttached()) { - MODULECALL(OnUserRaw(sLine), m_pUser, m_pNetwork, this, return); + NETWORKMODULECALL(OnUserRaw(sLine), m_pUser, m_pNetwork, this, return); } else { - GLOBALMODULECALL(OnUnknownUserRaw(sLine), m_pUser, m_pNetwork, this, return); + GLOBALMODULECALL(OnUnknownUserRaw(this, sLine), return); } CString sCommand = sLine.Token(0); @@ -233,11 +233,11 @@ void CClient::ReadLine(const CString& sData) { sCTCP.LeftChomp(); sCTCP.RightChomp(); - MODULECALL(OnUserCTCPReply(sTarget, sCTCP), m_pUser, m_pNetwork, this, return); + NETWORKMODULECALL(OnUserCTCPReply(sTarget, sCTCP), m_pUser, m_pNetwork, this, return); sMsg = "\001" + sCTCP + "\001"; } else { - MODULECALL(OnUserNotice(sTarget, sMsg), m_pUser, m_pNetwork, this, return); + NETWORKMODULECALL(OnUserNotice(sTarget, sMsg), m_pUser, m_pNetwork, this, return); } if (!GetIRCSock()) { @@ -298,7 +298,7 @@ void CClient::ReadLine(const CString& sData) { if (sCTCP.Token(0).Equals("ACTION")) { CString sMessage = sCTCP.Token(1, true); - MODULECALL(OnUserAction(sTarget, sMessage), m_pUser, m_pNetwork, this, return); + NETWORKMODULECALL(OnUserAction(sTarget, sMessage), m_pUser, m_pNetwork, this, return); sCTCP = "ACTION " + sMessage; if (pChan && pChan->KeepBuffer()) { @@ -319,7 +319,7 @@ void CClient::ReadLine(const CString& sData) { } } } else { - MODULECALL(OnUserCTCP(sTarget, sCTCP), m_pUser, m_pNetwork, this, return); + NETWORKMODULECALL(OnUserCTCP(sTarget, sCTCP), m_pUser, m_pNetwork, this, return); } if (m_pNetwork) { @@ -338,7 +338,7 @@ void CClient::ReadLine(const CString& sData) { return; } - MODULECALL(OnUserMsg(sTarget, sMsg), m_pUser, m_pNetwork, this, return); + NETWORKMODULECALL(OnUserMsg(sTarget, sMsg), m_pUser, m_pNetwork, this, return); if (!GetIRCSock()) { // Some lagmeters do a PRIVMSG to their own nick, ignore those. @@ -410,7 +410,7 @@ void CClient::ReadLine(const CString& sData) { for (unsigned int a = 0; a < vChans.size(); a++) { CString sChannel = vChans[a]; - MODULECALL(OnUserJoin(sChannel, sKey), m_pUser, m_pNetwork, this, continue); + NETWORKMODULECALL(OnUserJoin(sChannel, sKey), m_pUser, m_pNetwork, this, continue); CChan* pChan = m_pNetwork->FindChan(sChannel); if (pChan) { @@ -444,7 +444,7 @@ void CClient::ReadLine(const CString& sData) { sMessage.LeftChomp(); } - MODULECALL(OnUserPart(sChan, sMessage), m_pUser, m_pNetwork, this, return); + NETWORKMODULECALL(OnUserPart(sChan, sMessage), m_pUser, m_pNetwork, this, return); CChan* pChan = m_pNetwork->FindChan(sChan); @@ -466,10 +466,10 @@ void CClient::ReadLine(const CString& sData) { if (!sTopic.empty()) { if (sTopic.Left(1) == ":") sTopic.LeftChomp(); - MODULECALL(OnUserTopic(sChan, sTopic), m_pUser, m_pNetwork, this, return); + NETWORKMODULECALL(OnUserTopic(sChan, sTopic), m_pUser, m_pNetwork, this, return); sLine = "TOPIC " + sChan + " :" + sTopic; } else { - MODULECALL(OnUserTopicRequest(sChan), m_pUser, m_pNetwork, this, return); + NETWORKMODULECALL(OnUserTopicRequest(sChan), m_pUser, m_pNetwork, this, return); } } else if (m_pNetwork && sCommand.Equals("MODE")) { CString sTarget = sLine.Token(1); @@ -625,7 +625,7 @@ void CAuthBase::RefuseLogin(const CString& sReason) { "to login as you, but was rejected [" + sReason + "]."); } - GLOBALMODULECALL(OnFailedLogin(GetUsername(), GetRemoteIP()), NULL, NULL, NULL, NOTHING); + GLOBALMODULECALL(OnFailedLogin(GetUsername(), GetRemoteIP()), NOTHING); RefusedLogin(sReason); Invalidate(); } @@ -666,7 +666,7 @@ void CClient::AcceptLogin(CUser& User) { SendMotd(); - MODULECALL(OnClientLogin(), m_pUser, m_pNetwork, this, NOTHING); + NETWORKMODULECALL(OnClientLogin(), m_pUser, m_pNetwork, this, NOTHING); } void CClient::Timeout() { @@ -686,7 +686,7 @@ void CClient::Disconnected() { SetNetwork(NULL, true, false); if (m_pUser) { - MODULECALL(OnClientDisconnect(), m_pUser, m_pNetwork, this, NOTHING); + NETWORKMODULECALL(OnClientDisconnect(), m_pUser, m_pNetwork, this, NOTHING); } } @@ -790,7 +790,7 @@ void CClient::HandleCap(const CString& sLine) if (sSubCmd.Equals("LS")) { SCString ssOfferCaps; - GLOBALMODULECALL(OnClientCapLs(ssOfferCaps), m_pUser, m_pNetwork, this, NOTHING); + GLOBALMODULECALL(OnClientCapLs(this, ssOfferCaps), NOTHING); CString sRes; for (SCString::iterator i = ssOfferCaps.begin(); i != ssOfferCaps.end(); ++i) { sRes += *i + " "; @@ -812,7 +812,7 @@ void CClient::HandleCap(const CString& sLine) bVal = false; bool bAccepted = ("multi-prefix" == sCap) || ("userhost-in-names" == sCap); - GLOBALMODULECALL(IsClientCapSupported(sCap, bVal), m_pUser, m_pNetwork, this, bAccepted = true); + GLOBALMODULECALL(IsClientCapSupported(this, sCap, bVal), bAccepted = true); if (!bAccepted) { // Some unsupported capability is requested @@ -832,7 +832,7 @@ void CClient::HandleCap(const CString& sLine) } else if ("userhost-in-names" == *it) { m_bUHNames = bVal; } - GLOBALMODULECALL(OnClientCapRequest(*it, bVal), m_pUser, m_pNetwork, this, NOTHING); + GLOBALMODULECALL(OnClientCapRequest(this, *it, bVal), NOTHING); if (bVal) { m_ssAcceptedCaps.insert(*it); @@ -852,9 +852,9 @@ void CClient::HandleCap(const CString& sLine) SCString ssRemoved; for (SCString::iterator i = m_ssAcceptedCaps.begin(); i != m_ssAcceptedCaps.end(); ++i) { bool bRemoving = false; - GLOBALMODULECALL(IsClientCapSupported(*i, false), m_pUser, m_pNetwork, this, bRemoving = true); + GLOBALMODULECALL(IsClientCapSupported(this, *i, false), bRemoving = true); if (bRemoving) { - GLOBALMODULECALL(OnClientCapRequest(*i, false), m_pUser, m_pNetwork, this, NOTHING); + GLOBALMODULECALL(OnClientCapRequest(this, *i, false), NOTHING); ssRemoved.insert(*i); } } diff --git a/ClientCommand.cpp b/ClientCommand.cpp index e84ee582..41a9f917 100644 --- a/ClientCommand.cpp +++ b/ClientCommand.cpp @@ -25,7 +25,7 @@ void CClient::UserCommand(CString& sLine) { return; } - MODULECALL(OnStatusCommand(sLine), m_pUser, m_pNetwork, this, return); + NETWORKMODULECALL(OnStatusCommand(sLine), m_pUser, m_pNetwork, this, return); const CString sCommand = sLine.Token(0); diff --git a/IRCNetwork.cpp b/IRCNetwork.cpp index ca1ac58e..a7864c07 100644 --- a/IRCNetwork.cpp +++ b/IRCNetwork.cpp @@ -342,7 +342,7 @@ void CIRCNetwork::ClientConnected(CClient *pClient) { CString sBufLine; while (m_QueryBuffer.GetNextLine(GetIRCNick().GetNick(), sBufLine)) { - MODULECALL(OnPrivBufferPlayLine(*pClient, sBufLine), m_pUser, this, NULL, continue); + NETWORKMODULECALL(OnPrivBufferPlayLine(*pClient, sBufLine), m_pUser, this, NULL, continue); pClient->PutClient(sBufLine); } @@ -547,7 +547,7 @@ bool CIRCNetwork::JoinChan(CChan* pChan) { pChan->Disable(); } else { pChan->IncJoinTries(); - MODULECALL(OnTimerAutoJoin(*pChan), m_pUser, this, NULL, return false); + NETWORKMODULECALL(OnTimerAutoJoin(*pChan), m_pUser, this, NULL, return false); return true; } return false; diff --git a/IRCSock.cpp b/IRCSock.cpp index 61c035a8..0ba5ed7c 100644 --- a/IRCSock.cpp +++ b/IRCSock.cpp @@ -52,7 +52,7 @@ CIRCSock::CIRCSock(CIRCNetwork* pNetwork) : CZNCSock() { CIRCSock::~CIRCSock() { if (!m_bAuthed) { - MODULECALL(OnIRCConnectionError(this), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); + NETWORKMODULECALL(OnIRCConnectionError(this), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); } const vector& vChans = m_pNetwork->GetChans(); @@ -92,7 +92,7 @@ void CIRCSock::ReadLine(const CString& sData) { DEBUG("(" << m_pNetwork->GetUser()->GetUserName() << "/" << m_pNetwork->GetName() << ") IRC -> ZNC [" << sLine << "]"); - MODULECALL(OnRaw(sLine), m_pNetwork->GetUser(), m_pNetwork, NULL, return); + NETWORKMODULECALL(OnRaw(sLine), m_pNetwork->GetUser(), m_pNetwork, NULL, return); if (sLine.Equals("PING ", false, 5)) { // Generate a reply and don't forward this to any user, @@ -152,7 +152,7 @@ void CIRCSock::ReadLine(const CString& sData) { SetNick(sNick); - MODULECALL(OnIRCConnected(), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); + NETWORKMODULECALL(OnIRCConnected(), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); m_pNetwork->ClearRawBuffer(); m_pNetwork->AddRawBuffer(":" + sServer + " " + sCmd + " ", " " + sRest); @@ -397,7 +397,7 @@ void CIRCSock::ReadLine(const CString& sData) { SetNick(sNewNick); } - MODULECALL(OnNick(Nick, sNewNick, vFoundChans), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); + NETWORKMODULECALL(OnNick(Nick, sNewNick, vFoundChans), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); if (!bIsVisible) { return; @@ -435,7 +435,7 @@ void CIRCSock::ReadLine(const CString& sData) { } } - MODULECALL(OnQuit(Nick, sMessage, vFoundChans), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); + NETWORKMODULECALL(OnQuit(Nick, sMessage, vFoundChans), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); if (!bIsVisible) { return; @@ -463,7 +463,7 @@ void CIRCSock::ReadLine(const CString& sData) { if (pChan) { pChan->AddNick(Nick.GetNickMask()); - MODULECALL(OnJoin(Nick.GetNickMask(), *pChan), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); + NETWORKMODULECALL(OnJoin(Nick.GetNickMask(), *pChan), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); if (pChan->IsDetached()) { return; @@ -480,7 +480,7 @@ void CIRCSock::ReadLine(const CString& sData) { bool bDetached = false; if (pChan) { pChan->RemNick(Nick.GetNick()); - MODULECALL(OnPart(Nick.GetNickMask(), *pChan, sMsg), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); + NETWORKMODULECALL(OnPart(Nick.GetNickMask(), *pChan, sMsg), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); if (pChan->IsDetached()) bDetached = true; @@ -545,7 +545,7 @@ void CIRCSock::ReadLine(const CString& sData) { CChan* pChan = m_pNetwork->FindChan(sChan); if (pChan) { - MODULECALL(OnKick(Nick, sKickedNick, *pChan, sMsg), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); + NETWORKMODULECALL(OnKick(Nick, sKickedNick, *pChan, sMsg), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); // do not remove the nick till after the OnKick call, so modules // can do Chan.FindNick or something to get more info. pChan->RemNick(sKickedNick); @@ -606,7 +606,7 @@ void CIRCSock::ReadLine(const CString& sData) { CString sTopic = sLine.Token(3, true); sTopic.LeftChomp(); - MODULECALL(OnTopic(Nick, *pChan, sTopic), m_pNetwork->GetUser(), m_pNetwork, NULL, return); + NETWORKMODULECALL(OnTopic(Nick, *pChan, sTopic), m_pNetwork->GetUser(), m_pNetwork, NULL, return); pChan->SetTopicOwner(Nick.GetNick()); pChan->SetTopicDate((unsigned long) time(NULL)); @@ -706,7 +706,7 @@ void CIRCSock::ReadLine(const CString& sData) { } } else if (sSubCmd == "ACK") { sArgs.Trim(); - MODULECALL(OnServerCapResult(sArgs, true), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); + NETWORKMODULECALL(OnServerCapResult(sArgs, true), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); if ("multi-prefix" == sArgs) { m_bNamesx = true; } else if ("userhost-in-names" == sArgs) { @@ -717,7 +717,7 @@ void CIRCSock::ReadLine(const CString& sData) { // This should work because there's no [known] // capability with length of name more than 100 characters. sArgs.Trim(); - MODULECALL(OnServerCapResult(sArgs, false), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); + NETWORKMODULECALL(OnServerCapResult(sArgs, false), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); } SendNextCap(); @@ -753,21 +753,21 @@ void CIRCSock::ResumeCap() { } bool CIRCSock::OnServerCapAvailable(const CString& sCap) { - MODULECALL(OnServerCapAvailable(sCap), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); + NETWORKMODULECALL(OnServerCapAvailable(sCap), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); return false; } bool CIRCSock::OnCTCPReply(CNick& Nick, CString& sMessage) { - MODULECALL(OnCTCPReply(Nick, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); + NETWORKMODULECALL(OnCTCPReply(Nick, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); return false; } bool CIRCSock::OnPrivCTCP(CNick& Nick, CString& sMessage) { - MODULECALL(OnPrivCTCP(Nick, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); + NETWORKMODULECALL(OnPrivCTCP(Nick, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); if (sMessage.TrimPrefix("ACTION ")) { - MODULECALL(OnPrivAction(Nick, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); + NETWORKMODULECALL(OnPrivAction(Nick, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); if (!m_pNetwork->IsUserAttached()) { // If the user is detached, add to the buffer @@ -822,7 +822,7 @@ bool CIRCSock::OnGeneralCTCP(CNick& Nick, CString& sMessage) { } bool CIRCSock::OnPrivNotice(CNick& Nick, CString& sMessage) { - MODULECALL(OnPrivNotice(Nick, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); + NETWORKMODULECALL(OnPrivNotice(Nick, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); if (!m_pNetwork->IsUserAttached()) { // If the user is detached, add to the buffer @@ -833,7 +833,7 @@ bool CIRCSock::OnPrivNotice(CNick& Nick, CString& sMessage) { } bool CIRCSock::OnPrivMsg(CNick& Nick, CString& sMessage) { - MODULECALL(OnPrivMsg(Nick, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); + NETWORKMODULECALL(OnPrivMsg(Nick, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); if (!m_pNetwork->IsUserAttached()) { // If the user is detached, add to the buffer @@ -846,11 +846,11 @@ bool CIRCSock::OnPrivMsg(CNick& Nick, CString& sMessage) { bool CIRCSock::OnChanCTCP(CNick& Nick, const CString& sChan, CString& sMessage) { CChan* pChan = m_pNetwork->FindChan(sChan); if (pChan) { - MODULECALL(OnChanCTCP(Nick, *pChan, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); + NETWORKMODULECALL(OnChanCTCP(Nick, *pChan, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); // Record a /me if (sMessage.TrimPrefix("ACTION ")) { - MODULECALL(OnChanAction(Nick, *pChan, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); + NETWORKMODULECALL(OnChanAction(Nick, *pChan, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); if (pChan->KeepBuffer() || !m_pNetwork->IsUserAttached() || pChan->IsDetached()) { pChan->AddBuffer(":" + Nick.GetNickMask() + " PRIVMSG " + sChan + " :\001ACTION " + m_pNetwork->GetUser()->AddTimestamp(sMessage) + "\001"); } @@ -867,7 +867,7 @@ bool CIRCSock::OnChanCTCP(CNick& Nick, const CString& sChan, CString& sMessage) bool CIRCSock::OnChanNotice(CNick& Nick, const CString& sChan, CString& sMessage) { CChan* pChan = m_pNetwork->FindChan(sChan); if (pChan) { - MODULECALL(OnChanNotice(Nick, *pChan, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); + NETWORKMODULECALL(OnChanNotice(Nick, *pChan, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); if (pChan->KeepBuffer() || !m_pNetwork->IsUserAttached() || pChan->IsDetached()) { pChan->AddBuffer(":" + Nick.GetNickMask() + " NOTICE " + sChan + " :" + m_pNetwork->GetUser()->AddTimestamp(sMessage)); @@ -880,7 +880,7 @@ bool CIRCSock::OnChanNotice(CNick& Nick, const CString& sChan, CString& sMessage bool CIRCSock::OnChanMsg(CNick& Nick, const CString& sChan, CString& sMessage) { CChan* pChan = m_pNetwork->FindChan(sChan); if (pChan) { - MODULECALL(OnChanMsg(Nick, *pChan, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); + NETWORKMODULECALL(OnChanMsg(Nick, *pChan, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); if (pChan->KeepBuffer() || !m_pNetwork->IsUserAttached() || pChan->IsDetached()) { pChan->AddBuffer(":" + Nick.GetNickMask() + " PRIVMSG " + sChan + " :" + m_pNetwork->GetUser()->AddTimestamp(sMessage)); @@ -908,7 +908,7 @@ void CIRCSock::Connected() { CString sIdent = m_pNetwork->GetUser()->GetIdent(); CString sRealName = m_pNetwork->GetUser()->GetRealName(); - MODULECALL(OnIRCRegistration(sPass, sNick, sIdent, sRealName), m_pNetwork->GetUser(), m_pNetwork, NULL, return); + NETWORKMODULECALL(OnIRCRegistration(sPass, sNick, sIdent, sRealName), m_pNetwork->GetUser(), m_pNetwork, NULL, return); PutIRC("CAP LS"); @@ -924,7 +924,7 @@ void CIRCSock::Connected() { } void CIRCSock::Disconnected() { - MODULECALL(OnIRCDisconnected(), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); + NETWORKMODULECALL(OnIRCDisconnected(), m_pNetwork->GetUser(), m_pNetwork, NULL, NOTHING); DEBUG(GetSockName() << " == Disconnected()"); if (!m_pNetwork->GetUser()->IsBeingDeleted() && m_pNetwork->GetUser()->GetIRCConnectEnabled() && diff --git a/Listener.cpp b/Listener.cpp index 4e0dccef..f1eed17d 100644 --- a/Listener.cpp +++ b/Listener.cpp @@ -55,11 +55,11 @@ bool CRealListener::ConnectionFrom(const CString& sHost, unsigned short uPort) { Csock* CRealListener::GetSockObj(const CString& sHost, unsigned short uPort) { CIncomingConnection *pClient = new CIncomingConnection(sHost, uPort, m_pParent->GetAcceptType()); if (CZNC::Get().AllowConnectionFrom(sHost)) { - GLOBALMODULECALL(OnClientConnect(pClient, sHost, uPort), NULL, NULL, NULL, NOTHING); + GLOBALMODULECALL(OnClientConnect(pClient, sHost, uPort), NOTHING); } else { pClient->Write(":irc.znc.in 464 unknown-nick :Too many anonymous connections from your IP\r\n"); pClient->Close(Csock::CLT_AFTERWRITE); - GLOBALMODULECALL(OnFailedLogin("", sHost), NULL, NULL, NULL, NOTHING); + GLOBALMODULECALL(OnFailedLogin("", sHost), NOTHING); } return pClient; } diff --git a/Modules.cpp b/Modules.cpp index 0cec46d5..90547251 100644 --- a/Modules.cpp +++ b/Modules.cpp @@ -597,10 +597,10 @@ CModule::EModRet CModule::OnDeleteUser(CUser& User) { return CONTINUE; } void CModule::OnClientConnect(CZNCSock* pClient, const CString& sHost, unsigned short uPort) {} CModule::EModRet CModule::OnLoginAttempt(CSmartPtr Auth) { return CONTINUE; } void CModule::OnFailedLogin(const CString& sUsername, const CString& sRemoteIP) {} -CModule::EModRet CModule::OnUnknownUserRaw(CString& sLine) { return CONTINUE; } -void CModule::OnClientCapLs(SCString& ssCaps) {} -bool CModule::IsClientCapSupported(const CString& sCap, bool bState) { return false; } -void CModule::OnClientCapRequest(const CString& sCap, bool bState) {} +CModule::EModRet CModule::OnUnknownUserRaw(CClient* pClient, CString& sLine) { return CONTINUE; } +void CModule::OnClientCapLs(CClient* pClient, SCString& ssCaps) {} +bool CModule::IsClientCapSupported(CClient* pClient, const CString& sCap, bool bState) { return false; } +void CModule::OnClientCapRequest(CClient* pClient, const CString& sCap, bool bState) {} CModule::EModRet CModule::OnModuleLoading(const CString& sModName, const CString& sArgs, CModInfo::EModuleType eType, bool& bSuccess, CString& sRetMsg) { return CONTINUE; } CModule::EModRet CModule::OnModuleUnloading(CModule* pModule, bool& bSuccess, CString& sRetMsg) { @@ -754,17 +754,17 @@ bool CModules::OnFailedLogin(const CString& sUsername, const CString& sRemoteIP) return false; } -bool CModules::OnUnknownUserRaw(CString& sLine) { - MODHALTCHK(OnUnknownUserRaw(sLine)); +bool CModules::OnUnknownUserRaw(CClient* pClient, CString& sLine) { + MODHALTCHK(OnUnknownUserRaw(pClient, sLine)); } -bool CModules::OnClientCapLs(SCString& ssCaps) { - MODUNLOADCHK(OnClientCapLs(ssCaps)); +bool CModules::OnClientCapLs(CClient* pClient, SCString& ssCaps) { + MODUNLOADCHK(OnClientCapLs(pClient, ssCaps)); return false; } // Maybe create new macro for this? -bool CModules::IsClientCapSupported(const CString& sCap, bool bState) { +bool CModules::IsClientCapSupported(CClient* pClient, const CString& sCap, bool bState) { bool bResult = false; for (unsigned int a = 0; a < size(); ++a) { try { @@ -774,11 +774,11 @@ bool CModules::IsClientCapSupported(const CString& sCap, bool bState) { if (m_pUser) { CUser* pOldUser = pMod->GetUser(); pMod->SetUser(m_pUser); - bResult |= pMod->IsClientCapSupported(sCap, bState); + bResult |= pMod->IsClientCapSupported(pClient, sCap, bState); pMod->SetUser(pOldUser); } else { // WTF? Is that possible? - bResult |= pMod->IsClientCapSupported(sCap, bState); + bResult |= pMod->IsClientCapSupported(pClient, sCap, bState); } pMod->SetClient(pOldClient); } catch (CModule::EModException e) { @@ -790,8 +790,8 @@ bool CModules::IsClientCapSupported(const CString& sCap, bool bState) { return bResult; } -bool CModules::OnClientCapRequest(const CString& sCap, bool bState) { - MODUNLOADCHK(OnClientCapRequest(sCap, bState)); +bool CModules::OnClientCapRequest(CClient* pClient, const CString& sCap, bool bState) { + MODUNLOADCHK(OnClientCapRequest(pClient, sCap, bState)); return false; } @@ -834,7 +834,7 @@ bool CModules::LoadModule(const CString& sModule, const CString& sArgs, CModInfo } bool bSuccess; - GLOBALMODULECALL(OnModuleLoading(sModule, sArgs, eType, bSuccess, sRetMsg), pUser, pNetwork, NULL, return bSuccess); + _GLOBALMODULECALL(OnModuleLoading(sModule, sArgs, eType, bSuccess, sRetMsg), pUser, pNetwork, NULL, return bSuccess); CString sModPath, sDataPath; bool bVersionMismatch; @@ -922,7 +922,7 @@ bool CModules::UnloadModule(const CString& sModule, CString& sRetMsg) { } bool bSuccess; - GLOBALMODULECALL(OnModuleUnloading(pModule, bSuccess, sRetMsg), pModule->GetUser(), pModule->GetNetwork(), NULL, return bSuccess); + _GLOBALMODULECALL(OnModuleUnloading(pModule, bSuccess, sRetMsg), pModule->GetUser(), pModule->GetNetwork(), NULL, return bSuccess); ModHandle p = pModule->GetDLL(); @@ -975,7 +975,7 @@ bool CModules::GetModInfo(CModInfo& ModInfo, const CString& sModule, CString& sR CString sModPath, sTmp; bool bSuccess; - GLOBALMODULECALL(OnGetModInfo(ModInfo, sModule, bSuccess, sRetMsg), NULL, NULL, NULL, return bSuccess); + GLOBALMODULECALL(OnGetModInfo(ModInfo, sModule, bSuccess, sRetMsg), return bSuccess); if (!FindModPath(sModule, sModPath, sTmp)) { sRetMsg = "Unable to find module [" + sModule + "]"; @@ -1033,7 +1033,7 @@ void CModules::GetAvailableMods(set& ssMods, CModInfo::EModuleType eTy } } - GLOBALMODULECALL(OnGetAvailableMods(ssMods, eType), NULL, NULL, NULL, NOTHING); + GLOBALMODULECALL(OnGetAvailableMods(ssMods, eType), NOTHING); } bool CModules::FindModPath(const CString& sModule, CString& sModPath, diff --git a/Modules.h b/Modules.h index 4b5e17a3..0e3e142e 100644 --- a/Modules.h +++ b/Modules.h @@ -921,28 +921,30 @@ public: /** This function behaves like CModule::OnRaw(), but is also called * before the client successfully logged in to ZNC. You should always * prefer to use CModule::OnRaw() if possible. + * @param pClient The client which send this line. * @param sLine The raw traffic line which the client sent. - * @todo Why doesn't this use m_pUser and m_pClient? - * (Well, ok, m_pUser isn't known yet...) */ - virtual EModRet OnUnknownUserRaw(CString& sLine); + virtual EModRet OnUnknownUserRaw(CClient* pClient, CString& sLine); /** Called when a client told us CAP LS. Use ssCaps.insert("cap-name") * for announcing capabilities which your module supports. + * @param pClient The client which requested the list. * @param ssCaps set of caps which will be sent to client. */ - virtual void OnClientCapLs(SCString& ssCaps); + virtual void OnClientCapLs(CClient* pClient, SCString& ssCaps); /** Called only to check if your module supports turning on/off named capability. + * @param pClient The client which wants to enable/disable a capability. * @param sCap name of capability. * @param bState On or off, depending on which case is interesting for client. * @return true if your module supports this capability in the specified state. */ - virtual bool IsClientCapSupported(const CString& sCap, bool bState); + virtual bool IsClientCapSupported(CClient* pClient, const CString& sCap, bool bState); /** Called when we actually need to turn a capability on or off for a client. + * @param pClient The client which requested the capability. * @param sCap name of wanted capability. * @param bState On or off, depending on which case client needs. */ - virtual void OnClientCapRequest(const CString& sCap, bool bState); + virtual void OnClientCapRequest(CClient* pClient, const CString& sCap, bool bState); /** Called when a module is going to be loaded. * @param sModName name of the module. @@ -1103,10 +1105,10 @@ public: bool OnClientConnect(CZNCSock* pSock, const CString& sHost, unsigned short uPort); bool OnLoginAttempt(CSmartPtr Auth); bool OnFailedLogin(const CString& sUsername, const CString& sRemoteIP); - bool OnUnknownUserRaw(CString& sLine); - bool OnClientCapLs(SCString& ssCaps); - bool IsClientCapSupported(const CString& sCap, bool bState); - bool OnClientCapRequest(const CString& sCap, bool bState); + bool OnUnknownUserRaw(CClient* pClient, CString& sLine); + bool OnClientCapLs(CClient* pClient, SCString& ssCaps); + bool IsClientCapSupported(CClient* pClient, const CString& sCap, bool bState); + bool OnClientCapRequest(CClient* pClient, const CString& sCap, bool bState); bool OnModuleLoading(const CString& sModName, const CString& sArgs, CModInfo::EModuleType eType, bool& bSuccess, CString& sRetMsg); bool OnModuleUnloading(CModule* pModule, bool& bSuccess, CString& sRetMsg); diff --git a/main.h b/main.h index ff12cbfa..7fdd9769 100644 --- a/main.h +++ b/main.h @@ -42,7 +42,7 @@ } \ } while (false) -#define GLOBALMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER) \ +#define _GLOBALMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER) \ do { \ CModules& GMods = CZNC::Get().GetModules(); \ CUser* pOldGUser = GMods.GetUser(); \ @@ -61,9 +61,10 @@ GMods.SetClient(pOldGClient); \ } while (false) -#define USERMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER) \ +#define _USERMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER) \ do { \ assert(macUSER != NULL); \ + _GLOBALMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER); \ CModules& UMods = macUSER->GetModules(); \ CIRCNetwork* pOldUNetwork = UMods.GetNetwork(); \ CClient* pOldUClient = UMods.GetClient(); \ @@ -82,6 +83,7 @@ do { \ assert(macUSER != NULL); \ assert(macNETWORK != NULL); \ + _USERMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER); \ CModules& NMods = ((CIRCNetwork*)macNETWORK)->GetModules(); \ CClient* pOldNClient = NMods.GetClient(); \ NMods.SetClient(macCLIENT); \ @@ -92,14 +94,11 @@ NMods.SetClient(pOldNClient); \ } while (false) -#define MODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER) \ - do { \ - GLOBALMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER); \ - USERMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER); \ - if (macNETWORK) { \ - NETWORKMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER); \ - } \ - } while (false) +#define GLOBALMODULECALL(macFUNC, macEXITER) \ + _GLOBALMODULECALL(macFUNC, NULL, NULL, NULL, macEXITER) + +#define USERMODULECALL(macFUNC, macUSER, macCLIENT, macEXITER) \ + _USERMODULECALL(macFUNC, macUSER, NULL, macCLIENT, macEXITER) /** @mainpage * Welcome to the API documentation for ZNC. diff --git a/znc.cpp b/znc.cpp index 0f9662cf..dd8ece3e 100644 --- a/znc.cpp +++ b/znc.cpp @@ -137,7 +137,7 @@ bool CZNC::ConnectNetwork(CIRCNetwork *pNetwork) { } #endif - MODULECALL(OnIRCConnecting(pIRCSock), pUser, pNetwork, NULL, + NETWORKMODULECALL(OnIRCConnecting(pIRCSock), pUser, pNetwork, NULL, DEBUG("Some module aborted the connection attempt"); pUser->PutStatus("Some module aborted the connection attempt"); delete pIRCSock; @@ -1394,7 +1394,7 @@ void CZNC::Broadcast(const CString& sMessage, bool bAdminOnly, if (a->second != pSkipUser) { CString sMsg = sMessage; - MODULECALL(OnBroadcast(sMsg), a->second, NULL, NULL, continue); + USERMODULECALL(OnBroadcast(sMsg), a->second, NULL, continue); a->second->PutStatusNotice("*** " + sMsg, NULL, pSkipClient); } } @@ -1450,7 +1450,7 @@ bool CZNC::AddUser(CUser* pUser, CString& sErrorRet) { << sErrorRet << "]"); return false; } - GLOBALMODULECALL(OnAddUser(*pUser, sErrorRet), pUser, NULL, NULL, + GLOBALMODULECALL(OnAddUser(*pUser, sErrorRet), DEBUG("AddUser [" << pUser->GetUserName() << "] aborted by a module [" << sErrorRet << "]"); return false; @@ -1723,7 +1723,7 @@ CZNC::TrafficStatsMap CZNC::GetTrafficStats(TrafficStatsPair &Users, void CZNC::AuthUser(CSmartPtr AuthClass) { // TODO unless the auth module calls it, CUser::IsHostAllowed() is not honoured - GLOBALMODULECALL(OnLoginAttempt(AuthClass), NULL, NULL, NULL, return); + GLOBALMODULECALL(OnLoginAttempt(AuthClass), return); CUser* pUser = FindUser(AuthClass->GetUsername());