From a3b405bd078b53612dc90fcf4b0d5d11c72297b0 Mon Sep 17 00:00:00 2001 From: psychon Date: Wed, 16 May 2007 22:42:00 +0000 Subject: [PATCH] sync from my branch rev 983 and 993: - module api change, if module fails to load it can give back an useful error message - give a message when client doesnt supply a password when connecting - some minor cleanup git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@803 726aef4b-f618-498e-8847-2d620e286838 --- Client.cpp | 3 +++ Modules.cpp | 11 +++++++---- Modules.h | 2 +- modules/autoattach.cpp | 2 +- modules/autoop.cpp | 2 +- modules/away.cpp | 2 +- modules/awaynick.cpp | 2 +- modules/chansaver.cpp | 4 ---- modules/email.cpp | 2 +- modules/imapauth.cpp | 4 ++-- modules/modperl.cpp | 4 ++-- modules/partyline.cpp | 4 ++-- modules/perform.cpp | 2 +- modules/sample.cpp | 2 +- modules/savebuff.cpp | 2 +- modules/schat.cpp | 4 ++-- modules/stickychan.cpp | 4 ++-- modules/watch.cpp | 4 ---- modules/webadmin.cpp | 5 ++--- 19 files changed, 31 insertions(+), 34 deletions(-) diff --git a/Client.cpp b/Client.cpp index 78a6c1db..3a82bd8a 100644 --- a/Client.cpp +++ b/Client.cpp @@ -83,6 +83,8 @@ void CClient::ReadLine(const CString& sData) { if ((m_bGotPass) && (m_bGotNick)) { AuthUser(); + } else if (!m_bGotPass) { + PutClient(":irc.znc.com NOTICE AUTH :*** You need to send your password. Try /quote PASS :"); } return; // Don't forward this msg. ZNC has already registered us. @@ -428,6 +430,7 @@ void CClient::ReadLine(const CString& sData) { if (sCTCP.Token(0).CaseCmp("ACTION") == 0) { CString sMessage = sCTCP.Token(1, true); MODULECALL(OnUserAction(sTarget, sMessage), m_pUser, this, return); + sCTCP = "ACTION " + sMessage; if (pChan && pChan->KeepBuffer()) { pChan->AddBuffer(":" + GetNickMask() + " PRIVMSG " + sTarget + " :\001ACTION " + m_pUser->AddTimestamp(sMessage) + "\001"); diff --git a/Modules.cpp b/Modules.cpp index 16d42a33..21aef96d 100644 --- a/Modules.cpp +++ b/Modules.cpp @@ -469,7 +469,7 @@ void CModule::ListSockets() { const CString& CModule::GetModName() const { return m_sModName; } CString CModule::GetModNick() const { return ((m_pUser) ? m_pUser->GetStatusPrefix() : "*") + m_sModName; } -bool CModule::OnLoad(const CString& sArgs) { return true; } +bool CModule::OnLoad(const CString& sArgs, CString& sErrorMsg) { sErrorMsg = ""; return true; } bool CModule::OnBoot() { return true; } void CModule::OnIRCDisconnected() {} void CModule::OnIRCConnected() {} @@ -771,9 +771,12 @@ bool CModules::LoadModule(const CString& sModule, const CString& sArgs, CUser* p pModule->SetDescription(GetDesc()); push_back(pModule); - if (!pModule->OnLoad(sArgs)) { - UnloadModule(sModule, sRetMsg); - sRetMsg = "Module [" + sModule + "] aborted."; + if (!pModule->OnLoad(sArgs, sRetMsg)) { + UnloadModule(sModule, sModPath); + if (!sRetMsg.empty()) + sRetMsg = "Module [" + sModule + "] aborted: " + sRetMsg; + else + sRetMsg = "Module [" + sModule + "] aborted."; return false; } diff --git a/Modules.h b/Modules.h index c36f581e..4eb0f07f 100644 --- a/Modules.h +++ b/Modules.h @@ -200,7 +200,7 @@ public: void SetClient(CClient* pClient); void Unload(); - virtual bool OnLoad(const CString& sArgs); + virtual bool OnLoad(const CString& sArgsi, CString& sErrorMsg); virtual bool OnBoot(); virtual void OnIRCDisconnected(); virtual void OnIRCConnected(); diff --git a/modules/autoattach.cpp b/modules/autoattach.cpp index d2247960..05215bee 100644 --- a/modules/autoattach.cpp +++ b/modules/autoattach.cpp @@ -13,7 +13,7 @@ public: virtual ~CChanAttach() { } - virtual bool OnLoad(const CString& sArgs) { + virtual bool OnLoad(const CString& sArgs, CString& sErrorMsg) { unsigned int a = 0; CString sChan = sArgs.Token(a++); diff --git a/modules/autoop.cpp b/modules/autoop.cpp index 64aed048..267e2960 100644 --- a/modules/autoop.cpp +++ b/modules/autoop.cpp @@ -126,7 +126,7 @@ class CAutoOpMod : public CModule { public: MODCONSTRUCTOR(CAutoOpMod) {} - virtual bool OnLoad(const CString& sArgs) { + virtual bool OnLoad(const CString& sArgs, CString& sErrorMsg) { AddTimer(new CAutoOpTimer(this)); // Load the users diff --git a/modules/away.cpp b/modules/away.cpp index 60b58e17..21aefe37 100644 --- a/modules/away.cpp +++ b/modules/away.cpp @@ -127,7 +127,7 @@ public: SaveBufferToDisk(); } - virtual bool OnLoad(const CString& sArgs) + virtual bool OnLoad(const CString& sArgs, CString& sErrorMsg) { CString sMyArgs = sArgs; if (sMyArgs.Token(0) == "-notimer") diff --git a/modules/awaynick.cpp b/modules/awaynick.cpp index c7c8ca99..c0a11e93 100644 --- a/modules/awaynick.cpp +++ b/modules/awaynick.cpp @@ -45,7 +45,7 @@ class CAwayNickMod : public CModule { public: MODCONSTRUCTOR(CAwayNickMod) {} - virtual bool OnLoad(const CString& sArgs) { + virtual bool OnLoad(const CString& sArgs, CString& sErrorMsg) { m_sFormat = sArgs; if (m_sFormat.empty()) { diff --git a/modules/chansaver.cpp b/modules/chansaver.cpp index b8bfb4a9..23c961cd 100644 --- a/modules/chansaver.cpp +++ b/modules/chansaver.cpp @@ -13,10 +13,6 @@ public: m_bWriteConf = false; } - virtual bool OnLoad(const CString& sArgs) { - return true; - } - virtual ~CChanSaverMod() { } diff --git a/modules/email.cpp b/modules/email.cpp index 0dcf0588..d9fa401f 100644 --- a/modules/email.cpp +++ b/modules/email.cpp @@ -93,7 +93,7 @@ public: m_pManager->DelSockByAddr( vSocks[a] ); } - virtual bool OnLoad(const CString & sArgs) { + virtual bool OnLoad(const CString & sArgs, CString& sErrorMsg) { m_sMailPath = sArgs; StartParser(); diff --git a/modules/imapauth.cpp b/modules/imapauth.cpp index 0dde967f..c6422342 100644 --- a/modules/imapauth.cpp +++ b/modules/imapauth.cpp @@ -55,7 +55,7 @@ public: return true; } - virtual bool OnLoad(const CString& sArgs) { + virtual bool OnLoad(const CString& sArgs, CString& sErrorMsg) { if (sArgs.Trim_n().empty()) { return true; // use defaults } @@ -152,4 +152,4 @@ void CIMAPSock::ReadLine(const CString& sLine) { } } -GLOBALMODULEDEFS(CIMAPAuthMod, "Allow users to authenticate via imap"); +GLOBALMODULEDEFS(CIMAPAuthMod, "Allow users to authenticate via imap") diff --git a/modules/modperl.cpp b/modules/modperl.cpp index c23459f7..ea37354f 100644 --- a/modules/modperl.cpp +++ b/modules/modperl.cpp @@ -287,7 +287,7 @@ public: } void UnSetUser() { m_pUser = NULL; } - virtual bool OnLoad( const CString & sArgs ); + virtual bool OnLoad( const CString & sArgs, CString & sErrorMsg ); virtual void OnUserAttached() { CBNone( "OnUserAttached" ); } virtual void OnUserDetached() { CBNone( "OnUserDetached" ); } virtual void OnIRCDisconnected() { CBNone( "OnIRCDisconnected" ); } @@ -968,7 +968,7 @@ CModPerl::EModRet CModPerl::CallBack( const PString & sHookName, const VPString // special case this, required for perl modules that are dynamic EXTERN_C void boot_DynaLoader (pTHX_ CV* cv); -bool CModPerl::OnLoad( const CString & sArgs ) +bool CModPerl::OnLoad( const CString & sArgs, CString & sErrorMsg ) { m_pPerl = perl_alloc(); perl_construct( m_pPerl ); diff --git a/modules/partyline.cpp b/modules/partyline.cpp index 0ffae279..3509284b 100644 --- a/modules/partyline.cpp +++ b/modules/partyline.cpp @@ -51,7 +51,7 @@ public: return true; } - virtual bool OnLoad(const CString& sArgs) { + virtual bool OnLoad(const CString& sArgs, CString& sErrorMsg) { const map& msUsers = CZNC::Get().GetUserMap(); for (map::const_iterator it = msUsers.begin(); it != msUsers.end(); it++) { @@ -587,4 +587,4 @@ private: set m_ssDefaultChans; }; -GLOBALMODULEDEFS(CPartylineMod, "Internal channels and queries for users connected to znc"); +GLOBALMODULEDEFS(CPartylineMod, "Internal channels and queries for users connected to znc") diff --git a/modules/perform.cpp b/modules/perform.cpp index 40f349b1..ea2d18f7 100644 --- a/modules/perform.cpp +++ b/modules/perform.cpp @@ -19,7 +19,7 @@ public: { } - virtual bool OnLoad(const CString& sArgs) + virtual bool OnLoad(const CString& sArgs, CString& sErrorMsg) { GetNV("Perform").Split("\n", m_vPerform, false); diff --git a/modules/sample.cpp b/modules/sample.cpp index e3a56201..486b73d3 100644 --- a/modules/sample.cpp +++ b/modules/sample.cpp @@ -23,7 +23,7 @@ class CSampleMod : public CModule { public: MODCONSTRUCTOR(CSampleMod) {} - virtual bool OnLoad(const CString& sArgs) { + virtual bool OnLoad(const CString& sArgs, CString& sErrorMsg) { PutModule("I'm being loaded with the arguments: [" + sArgs + "]"); //AddTimer(new CSampleTimer(this, 300, 0, "Sample", "Sample timer for sample things.")); //AddTimer(new CSampleTimer(this, 5, 20, "Another", "Another sample timer.")); diff --git a/modules/savebuff.cpp b/modules/savebuff.cpp index e4d33889..df3cf35e 100644 --- a/modules/savebuff.cpp +++ b/modules/savebuff.cpp @@ -154,7 +154,7 @@ public: } } - virtual bool OnLoad(const CString& sArgs) + virtual bool OnLoad(const CString& sArgs, CString& sErrorMsg) { if (!sArgs.empty()) { diff --git a/modules/schat.cpp b/modules/schat.cpp index 9123eb16..191a257a 100644 --- a/modules/schat.cpp +++ b/modules/schat.cpp @@ -201,7 +201,7 @@ public: MODCONSTRUCTOR(CSChat) {} virtual ~CSChat() { CleanSocks(); } - virtual bool OnLoad( const CString & sArgs ) + virtual bool OnLoad( const CString & sArgs, CString & sErrorMsg ) { m_sPemFile = sArgs; @@ -211,7 +211,7 @@ public: } if (!CFile::Exists(m_sPemFile)) { - PutModule("Unable to load pem file [" + m_sPemFile + "]"); + sErrorMsg = "Unable to load pem file [" + m_sPemFile + "]"; return false; } diff --git a/modules/stickychan.cpp b/modules/stickychan.cpp index 7673bf3a..61dc0825 100644 --- a/modules/stickychan.cpp +++ b/modules/stickychan.cpp @@ -18,7 +18,7 @@ public: { } - virtual bool OnLoad( const CString& sArgs ); + virtual bool OnLoad( const CString& sArgs, CString& sErrorMsg ); virtual EModRet OnUserPart( CString& sChannel, CString& sMessage ) { @@ -88,7 +88,7 @@ static void RunTimer( CModule * pModule, CFPTimer *pTimer ) ((CStickyChan *)pModule)->RunJob(); } -bool CStickyChan::OnLoad(const CString& sArgs) +bool CStickyChan::OnLoad(const CString& sArgs, CString& sErrorMsg) { AddTimer( RunTimer, "StickyChanTimer", 15 ); return( true ); diff --git a/modules/watch.cpp b/modules/watch.cpp index 5e137880..a550b0e8 100644 --- a/modules/watch.cpp +++ b/modules/watch.cpp @@ -155,10 +155,6 @@ public: m_Buffer.SetLineCount(500); } - virtual bool OnLoad(const CString& sArgs) { - return true; - } - virtual ~CWatcherMod() { } diff --git a/modules/webadmin.cpp b/modules/webadmin.cpp index 044cc580..400b733e 100644 --- a/modules/webadmin.cpp +++ b/modules/webadmin.cpp @@ -115,7 +115,7 @@ public: return true; } - virtual bool OnLoad(const CString& sArgStr) { + virtual bool OnLoad(const CString& sArgStr, CString& sErrorMsg) { bool bSSL = false; bool bIPv6 = false; CString sArgs(sArgStr); @@ -165,8 +165,7 @@ public: bool b = m_pManager->ListenHost(m_uPort, "WebAdmin::Listener", m_sListenHost, bSSL, SOMAXCONN, pListenSock, 0, bIPv6); if (!b) { - printf("\n"); // dont mix it up with the 'loading module' message - CUtils::PrintMessage("Error: " + CString(strerror(errno)), true); + sErrorMsg = "Could not bind to port " + CString(m_uPort) + ": " + CString(strerror(errno)); } return b; }