From ecabbd2bcd206f8023c2ed0d83efb4025f46bc05 Mon Sep 17 00:00:00 2001 From: psychon Date: Fri, 22 Aug 2008 12:48:56 +0000 Subject: [PATCH] Fix some of the direct module calls in Client.cpp OnModCTCP(), OnModCommand() and OnModNotice() are now called through a preprocessor macro that does all the magic. This fixes a couple of bugs: - the m_pUser member of global modules for OnModNotice() was wrong - OnModCTCP() wasn't called for global modules - Finally handle 'throw UNLOAD' for all of this three module calls git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@1162 726aef4b-f618-498e-8847-2d620e286838 --- Client.cpp | 76 ++++++++++++++++++++++++++---------------------------- 1 file changed, 37 insertions(+), 39 deletions(-) diff --git a/Client.cpp b/Client.cpp index e0cf0a1e..0a022ae3 100644 --- a/Client.cpp +++ b/Client.cpp @@ -14,6 +14,40 @@ #include "User.h" #include "znc.h" +#define CALLMOD(MOD, CLIENT, USER, FUNC) \ +do { \ + CModule* pModule = CZNC::Get().GetModules().FindModule(MOD); \ + \ + if (pModule) { \ + try { \ + pModule->SetClient(CLIENT); \ + pModule->SetUser(USER); \ + pModule->FUNC; \ + pModule->SetClient(NULL); \ + pModule->SetUser(NULL); \ + } catch (CModule::EModException e) { \ + if (e == CModule::UNLOAD) { \ + CZNC::Get().GetModules().UnloadModule(MOD); \ + } \ + } \ + } else { \ + pModule = USER->GetModules().FindModule(sModule); \ + if (pModule) { \ + try { \ + pModule->SetClient(CLIENT); \ + pModule->FUNC; \ + pModule->SetClient(NULL); \ + } catch (CModule::EModException e) { \ + if (e == CModule::UNLOAD) { \ + USER->GetModules().UnloadModule(MOD); \ + } \ + } \ + } else { \ + PutStatus("No such module [" + sModule + "]"); \ + } \ + } \ +} while (false) + CClient::~CClient() { if (!m_spAuth.IsNull()) { CClientAuth* pAuth = (CClientAuth*) &(*m_spAuth); @@ -283,19 +317,7 @@ void CClient::ReadLine(const CString& sData) { CString sModule = sTarget; sModule.LeftChomp(m_pUser->GetStatusPrefix().length()); - CModule* pModule = CZNC::Get().GetModules().FindModule(sModule); - - if (pModule) { - pModule->SetClient(this); - pModule->OnModNotice(sMsg); - pModule->SetClient(NULL); - } else if ((pModule = m_pUser->GetModules().FindModule(sModule))) { - pModule->SetClient(this); - pModule->OnModNotice(sMsg); - pModule->SetClient(NULL); - } else { - PutStatus("No such module [" + sModule + "]"); - } + CALLMOD(sModule, this, m_pUser, OnModNotice(sMsg)); } #endif return; @@ -461,14 +483,7 @@ void CClient::ReadLine(const CString& sData) { } #ifdef _MODULES - CModule* pModule = m_pUser->GetModules().FindModule(sModule); - if (pModule) { - pModule->SetClient(this); - pModule->OnModCTCP(sCTCP); - pModule->SetClient(NULL); - } else { - PutStatus("No such module [" + sModule + "]"); - } + CALLMOD(sModule, this, m_pUser, OnModCTCP(sCTCP)); #endif return; } @@ -516,24 +531,7 @@ void CClient::ReadLine(const CString& sData) { CString sModule = sTarget; sModule.LeftChomp(m_pUser->GetStatusPrefix().length()); - CModule* pModule = CZNC::Get().GetModules().FindModule(sModule); - - if (pModule) { - pModule->SetClient(this); - pModule->SetUser(m_pUser); - pModule->OnModCommand(sMsg); - pModule->SetClient(NULL); - pModule->SetUser(NULL); - } else { - pModule = m_pUser->GetModules().FindModule(sModule); - if (pModule) { - pModule->SetClient(this); - pModule->OnModCommand(sMsg); - pModule->SetClient(NULL); - } else { - PutStatus("No such module [" + sModule + "]"); - } - } + CALLMOD(sModule, this, m_pUser, OnModCommand(sMsg)); } #endif return;