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
This commit is contained in:
psychon
2008-08-22 12:48:56 +00:00
parent ef31d6e239
commit ecabbd2bcd

View File

@@ -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;