This commit is contained in:
Alexey Sokolov
2012-08-10 19:32:27 +07:00
parent 2370567f9c
commit 27aa7036f5
9 changed files with 138 additions and 54 deletions
+29 -9
View File
@@ -12,13 +12,16 @@
#include <znc/zncconfig.h>
#include <znc/version.h>
#define NOTHING (void)0
extern bool ZNC_NO_NEED_TO_DO_ANYTHING_ON_MODULE_CALL_EXITER;
#define NOTHING &ZNC_NO_NEED_TO_DO_ANYTHING_ON_MODULE_CALL_EXITER
#define ALLMODULECALL(macFUNC, macEXITER) \
do { \
*macEXITER = false; \
CModules& GMods = CZNC::Get().GetModules(); \
bool bAllExit = false; \
if (GMods.macFUNC) { \
macEXITER; \
bAllExit = true; \
} else { \
const map<CString, CUser*>& mUsers = \
CZNC::Get().GetUserMap(); \
@@ -26,7 +29,8 @@
for (it = mUsers.begin(); it != mUsers.end(); ++it) { \
CModules& UMods = it->second->GetModules(); \
if (UMods.macFUNC) { \
macEXITER; \
bAllExit = true; \
break; \
} \
const vector<CIRCNetwork*>& mNets = \
it->second->GetNetworks(); \
@@ -34,15 +38,19 @@
for (it2 = mNets.begin(); it2 != mNets.end(); ++it2) { \
CModules& NMods = (*it2)->GetModules(); \
if (NMods.macFUNC) { \
macEXITER; \
bAllExit = true; \
break; \
} \
} \
if (bAllExit) break; \
} \
} \
*macEXITER = bAllExit; \
} while (false)
#define _GLOBALMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER) \
do { \
*macEXITER = false; \
CModules& GMods = CZNC::Get().GetModules(); \
CUser* pOldGUser = GMods.GetUser(); \
CIRCNetwork* pOldGNetwork = GMods.GetNetwork(); \
@@ -54,7 +62,7 @@
GMods.SetUser(pOldGUser); \
GMods.SetNetwork(pOldGNetwork); \
GMods.SetClient(pOldGClient); \
macEXITER; \
*macEXITER = true; \
} \
GMods.SetUser(pOldGUser); \
GMods.SetClient(pOldGClient); \
@@ -63,7 +71,13 @@
#define _USERMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER) \
do { \
assert(macUSER != NULL); \
_GLOBALMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER); \
*macEXITER = false; \
bool bGlobalExited = false; \
_GLOBALMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, &bGlobalExited); \
if (bGlobalExited) { \
*macEXITER = true; \
break; \
} \
CModules& UMods = macUSER->GetModules(); \
CIRCNetwork* pOldUNetwork = UMods.GetNetwork(); \
CClient* pOldUClient = UMods.GetClient(); \
@@ -72,7 +86,7 @@
if (UMods.macFUNC) { \
UMods.SetNetwork(pOldUNetwork); \
UMods.SetClient(pOldUClient); \
macEXITER; \
*macEXITER = true; \
} \
UMods.SetNetwork(pOldUNetwork); \
UMods.SetClient(pOldUClient); \
@@ -81,14 +95,20 @@
#define NETWORKMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER) \
do { \
assert(macUSER != NULL); \
_USERMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, macEXITER); \
*macEXITER = false; \
bool bUserExited = false; \
_USERMODULECALL(macFUNC, macUSER, macNETWORK, macCLIENT, &bUserExited); \
if (bUserExited) { \
*macEXITER = true; \
break; \
} \
if (macNETWORK != NULL) { \
CModules& NMods = macNETWORK->GetModules(); \
CClient* pOldNClient = NMods.GetClient(); \
NMods.SetClient(macCLIENT); \
if (NMods.macFUNC) { \
NMods.SetClient(pOldNClient); \
macEXITER; \
*macEXITER = true; \
} \
NMods.SetClient(pOldNClient); \
} \
+5 -3
View File
@@ -545,7 +545,7 @@ void CChan::SendBuffer(CClient* pClient) {
CClient * pUseClient = (pClient ? pClient : vClients[uClient]);
bool bSkipStatusMsg = pUseClient->HasServerTime();
NETWORKMODULECALL(OnChanBufferStarting(*this, *pUseClient), m_pNetwork->GetUser(), m_pNetwork, NULL, bSkipStatusMsg = true);
NETWORKMODULECALL(OnChanBufferStarting(*this, *pUseClient), m_pNetwork->GetUser(), m_pNetwork, NULL, &bSkipStatusMsg);
if (!bSkipStatusMsg) {
m_pNetwork->PutUser(":***!znc@znc.in PRIVMSG " + GetName() + " :Buffer Playback...", pUseClient);
@@ -554,12 +554,14 @@ void CChan::SendBuffer(CClient* pClient) {
unsigned int uSize = m_Buffer.Size();
for (unsigned int uIdx = 0; uIdx < uSize; uIdx++) {
CString sLine = m_Buffer.GetLine(uIdx, *pUseClient);
NETWORKMODULECALL(OnChanBufferPlayLine(*this, *pUseClient, sLine), m_pNetwork->GetUser(), m_pNetwork, NULL, continue);
bool bNotShowThisLine = false;
NETWORKMODULECALL(OnChanBufferPlayLine(*this, *pUseClient, sLine), m_pNetwork->GetUser(), m_pNetwork, NULL, &bNotShowThisLine);
if (bNotShowThisLine) continue;
m_pNetwork->PutUser(sLine, pUseClient);
}
bSkipStatusMsg = pUseClient->HasServerTime();
NETWORKMODULECALL(OnChanBufferEnding(*this, *pUseClient), m_pNetwork->GetUser(), m_pNetwork, NULL, bSkipStatusMsg = true);
NETWORKMODULECALL(OnChanBufferEnding(*this, *pUseClient), m_pNetwork->GetUser(), m_pNetwork, NULL, &bSkipStatusMsg);
if (!bSkipStatusMsg) {
m_pNetwork->PutUser(":***!znc@znc.in PRIVMSG " + GetName() + " :Playback Complete.", pUseClient);
}
+26 -13
View File
@@ -90,11 +90,13 @@ void CClient::ReadLine(const CString& sData) {
sLine = sLine.Token(1, true);
}
bool bReturn = false;
if (IsAttached()) {
NETWORKMODULECALL(OnUserRaw(sLine), m_pUser, m_pNetwork, this, return);
NETWORKMODULECALL(OnUserRaw(sLine), m_pUser, m_pNetwork, this, &bReturn);
} else {
GLOBALMODULECALL(OnUnknownUserRaw(this, sLine), return);
GLOBALMODULECALL(OnUnknownUserRaw(this, sLine), &bReturn);
}
if (bReturn) return;
CString sCommand = sLine.Token(0);
if (sCommand.Left(1) == ":") {
@@ -232,11 +234,13 @@ void CClient::ReadLine(const CString& sData) {
sCTCP.LeftChomp();
sCTCP.RightChomp();
NETWORKMODULECALL(OnUserCTCPReply(sTarget, sCTCP), m_pUser, m_pNetwork, this, return);
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, return);
NETWORKMODULECALL(OnUserNotice(sTarget, sMsg), m_pUser, m_pNetwork, this, &bReturn);
if (bReturn) return;
}
if (!GetIRCSock()) {
@@ -293,7 +297,8 @@ void CClient::ReadLine(const CString& sData) {
if (sCTCP.Token(0).Equals("ACTION")) {
CString sMessage = sCTCP.Token(1, true);
NETWORKMODULECALL(OnUserAction(sTarget, sMessage), m_pUser, m_pNetwork, this, return);
NETWORKMODULECALL(OnUserAction(sTarget, sMessage), m_pUser, m_pNetwork, this, &bReturn);
if (bReturn) return;
sCTCP = "ACTION " + sMessage;
if (pChan && (!pChan->AutoClearChanBuffer() || !m_pNetwork->IsUserOnline())) {
@@ -313,7 +318,8 @@ void CClient::ReadLine(const CString& sData) {
}
}
} else {
NETWORKMODULECALL(OnUserCTCP(sTarget, sCTCP), m_pUser, m_pNetwork, this, return);
NETWORKMODULECALL(OnUserCTCP(sTarget, sCTCP), m_pUser, m_pNetwork, this, &bReturn);
if (bReturn) return;
}
PutIRC("PRIVMSG " + sTarget + " :\001" + sCTCP + "\001");
@@ -331,7 +337,8 @@ void CClient::ReadLine(const CString& sData) {
return;
}
NETWORKMODULECALL(OnUserMsg(sTarget, sMsg), m_pUser, m_pNetwork, this, 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.
@@ -398,7 +405,9 @@ void CClient::ReadLine(const CString& sData) {
for (unsigned int a = 0; a < vChans.size(); a++) {
CString sChannel = vChans[a];
NETWORKMODULECALL(OnUserJoin(sChannel, sKey), m_pUser, m_pNetwork, this, continue);
bool bContinue = false;
NETWORKMODULECALL(OnUserJoin(sChannel, sKey), m_pUser, m_pNetwork, this, &bContinue);
if (bContinue) continue;
CChan* pChan = m_pNetwork->FindChan(sChannel);
if (pChan) {
@@ -430,7 +439,9 @@ void CClient::ReadLine(const CString& sData) {
for (VCString::const_iterator it = vChans.begin(); it != vChans.end(); ++it) {
CString sChan = *it;
NETWORKMODULECALL(OnUserPart(sChan, sMessage), m_pUser, m_pNetwork, this, continue);
bool bContinue = false;
NETWORKMODULECALL(OnUserPart(sChan, sMessage), m_pUser, m_pNetwork, this, &bContinue);
if (bContinue) continue;
CChan* pChan = m_pNetwork->FindChan(sChan);
@@ -456,10 +467,12 @@ void CClient::ReadLine(const CString& sData) {
CString sTopic = sLine.Token(2, true).TrimPrefix_n();
if (!sTopic.empty()) {
NETWORKMODULECALL(OnUserTopic(sChan, sTopic), m_pUser, m_pNetwork, this, return);
NETWORKMODULECALL(OnUserTopic(sChan, sTopic), m_pUser, m_pNetwork, this, &bReturn);
if (bReturn) return;
sLine = "TOPIC " + sChan + " :" + sTopic;
} else {
NETWORKMODULECALL(OnUserTopicRequest(sChan), m_pUser, m_pNetwork, this, return);
NETWORKMODULECALL(OnUserTopicRequest(sChan), m_pUser, m_pNetwork, this, &bReturn);
if (bReturn) return;
}
} else if (sCommand.Equals("MODE")) {
CString sTarget = sLine.Token(1);
@@ -838,7 +851,7 @@ void CClient::HandleCap(const CString& sLine)
bVal = false;
bool bAccepted = ("multi-prefix" == sCap) || ("userhost-in-names" == sCap) || ("server-time" == sCap);
GLOBALMODULECALL(IsClientCapSupported(this, sCap, bVal), bAccepted = true);
GLOBALMODULECALL(IsClientCapSupported(this, sCap, bVal), &bAccepted);
if (!bAccepted) {
// Some unsupported capability is requested
@@ -880,7 +893,7 @@ 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(this, *i, false), bRemoving = true);
GLOBALMODULECALL(IsClientCapSupported(this, *i, false), &bRemoving);
if (bRemoving) {
GLOBALMODULECALL(OnClientCapRequest(this, *i, false), NOTHING);
ssRemoved.insert(*i);
+3 -1
View File
@@ -29,7 +29,9 @@ void CClient::UserCommand(CString& sLine) {
return;
}
NETWORKMODULECALL(OnStatusCommand(sLine), m_pUser, m_pNetwork, this, return);
bool bReturn = false;
NETWORKMODULECALL(OnStatusCommand(sLine), m_pUser, m_pNetwork, this, &bReturn);
if (bReturn) return;
const CString sCommand = sLine.Token(0);
+10 -4
View File
@@ -503,7 +503,9 @@ void CIRCNetwork::ClientConnected(CClient *pClient) {
uSize = m_QueryBuffer.Size();
for (uIdx = 0; uIdx < uSize; uIdx++) {
CString sLine = m_QueryBuffer.GetLine(uIdx, *pClient, msParams);
NETWORKMODULECALL(OnPrivBufferPlayLine(*pClient, sLine), m_pUser, this, NULL, continue);
bool bContinue = false;
NETWORKMODULECALL(OnPrivBufferPlayLine(*pClient, sLine), m_pUser, this, NULL, &bContinue);
if (bContinue) continue;
pClient->PutClient(sLine);
}
m_QueryBuffer.Clear();
@@ -706,7 +708,9 @@ bool CIRCNetwork::JoinChan(CChan* pChan) {
pChan->Disable();
} else {
pChan->IncJoinTries();
NETWORKMODULECALL(OnTimerAutoJoin(*pChan), m_pUser, this, NULL, return false);
bool bFailed = false;
NETWORKMODULECALL(OnTimerAutoJoin(*pChan), m_pUser, this, NULL, &bFailed);
if (bFailed) return false;
return true;
}
return false;
@@ -948,13 +952,15 @@ bool CIRCNetwork::Connect() {
DEBUG("Connecting user/network [" << m_pUser->GetUserName() << "/" << m_sName << "]");
NETWORKMODULECALL(OnIRCConnecting(pIRCSock), m_pUser, this, NULL,
bool bAbort = false;
NETWORKMODULECALL(OnIRCConnecting(pIRCSock), m_pUser, this, NULL, &bAbort);
if (bAbort) {
DEBUG("Some module aborted the connection attempt");
PutStatus("Some module aborted the connection attempt");
delete pIRCSock;
CZNC::Get().AddNetworkToQueue(this);
return false;
);
}
CString sSockName = "IRC::" + m_pUser->GetUserName() + "::" + m_sName;
CZNC::Get().GetManager().Connect(pServer->GetName(), pServer->GetPort(), sSockName, 120, bSSL, GetBindHost(), pIRCSock);
+40 -16
View File
@@ -128,7 +128,9 @@ void CIRCSock::ReadLine(const CString& sData) {
DEBUG("(" << m_pNetwork->GetUser()->GetUserName() << "/" << m_pNetwork->GetName() << ") IRC -> ZNC [" << sLine << "]");
IRCSOCKMODULECALL(OnRaw(sLine), return);
bool bReturn = false;
IRCSOCKMODULECALL(OnRaw(sLine), &bReturn);
if (bReturn) return;
if (sLine.Equals("PING ", false, 5)) {
// Generate a reply and don't forward this to any user,
@@ -682,7 +684,8 @@ void CIRCSock::ReadLine(const CString& sData) {
CString sTopic = sLine.Token(3, true);
sTopic.LeftChomp();
IRCSOCKMODULECALL(OnTopic(Nick, *pChan, sTopic), return);
IRCSOCKMODULECALL(OnTopic(Nick, *pChan, sTopic), &bReturn);
if (bReturn) return;
pChan->SetTopicOwner(Nick.GetNick());
pChan->SetTopicDate((unsigned long) time(NULL));
@@ -793,7 +796,8 @@ void CIRCSock::ReadLine(const CString& sData) {
// Don't forward any CAP stuff to the client
return;
} else if (sCmd.Equals("INVITE")) {
IRCSOCKMODULECALL(OnInvite(Nick, sLine.Token(3).TrimPrefix_n(":")), return);
IRCSOCKMODULECALL(OnInvite(Nick, sLine.Token(3).TrimPrefix_n(":")), &bReturn);
if (bReturn) return;
}
}
@@ -823,21 +827,27 @@ void CIRCSock::ResumeCap() {
}
bool CIRCSock::OnServerCapAvailable(const CString& sCap) {
IRCSOCKMODULECALL(OnServerCapAvailable(sCap), return true);
return false;
bool bResult = false;
IRCSOCKMODULECALL(OnServerCapAvailable(sCap), &bResult);
return bResult;
}
bool CIRCSock::OnCTCPReply(CNick& Nick, CString& sMessage) {
IRCSOCKMODULECALL(OnCTCPReply(Nick, sMessage), return true);
bool bResult = false;
IRCSOCKMODULECALL(OnCTCPReply(Nick, sMessage), &bResult);
return false;
return bResult;
}
bool CIRCSock::OnPrivCTCP(CNick& Nick, CString& sMessage) {
IRCSOCKMODULECALL(OnPrivCTCP(Nick, sMessage), return true);
bool bResult = false;
IRCSOCKMODULECALL(OnPrivCTCP(Nick, sMessage), &bResult);
if (bResult) return true;
if (sMessage.TrimPrefix("ACTION ")) {
IRCSOCKMODULECALL(OnPrivAction(Nick, sMessage), return true);
bResult = false;
IRCSOCKMODULECALL(OnPrivAction(Nick, sMessage), &bResult);
if (bResult) return true;
if (!m_pNetwork->IsUserOnline()) {
// If the user is detached, add to the buffer
@@ -896,7 +906,9 @@ bool CIRCSock::OnGeneralCTCP(CNick& Nick, CString& sMessage) {
}
bool CIRCSock::OnPrivNotice(CNick& Nick, CString& sMessage) {
IRCSOCKMODULECALL(OnPrivNotice(Nick, sMessage), return true);
bool bResult = false;
IRCSOCKMODULECALL(OnPrivNotice(Nick, sMessage), &bResult);
if (bResult) return true;
if (!m_pNetwork->IsUserOnline()) {
// If the user is detached, add to the buffer
@@ -907,7 +919,9 @@ bool CIRCSock::OnPrivNotice(CNick& Nick, CString& sMessage) {
}
bool CIRCSock::OnPrivMsg(CNick& Nick, CString& sMessage) {
IRCSOCKMODULECALL(OnPrivMsg(Nick, sMessage), return true);
bool bResult = false;
IRCSOCKMODULECALL(OnPrivMsg(Nick, sMessage), &bResult);
if (bResult) return true;
if (!m_pNetwork->IsUserOnline()) {
// If the user is detached, add to the buffer
@@ -920,11 +934,15 @@ 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) {
IRCSOCKMODULECALL(OnChanCTCP(Nick, *pChan, sMessage), return true);
bool bResult = false;
IRCSOCKMODULECALL(OnChanCTCP(Nick, *pChan, sMessage), &bResult);
if (bResult) return true;
// Record a /me
if (sMessage.TrimPrefix("ACTION ")) {
IRCSOCKMODULECALL(OnChanAction(Nick, *pChan, sMessage), return true);
bResult = false;
IRCSOCKMODULECALL(OnChanAction(Nick, *pChan, sMessage), &bResult);
if (bResult) return true;
if (!pChan->AutoClearChanBuffer() || !m_pNetwork->IsUserOnline() || pChan->IsDetached()) {
pChan->AddBuffer(":" + _NAMEDFMT(Nick.GetNickMask()) + " PRIVMSG " + _NAMEDFMT(sChan) + " :\001ACTION {text}\001", sMessage);
}
@@ -941,7 +959,9 @@ 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) {
IRCSOCKMODULECALL(OnChanNotice(Nick, *pChan, sMessage), return true);
bool bResult = false;
IRCSOCKMODULECALL(OnChanNotice(Nick, *pChan, sMessage), &bResult);
if (bResult) return true;
if (!pChan->AutoClearChanBuffer() || !m_pNetwork->IsUserOnline() || pChan->IsDetached()) {
pChan->AddBuffer(":" + _NAMEDFMT(Nick.GetNickMask()) + " NOTICE " + _NAMEDFMT(sChan) + " :{text}", sMessage);
@@ -954,7 +974,9 @@ 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) {
IRCSOCKMODULECALL(OnChanMsg(Nick, *pChan, sMessage), return true);
bool bResult = false;
IRCSOCKMODULECALL(OnChanMsg(Nick, *pChan, sMessage), &bResult);
if (bResult) return true;
if (!pChan->AutoClearChanBuffer() || !m_pNetwork->IsUserOnline() || pChan->IsDetached()) {
pChan->AddBuffer(":" + _NAMEDFMT(Nick.GetNickMask()) + " PRIVMSG " + _NAMEDFMT(sChan) + " :{text}", sMessage);
@@ -998,7 +1020,9 @@ void CIRCSock::Connected() {
CString sIdent = m_pNetwork->GetIdent();
CString sRealName = m_pNetwork->GetRealName();
IRCSOCKMODULECALL(OnIRCRegistration(sPass, sNick, sIdent, sRealName), return);
bool bReturn = false;
IRCSOCKMODULECALL(OnIRCRegistration(sPass, sNick, sIdent, sRealName), &bReturn);
if (bReturn) return;
PutIRC("CAP LS");
+9 -3
View File
@@ -868,7 +868,9 @@ bool CModules::LoadModule(const CString& sModule, const CString& sArgs, CModInfo
}
bool bSuccess;
_GLOBALMODULECALL(OnModuleLoading(sModule, sArgs, eType, bSuccess, sRetMsg), pUser, pNetwork, NULL, return bSuccess);
bool bHandled = false;
_GLOBALMODULECALL(OnModuleLoading(sModule, sArgs, eType, bSuccess, sRetMsg), pUser, pNetwork, NULL, &bHandled);
if (bHandled) return bSuccess;
CString sModPath, sDataPath;
bool bVersionMismatch;
@@ -956,7 +958,9 @@ bool CModules::UnloadModule(const CString& sModule, CString& sRetMsg) {
}
bool bSuccess;
_GLOBALMODULECALL(OnModuleUnloading(pModule, bSuccess, sRetMsg), pModule->GetUser(), pModule->GetNetwork(), NULL, return bSuccess);
bool bHandled = false;
_GLOBALMODULECALL(OnModuleUnloading(pModule, bSuccess, sRetMsg), pModule->GetUser(), pModule->GetNetwork(), NULL, &bHandled);
if (bHandled) return bSuccess;
ModHandle p = pModule->GetDLL();
@@ -1009,7 +1013,9 @@ bool CModules::GetModInfo(CModInfo& ModInfo, const CString& sModule, CString& sR
CString sModPath, sTmp;
bool bSuccess;
GLOBALMODULECALL(OnGetModInfo(ModInfo, sModule, bSuccess, sRetMsg), return bSuccess);
bool bHandled = false;
GLOBALMODULECALL(OnGetModInfo(ModInfo, sModule, bSuccess, sRetMsg), &bHandled);
if (bHandled) return bSuccess;
if (!FindModPath(sModule, sModPath, sTmp)) {
sRetMsg = "Unable to find module [" + sModule + "]";
+2
View File
@@ -35,6 +35,8 @@ static inline int getopt_long(int argc, char * const argv[], const char *optstri
}
#endif
bool ZNC_NO_NEED_TO_DO_ANYTHING_ON_MODULE_CALL_EXITER;
static const struct option g_LongOpts[] = {
{ "help", no_argument, 0, 'h' },
{ "version", no_argument, 0, 'v' },
+14 -5
View File
@@ -130,7 +130,9 @@ CString CZNC::GetUptime() const {
}
bool CZNC::OnBoot() {
ALLMODULECALL(OnBoot(), return false);
bool bFail = false;
ALLMODULECALL(OnBoot(), &bFail);
if (bFail) return false;
return true;
}
@@ -1412,7 +1414,10 @@ void CZNC::Broadcast(const CString& sMessage, bool bAdminOnly,
if (a->second != pSkipUser) {
CString sMsg = sMessage;
USERMODULECALL(OnBroadcast(sMsg), a->second, NULL, continue);
bool bContinue = false;
USERMODULECALL(OnBroadcast(sMsg), a->second, NULL, &bContinue);
if (bContinue) continue;
a->second->PutStatusNotice("*** " + sMsg, NULL, pSkipClient);
}
}
@@ -1552,11 +1557,13 @@ bool CZNC::AddUser(CUser* pUser, CString& sErrorRet) {
<< sErrorRet << "]");
return false;
}
GLOBALMODULECALL(OnAddUser(*pUser, sErrorRet),
bool bFailed = false;
GLOBALMODULECALL(OnAddUser(*pUser, sErrorRet), &bFailed);
if (bFailed) {
DEBUG("AddUser [" << pUser->GetUserName() << "] aborted by a module ["
<< sErrorRet << "]");
return false;
);
}
m_msUsers[pUser->GetUserName()] = pUser;
return true;
}
@@ -1825,7 +1832,9 @@ CZNC::TrafficStatsMap CZNC::GetTrafficStats(TrafficStatsPair &Users,
void CZNC::AuthUser(CSmartPtr<CAuthBase> AuthClass) {
// TODO unless the auth module calls it, CUser::IsHostAllowed() is not honoured
GLOBALMODULECALL(OnLoginAttempt(AuthClass), return);
bool bReturn = false;
GLOBALMODULECALL(OnLoginAttempt(AuthClass), &bReturn);
if (bReturn) return;
CUser* pUser = FindUser(AuthClass->GetUsername());