From: <ps...@us...> - 2008-07-17 12:02:23
|
Revision: 1137 http://znc.svn.sourceforge.net/znc/?rev=1137&view=rev Author: psychon Date: 2008-07-17 12:01:44 +0000 (Thu, 17 Jul 2008) Log Message: ----------- Don't throw any exceptions in CModules::LoadModule() on version mismatch This also removes all the code catching those exceptions. There was nothing which justified these exceptions and removing them doesn't hurt. ByeBye CException::EX_BadModVersion Modified Paths: -------------- trunk/Client.cpp trunk/Modules.cpp trunk/User.cpp trunk/Utils.h trunk/modules/webadmin.cpp trunk/znc.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2008-07-17 10:30:32 UTC (rev 1136) +++ trunk/Client.cpp 2008-07-17 12:01:44 UTC (rev 1137) @@ -1313,14 +1313,14 @@ } CString sModRet; + bool b; - try { - if (bGlobal) { - CZNC::Get().GetModules().LoadModule(sMod, sArgs, NULL, sModRet); - } else { - m_pUser->GetModules().LoadModule(sMod, sArgs, m_pUser, sModRet); - } - } catch (CException e) { + if (bGlobal) { + b = CZNC::Get().GetModules().LoadModule(sMod, sArgs, NULL, sModRet); + } else { + b = m_pUser->GetModules().LoadModule(sMod, sArgs, m_pUser, sModRet); + } + if (!b) { PutStatus("Unable to load module [" + sMod + "] [" + sModRet + "]"); return; } Modified: trunk/Modules.cpp =================================================================== --- trunk/Modules.cpp 2008-07-17 10:30:32 UTC (rev 1136) +++ trunk/Modules.cpp 2008-07-17 12:01:44 UTC (rev 1137) @@ -734,7 +734,6 @@ if (CModule::GetCoreVersion() != Version()) { dlclose(p); sRetMsg = "Version mismatch, recompile this module."; - throw CException(CException::EX_BadModVersion); return false; } @@ -886,11 +885,7 @@ return false; } - try { - if (!LoadModule(sMod, sArgs, pUser, sRetMsg)) { - return false; - } - } catch(...) { + if (!LoadModule(sMod, sArgs, pUser, sRetMsg)) { return false; } Modified: trunk/User.cpp =================================================================== --- trunk/User.cpp 2008-07-17 10:30:32 UTC (rev 1136) +++ trunk/User.cpp 2008-07-17 12:01:44 UTC (rev 1137) @@ -330,13 +330,9 @@ CModule* pCurMod = vCurMods.FindModule(pNewMod->GetModName()); if (!pCurMod) { - try { - vCurMods.LoadModule(pNewMod->GetModName(), pNewMod->GetArgs(), this, sModRet); - } catch (...) {} + vCurMods.LoadModule(pNewMod->GetModName(), pNewMod->GetArgs(), this, sModRet); } else if (pNewMod->GetArgs() != pCurMod->GetArgs()) { - try { - vCurMods.ReloadModule(pNewMod->GetModName(), pNewMod->GetArgs(), this, sModRet); - } catch (...) {} + vCurMods.ReloadModule(pNewMod->GetModName(), pNewMod->GetArgs(), this, sModRet); } } Modified: trunk/Utils.h =================================================================== --- trunk/Utils.h 2008-07-17 10:30:32 UTC (rev 1136) +++ trunk/Utils.h 2008-07-17 12:01:44 UTC (rev 1137) @@ -182,8 +182,7 @@ class CException { public: typedef enum { - EX_Shutdown, - EX_BadModVersion + EX_Shutdown } EType; CException(EType e) { Modified: trunk/modules/webadmin.cpp =================================================================== --- trunk/modules/webadmin.cpp 2008-07-17 10:30:32 UTC (rev 1136) +++ trunk/modules/webadmin.cpp 2008-07-17 12:01:44 UTC (rev 1137) @@ -619,16 +619,12 @@ if (!sModName.empty()) { CString sArgs = GetParam("modargs_" + sModName); - try { - if (!CZNC::Get().GetModules().FindModule(sModName)) { - if (!CZNC::Get().GetModules().LoadModule(sModName, sArgs, NULL, sModRet)) { - DEBUG_ONLY(cerr << "Unable to load module [" << sModName << "] [" << sModRet << "]" << endl); - } - } else { - DEBUG_ONLY(cerr << "Unable to load module [" << sModName << "] because it is already loaded" << endl); + if (!CZNC::Get().GetModules().FindModule(sModName)) { + if (!CZNC::Get().GetModules().LoadModule(sModName, sArgs, NULL, sModRet)) { + DEBUG_ONLY(cerr << "Unable to load module [" << sModName << "] [" << sModRet << "]" << endl); } - } catch(...) { - DEBUG_ONLY(cerr << "Unable to load module [" << sModName << "] [" << sArgs << "]" << endl); + } else { + DEBUG_ONLY(cerr << "Unable to load module [" << sModName << "] because it is already loaded" << endl); } } } Modified: trunk/znc.cpp =================================================================== --- trunk/znc.cpp 2008-07-17 10:30:32 UTC (rev 1136) +++ trunk/znc.cpp 2008-07-17 12:01:44 UTC (rev 1137) @@ -1295,22 +1295,16 @@ CString sModRet; CString sArgs = sValue.Token(1, true); - try { - bool bModRet = pUser->GetModules().LoadModule(sModName, sArgs, pUser, sModRet); + bool bModRet = pUser->GetModules().LoadModule(sModName, sArgs, pUser, sModRet); - // If the module was loaded, sModRet contains - // "Loaded Module [name] ..." and we strip away this beginning. - if (bModRet) - sModRet = sModRet.Token(1, true, sModName + "] "); + // If the module was loaded, sModRet contains + // "Loaded Module [name] ..." and we strip away this beginning. + if (bModRet) + sModRet = sModRet.Token(1, true, sModName + "] "); - CUtils::PrintStatus(bModRet, sModRet); - if (!bModRet) { - sError = sModRet; - return false; - } - } catch (CException e) { - sError = "Caught exception while loading [" + sModName + "]"; - CUtils::PrintStatus(false, sModRet); + CUtils::PrintStatus(bModRet, sModRet); + if (!bModRet) { + sError = sModRet; return false; } #else @@ -1486,43 +1480,31 @@ if (!pOldMod) { CUtils::PrintAction("Loading Global Module [" + sModName + "]"); - try { - bool bModRet = GetModules().LoadModule(sModName, sArgs, NULL, sModRet); + bool bModRet = GetModules().LoadModule(sModName, sArgs, NULL, sModRet); - // If the module was loaded, sModRet contains - // "Loaded Module [name] ..." and we strip away this beginning. - if (bModRet) - sModRet = sModRet.Token(1, true, sModName + "] "); + // If the module was loaded, sModRet contains + // "Loaded Module [name] ..." and we strip away this beginning. + if (bModRet) + sModRet = sModRet.Token(1, true, sModName + "] "); - CUtils::PrintStatus(bModRet, sModRet); - if (!bModRet) { - sError = sModRet; - return false; - } - } catch (CException e) { - sError = "Caught an exception while loading [" + sModName + "]"; - CUtils::PrintStatus(false, sModRet); + CUtils::PrintStatus(bModRet, sModRet); + if (!bModRet) { + sError = sModRet; return false; } } else if (pOldMod->GetArgs() != sArgs) { CUtils::PrintAction("Reloading Global Module [" + sModName + "]"); - try { - bool bModRet = GetModules().ReloadModule(sModName, sArgs, NULL, sModRet); + bool bModRet = GetModules().ReloadModule(sModName, sArgs, NULL, sModRet); - // If the module was loaded, sModRet contains - // "Loaded Module [name] ..." and we strip away this beginning. - if (bModRet) - sModRet = sModRet.Token(1, true, sModName + "] "); + // If the module was loaded, sModRet contains + // "Loaded Module [name] ..." and we strip away this beginning. + if (bModRet) + sModRet = sModRet.Token(1, true, sModName + "] "); - CUtils::PrintStatus(bModRet, sModRet); - if (!bModRet) { - sError = sModRet; - return false; - } - } catch (CException e) { - sError = "Caught an exception while reloading [" + sModName + "]"; - CUtils::PrintStatus(false, sModRet); + CUtils::PrintStatus(bModRet, sModRet); + if (!bModRet) { + sError = sModRet; return false; } } else This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-07-18 09:37:08
|
Revision: 1138 http://znc.svn.sourceforge.net/znc/?rev=1138&view=rev Author: psychon Date: 2008-07-18 09:37:11 +0000 (Fri, 18 Jul 2008) Log Message: ----------- Enable some more debug flags with --enable-debug See these links for info on these defines: http://gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt12ch29.html http://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode.html Modified Paths: -------------- trunk/configure trunk/configure.in Modified: trunk/configure =================================================================== --- trunk/configure 2008-07-17 12:01:44 UTC (rev 1137) +++ trunk/configure 2008-07-18 09:37:11 UTC (rev 1138) @@ -2514,6 +2514,8 @@ if test "$DEBUG" != "no"; then appendCXX -ggdb -D_DEBUG + # These enable some debug options in g++'s STL, e.g. invalid use of iterators + appendCXX -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC -D_GLIBCXX_CONCEPT_CHECKS else appendCXX -O2 -fomit-frame-pointer fi Modified: trunk/configure.in =================================================================== --- trunk/configure.in 2008-07-17 12:01:44 UTC (rev 1137) +++ trunk/configure.in 2008-07-18 09:37:11 UTC (rev 1138) @@ -90,6 +90,8 @@ if test "$DEBUG" != "no"; then appendCXX -ggdb -D_DEBUG + # These enable some debug options in g++'s STL, e.g. invalid use of iterators + appendCXX -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC -D_GLIBCXX_CONCEPT_CHECKS else appendCXX -O2 -fomit-frame-pointer fi This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-07-20 15:07:18
|
Revision: 1139 http://znc.svn.sourceforge.net/znc/?rev=1139&view=rev Author: psychon Date: 2008-07-20 15:06:33 +0000 (Sun, 20 Jul 2008) Log Message: ----------- Make webadmin generate salted passwords, too Modified Paths: -------------- trunk/Utils.cpp trunk/Utils.h trunk/modules/webadmin.cpp Modified: trunk/Utils.cpp =================================================================== --- trunk/Utils.cpp 2008-07-18 09:37:11 UTC (rev 1138) +++ trunk/Utils.cpp 2008-07-20 15:06:33 UTC (rev 1139) @@ -189,8 +189,9 @@ return ""; } -CString CUtils::GetSaltedHashPass(CString& sSalt, unsigned int uiSaltLength) { - sSalt = CString::RandomString(uiSaltLength); +CString CUtils::GetSaltedHashPass(CString& sSalt) { + sSalt = GetSalt(); + unsigned int uiSaltLength = sSalt.length(); const char *pSalt = sSalt.c_str(); while (true) { @@ -232,6 +233,10 @@ return ""; } +CString CUtils::GetSalt() { + return CString::RandomString(20); +} + char* CUtils::GetPass(const CString& sPrompt) { PrintPrompt(sPrompt); return getpass(""); Modified: trunk/Utils.h =================================================================== --- trunk/Utils.h 2008-07-18 09:37:11 UTC (rev 1138) +++ trunk/Utils.h 2008-07-20 15:06:33 UTC (rev 1139) @@ -52,7 +52,8 @@ static void PrintAction(const CString& sMessage); static void PrintStatus(bool bSuccess, const CString& sMessage = ""); static CString GetHashPass(); - static CString GetSaltedHashPass(CString& sSalt, unsigned int uiSaltLength = 20); + static CString GetSaltedHashPass(CString& sSalt); + static CString GetSalt(); static char* GetPass(const CString& sPrompt); static bool GetInput(const CString& sPrompt, CString& sRet, const CString& sDefault = "", const CString& sHint = ""); static bool GetBoolInput(const CString& sPrompt, bool bDefault); Modified: trunk/modules/webadmin.cpp =================================================================== --- trunk/modules/webadmin.cpp 2008-07-18 09:37:11 UTC (rev 1138) +++ trunk/modules/webadmin.cpp 2008-07-20 15:06:33 UTC (rev 1139) @@ -1023,7 +1023,9 @@ } if (!sArg.empty()) { - pNewUser->SetPass(sArg.MD5(), true); + CString sSalt = CUtils::GetSalt(); + CString sSaltedPass = sArg + sSalt; + pNewUser->SetPass(sSaltedPass.MD5(), true, sSalt); } VCString vsArgs; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-07-22 11:34:29
|
Revision: 1143 http://znc.svn.sourceforge.net/znc/?rev=1143&view=rev Author: psychon Date: 2008-07-22 11:34:38 +0000 (Tue, 22 Jul 2008) Log Message: ----------- Simplify the connect user code a little The old code used a timer. That timer needed to be restarted if the user list was changed (adding / removing of users), because it saved an iterator into that map between runs, which would become invalid. The new code in CConnectUserTimer::RunJob() is actually more complicated now, but the iterator is gone. This also means no need to restart that timer more or less always. ;) (This also means one theoretical source of bugs less) Modified Paths: -------------- trunk/znc.cpp trunk/znc.h Modified: trunk/znc.cpp =================================================================== --- trunk/znc.cpp 2008-07-22 08:39:18 UTC (rev 1142) +++ trunk/znc.cpp 2008-07-22 11:34:38 UTC (rev 1143) @@ -203,7 +203,6 @@ } m_msDelUsers.clear(); - RestartConnectUser(); return true; } @@ -888,9 +887,6 @@ m_msDelUsers = m_msUsers; m_msUsers.clear(); - // Make sure that timer doesn't have a stale iterator - DisableConnectUser(); - if (DoRehash(sError)) { #ifdef _MODULES GetModules().OnPostRehash(); @@ -910,9 +906,6 @@ m_msDelUsers.erase(m_msDelUsers.begin()); } - // Make sure that users that want to connect do so - RestartConnectUser(); - return false; } @@ -967,9 +960,6 @@ m_vpListeners.erase(m_vpListeners.begin()); } - // Make sure that timer doesn't have a stale iterator - DisableConnectUser(); - CString sLine; bool bCommented = false; // support for /**/ style comments CUser* pUser = NULL; // Used to keep track of which user block we are in @@ -1564,7 +1554,7 @@ } // Make sure that users that want to connect do so - RestartConnectUser(); + EnableConnectUser(); return true; } @@ -1726,44 +1716,58 @@ CConnectUserTimer(int iSecs) : CCron() { SetName("Connect users"); Start(iSecs); - m_itUserIter = CZNC::Get().GetUserMap().begin(); + m_uiPosNextUser = 0; } virtual ~CConnectUserTimer() {} protected: virtual void RunJob() { unsigned int uiUserCount; - map<CString,CUser*>::const_iterator end; bool bUsersLeft = false; + const map<CString,CUser*>& mUsers = CZNC::Get().GetUserMap(); + map<CString,CUser*>::const_iterator it = mUsers.begin(); uiUserCount = CZNC::Get().GetUserMap().size(); - end = CZNC::Get().GetUserMap().end(); + if (m_uiPosNextUser >= uiUserCount) { + m_uiPosNextUser = 0; + } + + for (unsigned int i = 0; i < m_uiPosNextUser; i++) { + it++; + } + // Try to connect each user, if this doesnt work, abort for (unsigned int i = 0; i < uiUserCount; i++) { - if (m_itUserIter == end) { - m_itUserIter = CZNC::Get().GetUserMap().begin(); - } + if (it == mUsers.end()) + it = mUsers.begin(); - CUser* pUser = m_itUserIter->second; + CUser* pUser = it->second; + it++; + m_uiPosNextUser = (m_uiPosNextUser + 1) % uiUserCount; - m_itUserIter++; - // Is this user disconnected and does he want to connect? - if (pUser->GetIRCSock() == NULL && pUser->GetIRCConnectEnabled()) + if (pUser->GetIRCSock() == NULL && pUser->GetIRCConnectEnabled()) { + // The timer runs until it once didn't find any users to connect bUsersLeft = true; - if (CZNC::Get().ConnectUser(pUser)) - // Wait until next time timer fires - return; + DEBUG_ONLY(cout << "Connecting user [" << pUser->GetUserName() + << "]" << endl); + + if (CZNC::Get().ConnectUser(pUser)) + // User connecting, wait until next time timer fires + return; + } } - if (bUsersLeft == false) + if (bUsersLeft == false) { + DEBUG_ONLY(cout << "ConnectUserTimer done" << endl); CZNC::Get().DisableConnectUser(); + } } private: - map<CString,CUser*>::const_iterator m_itUserIter; + size_t m_uiPosNextUser; }; void CZNC::EnableConnectUser() { @@ -1782,16 +1786,3 @@ m_pConnectUserTimer->Stop(); m_pConnectUserTimer = NULL; } - -void CZNC::RestartConnectUser() { - DisableConnectUser(); - - map<CString, CUser*>::iterator end = m_msUsers.end(); - for (map<CString,CUser*>::iterator it = m_msUsers.begin(); it != end; it++) { - // If there is a user without irc socket we need the timer - if (it->second->GetIRCSock() == NULL) { - EnableConnectUser(); - return; - } - } -} Modified: trunk/znc.h =================================================================== --- trunk/znc.h 2008-07-22 08:39:18 UTC (rev 1142) +++ trunk/znc.h 2008-07-22 11:34:38 UTC (rev 1143) @@ -180,8 +180,6 @@ // This creates a CConnectUserTimer if we haven't got one yet void EnableConnectUser(); void DisableConnectUser(); - // This needs to be called if anything was added / removed to m_msUsers - void RestartConnectUser(); private: bool DoRehash(CString& sError); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-07-24 10:14:33
|
Revision: 1146 http://znc.svn.sourceforge.net/znc/?rev=1146&view=rev Author: psychon Date: 2008-07-24 10:14:41 +0000 (Thu, 24 Jul 2008) Log Message: ----------- Remove some unused arguments and unimplemented functions Modified Paths: -------------- trunk/Client.cpp trunk/FileUtils.h trunk/String.cpp trunk/String.h trunk/User.cpp trunk/User.h Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2008-07-23 15:05:35 UTC (rev 1145) +++ trunk/Client.cpp 2008-07-24 10:14:41 UTC (rev 1146) @@ -437,7 +437,7 @@ // Need to lookup the connection by port, filter the port, and forward to the user if (strncasecmp(sTarget.c_str(), m_pUser->GetStatusPrefix().c_str(), m_pUser->GetStatusPrefix().length()) == 0) { - if ((m_pUser) && (m_pUser->ResumeFile(sTarget, uResumePort, uResumeSize))) { + if ((m_pUser) && (m_pUser->ResumeFile(uResumePort, uResumeSize))) { PutClient(":" + sTarget + "!zn...@zn... PRIVMSG " + GetNick() + " :\001DCC ACCEPT " + sFile + " " + CString(uResumePort) + " " + CString(uResumeSize) + "\001"); } else { PutStatus("DCC -> [" + GetNick() + "][" + sFile + "] Unable to find send to initiate resume."); Modified: trunk/FileUtils.h =================================================================== --- trunk/FileUtils.h 2008-07-23 15:05:35 UTC (rev 1145) +++ trunk/FileUtils.h 2008-07-24 10:14:41 UTC (rev 1146) @@ -246,7 +246,7 @@ return uRet; } - static unsigned int Delete(mode_t mode, const CString& sWildcard, const CString& sDir = ".") { + static unsigned int Delete(const CString& sWildcard, const CString& sDir = ".") { CDir cDir; cDir.FillByWildcard(sDir, sWildcard); return cDir.Delete(); Modified: trunk/String.cpp =================================================================== --- trunk/String.cpp 2008-07-23 15:05:35 UTC (rev 1145) +++ trunk/String.cpp 2008-07-24 10:14:41 UTC (rev 1146) @@ -666,10 +666,6 @@ return ssRet.size(); } -CString CString::Format(const CString& sFormatStr, ...) { - return ""; -} - CString CString::RandomString(unsigned int uLength) { const char chars[] = "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Modified: trunk/String.h =================================================================== --- trunk/String.h 2008-07-23 15:05:35 UTC (rev 1145) +++ trunk/String.h 2008-07-24 10:14:41 UTC (rev 1146) @@ -107,7 +107,6 @@ unsigned int URLSplit(MCString& msRet) const; unsigned int Split(const CString& sDelim, VCString& vsRet, bool bAllowEmpty = true, const CString& sLeft = "", const CString& sRight = "") const; unsigned int Split(const CString& sDelim, SCString& ssRet, bool bAllowEmpty = true, const CString& sLeft = "", const CString& sRight = "") const; - static CString Format(const CString& sFormatStr, ...); static CString RandomString(unsigned int uLength); Modified: trunk/User.cpp =================================================================== --- trunk/User.cpp 2008-07-23 15:05:35 UTC (rev 1145) +++ trunk/User.cpp 2008-07-24 10:14:41 UTC (rev 1146) @@ -914,7 +914,7 @@ return (pClient == NULL); } -bool CUser::ResumeFile(const CString& sRemoteNick, unsigned short uPort, unsigned long uFileSize) { +bool CUser::ResumeFile(unsigned short uPort, unsigned long uFileSize) { CSockManager& Manager = CZNC::Get().GetManager(); for (unsigned int a = 0; a < Manager.size(); a++) { Modified: trunk/User.h =================================================================== --- trunk/User.h 2008-07-23 15:05:35 UTC (rev 1145) +++ trunk/User.h 2008-07-24 10:14:41 UTC (rev 1146) @@ -104,7 +104,7 @@ bool SendFile(const CString& sRemoteNick, const CString& sFileName, const CString& sModuleName = ""); bool GetFile(const CString& sRemoteNick, const CString& sRemoteIP, unsigned short uRemotePort, const CString& sFileName, unsigned long uFileSize, const CString& sModuleName = ""); - bool ResumeFile(const CString& sRemoteNick, unsigned short uPort, unsigned long uFileSize); + bool ResumeFile(unsigned short uPort, unsigned long uFileSize); CString GetCurNick() const; bool Clone(const CUser& User, CString& sErrorRet, bool bCloneChans = true); void BounceAllClients(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-07-24 10:22:11
|
Revision: 1148 http://znc.svn.sourceforge.net/znc/?rev=1148&view=rev Author: psychon Date: 2008-07-24 10:22:17 +0000 (Thu, 24 Jul 2008) Log Message: ----------- Move the forwarding of raw 353 into an own function This also contains some minor changes to the code. One of those is that we now also handle namesx and uhnames for channels we don't know. BTW: CIRCSock::ReadLine() is waaay too long. Modified Paths: -------------- trunk/IRCSock.cpp trunk/IRCSock.h Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2008-07-24 10:16:52 UTC (rev 1147) +++ trunk/IRCSock.cpp 2008-07-24 10:22:17 UTC (rev 1148) @@ -328,62 +328,20 @@ sRest.Trim(); // Todo: allow for non @+= server msgs CChan* pChan = m_pUser->FindChan(sRest.Token(1)); - if (!pChan) { - // If we don't know that channel, a client might have - // sent a /names on it's own -> forward it. - m_pUser->PutUser(sLine); - return; - } + // If we don't know that channel, some client might have + // requested a /names for it and we really should forward this. + if (pChan) { + CString sNicks = sRest.Token(2, true); + if (sNicks.Left(1) == ":") { + sNicks.LeftChomp(); + } - CString sNicks = sRest.Token(2, true); - if (sNicks.Left(1) == ":") { - sNicks.LeftChomp(); + pChan->AddNicks(sNicks); } - pChan->AddNicks(sNicks); + ForwardRaw353(sLine); - // Get everything except the actual user list - CString sTmp = sLine.Token(0, false, " :") + " :"; - vector<CClient*>& vClients = m_pUser->GetClients(); - - for (unsigned int a = 0; a < vClients.size(); a++) { - if ((!m_bNamesx || vClients[a]->HasNamesx()) - && (!m_bUHNames || vClients[a]->HasUHNames())) { - m_pUser->PutUser(sLine, vClients[a]); - } else { - unsigned int i = 0; - // This loop runs once for - // every nick on the channel - for (;;) { - sNick = sNicks.Token(i).Trim_n(" "); - if (sNick.empty()) - break; - - if (m_bNamesx && !vClients[a]->HasNamesx() - && IsPermChar(sNick[0])) { - // Server has, client hasnt NAMESX, - // so we just use the first perm char - while (sNick.length() > 2 - && IsPermChar(sNick[1])) { - sNick = sNick[0] + sNick.substr(2); - } - } - - // Server has, client hasnt UHNAMES, - // so we strip away ident and host. - if (m_bUHNames && !vClients[a]->HasUHNames()) { - sNick = sNick.Token(0, false, "!"); - } - - sTmp += sNick + " "; - i++; - } - // Strip away the spaces we inserted at the end - sTmp.Trim(" "); - m_pUser->PutUser(sTmp, vClients[a]); - } - } - // We forwarded it in the for loop above already + // We forwarded it already, so return return; } case 366: { // end of names list @@ -1036,6 +994,51 @@ } } +void CIRCSock::ForwardRaw353(const CString& sLine) const { + vector<CClient*>& vClients = m_pUser->GetClients(); + CString sNicks = sLine.Token(5, true); + if (sNicks.Left(1) == ":") + sNicks.LeftChomp(); + + for (unsigned int a = 0; a < vClients.size(); a++) { + if ((!m_bNamesx || vClients[a]->HasNamesx()) && (!m_bUHNames || vClients[a]->HasUHNames())) { + // Client and server have both the same UHNames and Namesx stuff enabled + m_pUser->PutUser(sLine, vClients[a]); + } else { + // Get everything except the actual user list + CString sTmp = sLine.Token(0, false, " :") + " :"; + + unsigned int i = 0; + // This loop runs once for every nick on the channel + for (;;) { + CString sNick = sNicks.Token(i).Trim_n(" "); + if (sNick.empty()) + break; + + if (m_bNamesx && !vClients[a]->HasNamesx() && IsPermChar(sNick[0])) { + // Server has, client doesn't have NAMESX, so we just use the first perm char + size_t pos = sNick.find_first_not_of(GetPerms()); + if (pos >= 2 && pos != CString::npos) { + sNick = sNick[0] + sNick.substr(pos); + } + } + + if (m_bUHNames && !vClients[a]->HasUHNames()) { + // Server has, client hasnt UHNAMES, + // so we strip away ident and host. + sNick = sNick.Token(0, false, "!"); + } + + sTmp += sNick + " "; + i++; + } + // Strip away the spaces we inserted at the end + sTmp.TrimRight(" "); + m_pUser->PutUser(sTmp, vClients[a]); + } + } +} + unsigned char CIRCSock::GetPermFromMode(unsigned char uMode) const { if (m_sPermModes.size() == m_sPerms.size()) { for (unsigned int a = 0; a < m_sPermModes.size(); a++) { Modified: trunk/IRCSock.h =================================================================== --- trunk/IRCSock.h 2008-07-24 10:16:52 UTC (rev 1147) +++ trunk/IRCSock.h 2008-07-24 10:22:17 UTC (rev 1148) @@ -49,7 +49,6 @@ void KeepNick(bool bForce = false); void PutIRC(const CString& sLine); - void ParseISupport(const CString& sLine); void ResetChans(); void Quit(); @@ -82,6 +81,8 @@ // !Getters private: void SetNick(const CString& sNick); + void ParseISupport(const CString& sLine); + void ForwardRaw353(const CString& sLine) const; protected: bool m_bISpoofReleased; bool m_bAuthed; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-07-24 10:34:06
|
Revision: 1149 http://znc.svn.sourceforge.net/znc/?rev=1149&view=rev Author: psychon Date: 2008-07-24 10:34:15 +0000 (Thu, 24 Jul 2008) Log Message: ----------- Handle the on-connect 433 in an own function When our primary nick is already taken, we try a couple of different nicks in order to be able to connect to the IRC server. This code is now in an own function. BTW: CIRCSock::Readline() is still waaay too long. Modified Paths: -------------- trunk/IRCSock.cpp trunk/IRCSock.h Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2008-07-24 10:22:17 UTC (rev 1148) +++ trunk/IRCSock.cpp 2008-07-24 10:34:15 UTC (rev 1149) @@ -175,45 +175,11 @@ if (m_pUser->IsChan(sRest.Token(0)) || sNick != "*") break; case 433: { - unsigned int uMax = GetMaxNickLen(); CString sBadNick = sRest.Token(0); - CString sConfNick = m_pUser->GetNick().Left(uMax); + CString sConfNick = m_pUser->GetNick().Left(GetMaxNickLen()); if (sNick == "*") { - CString sAltNick = m_pUser->GetAltNick().Left(uMax); - - if (sBadNick.CaseCmp(sConfNick) == 0) { - if ((!sAltNick.empty()) && (sConfNick.CaseCmp(sAltNick) != 0)) { - PutIRC("NICK " + sAltNick); - } else { - PutIRC("NICK " + sConfNick.Left(uMax -1) + "-"); - } - } else if (sBadNick.CaseCmp(sAltNick) == 0) { - PutIRC("NICK " + sConfNick.Left(uMax -1) + "-"); - } else if (sBadNick.CaseCmp(CString(sConfNick.Left(uMax -1) + "-")) == 0) { - PutIRC("NICK " + sConfNick.Left(uMax -1) + "|"); - } else if (sBadNick.CaseCmp(CString(sConfNick.Left(uMax -1) + "|")) == 0) { - PutIRC("NICK " + sConfNick.Left(uMax -1) + "^"); - } else if (sBadNick.CaseCmp(CString(sConfNick.Left(uMax -1) + "^")) == 0) { - PutIRC("NICK " + sConfNick.Left(uMax -1) + "a"); - } else { - char cLetter = 0; - if (sBadNick.empty()) { - Quit(); - return; - } - - cLetter = sBadNick.Right(1)[0]; - - if (cLetter == 'z') { - Quit(); - return; - } - - CString sSend = "NICK " + sConfNick.Left(uMax -1) + ++cLetter; - PutIRC(sSend); - } - + SendAltNick(sBadNick); return; } else { // :irc.server.net 433 mynick badnick :Nickname is already in use. @@ -1039,6 +1005,46 @@ } } +void CIRCSock::SendAltNick(const CString& sBadNick) { + const unsigned int uMax = GetMaxNickLen(); + const CString& sConfNick = m_pUser->GetNick().Left(uMax); + const CString& sAltNick = m_pUser->GetAltNick().Left(uMax); + + if (sBadNick.CaseCmp(sConfNick) == 0) { + if ((!sAltNick.empty()) && (sConfNick.CaseCmp(sAltNick) != 0)) { + PutIRC("NICK " + sAltNick); + } else { + PutIRC("NICK " + sConfNick.Left(uMax -1) + "-"); + } + } else if (sBadNick.CaseCmp(sAltNick) == 0) { + PutIRC("NICK " + sConfNick.Left(uMax -1) + "-"); + } else if (sBadNick.CaseCmp(CString(sConfNick.Left(uMax -1) + "-")) == 0) { + PutIRC("NICK " + sConfNick.Left(uMax -1) + "|"); + } else if (sBadNick.CaseCmp(CString(sConfNick.Left(uMax -1) + "|")) == 0) { + PutIRC("NICK " + sConfNick.Left(uMax -1) + "^"); + } else if (sBadNick.CaseCmp(CString(sConfNick.Left(uMax -1) + "^")) == 0) { + PutIRC("NICK " + sConfNick.Left(uMax -1) + "a"); + } else { + char cLetter = 0; + if (sBadNick.empty()) { + m_pUser->PutUser("No free nick available"); + Quit(); + return; + } + + cLetter = sBadNick.Right(1)[0]; + + if (cLetter == 'z') { + m_pUser->PutUser("No free nick found"); + Quit(); + return; + } + + CString sSend = "NICK " + sConfNick.Left(uMax -1) + ++cLetter; + PutIRC(sSend); + } +} + unsigned char CIRCSock::GetPermFromMode(unsigned char uMode) const { if (m_sPermModes.size() == m_sPerms.size()) { for (unsigned int a = 0; a < m_sPermModes.size(); a++) { Modified: trunk/IRCSock.h =================================================================== --- trunk/IRCSock.h 2008-07-24 10:22:17 UTC (rev 1148) +++ trunk/IRCSock.h 2008-07-24 10:34:15 UTC (rev 1149) @@ -83,6 +83,8 @@ void SetNick(const CString& sNick); void ParseISupport(const CString& sLine); void ForwardRaw353(const CString& sLine) const; + // This is called when we connect and the nick we want is already taken + void SendAltNick(const CString& sBadNick); protected: bool m_bISpoofReleased; bool m_bAuthed; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-07-24 10:38:19
|
Revision: 1150 http://znc.svn.sourceforge.net/znc/?rev=1150&view=rev Author: psychon Date: 2008-07-24 10:38:24 +0000 (Thu, 24 Jul 2008) Log Message: ----------- Move CClient's UserCommand() and HelpUser() into a new file ClientCommand.cpp Modified Paths: -------------- trunk/Client.cpp trunk/Makefile.in Added Paths: ----------- trunk/ClientCommand.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2008-07-24 10:34:15 UTC (rev 1149) +++ trunk/Client.cpp 2008-07-24 10:38:24 UTC (rev 1150) @@ -9,9 +9,7 @@ #include "Client.h" #include "Chan.h" #include "DCCBounce.h" -#include "DCCSock.h" #include "IRCSock.h" -#include "Server.h" #include "Timers.h" #include "User.h" #include "znc.h" @@ -623,955 +621,6 @@ } } -void CClient::UserCommand(const CString& sLine) { - if (!m_pUser) { - return; - } - - if (sLine.empty()) { - return; - } - - CString sCommand = sLine.Token(0); - - if (sCommand.CaseCmp("HELP") == 0) { - HelpUser(); - } else if (sCommand.CaseCmp("LISTNICKS") == 0) { - CString sChan = sLine.Token(1); - - if (sChan.empty()) { - PutStatus("Usage: ListNicks <#chan>"); - return; - } - - CChan* pChan = m_pUser->FindChan(sChan); - - if (!pChan) { - PutStatus("You are not on [" + sChan + "]"); - return; - } - - if (!pChan->IsOn()) { - PutStatus("You are not on [" + sChan + "] [trying]"); - return; - } - - const map<CString,CNick*>& msNicks = pChan->GetNicks(); - CIRCSock* pIRCSock = (!m_pUser) ? NULL : m_pUser->GetIRCSock(); - const CString& sPerms = (pIRCSock) ? pIRCSock->GetPerms() : ""; - - if (!msNicks.size()) { - PutStatus("No nicks on [" + sChan + "]"); - return; - } - - CTable Table; - - for (unsigned int p = 0; p < sPerms.size(); p++) { - CString sPerm; - sPerm += sPerms[p]; - Table.AddColumn(sPerm); - } - - Table.AddColumn("Nick"); - Table.AddColumn("Ident"); - Table.AddColumn("Host"); - - for (map<CString,CNick*>::const_iterator a = msNicks.begin(); a != msNicks.end(); a++) { - Table.AddRow(); - - for (unsigned int b = 0; b < sPerms.size(); b++) { - if (a->second->HasPerm(sPerms[b])) { - CString sPerm; - sPerm += sPerms[b]; - Table.SetCell(sPerm, sPerm); - } - } - - Table.SetCell("Nick", a->second->GetNick()); - Table.SetCell("Ident", a->second->GetIdent()); - Table.SetCell("Host", a->second->GetHost()); - } - - unsigned int uTableIdx = 0; - CString sTmp; - - while (Table.GetLine(uTableIdx++, sTmp)) { - PutStatus(sTmp); - } - } else if (sCommand.CaseCmp("DETACH") == 0) { - if (m_pUser) { - CString sChan = sLine.Token(1); - - if (sChan.empty()) { - PutStatus("Usage: Detach <#chan>"); - return; - } - - CChan* pChan = m_pUser->FindChan(sChan); - if (!pChan) { - PutStatus("You are not on [" + sChan + "]"); - return; - } - - PutStatus("Detaching you from [" + sChan + "]"); - pChan->DetachUser(); - } - } else if (sCommand.CaseCmp("VERSION") == 0) { - PutStatus(CZNC::GetTag()); - } else if (sCommand.CaseCmp("MOTD") == 0) { - if (!SendMotd()) { - PutStatus("There is no MOTD set."); - } - } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("Rehash") == 0) { - CString sRet; - - if (CZNC::Get().RehashConfig(sRet)) { - PutStatus("Rehashing succeeded!"); - } else { - PutStatus("Rehashing failed: " + sRet); - } - } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("SaveConfig") == 0) { - if (CZNC::Get().WriteConfig()) { - PutStatus("Wrote config to [" + CZNC::Get().GetConfigFile() + "]"); - } else { - PutStatus("Error while trying to write config."); - } - } else if (sCommand.CaseCmp("LISTCLIENTS") == 0) { - if (m_pUser) { - CUser* pUser = m_pUser; - CString sNick = sLine.Token(1); - - if (!sNick.empty()) { - if (!m_pUser->IsAdmin()) { - PutStatus("Usage: ListClients"); - return; - } - - pUser = CZNC::Get().FindUser(sNick); - - if (!pUser) { - PutStatus("No such user [" + sNick + "]"); - return; - } - } - - vector<CClient*>& vClients = pUser->GetClients(); - - if (vClients.empty()) { - PutStatus("No clients are connected"); - return; - } - - CTable Table; - Table.AddColumn("Host"); - - for (unsigned int a = 0; a < vClients.size(); a++) { - Table.AddRow(); - Table.SetCell("Host", vClients[a]->GetRemoteIP()); - } - - if (Table.size()) { - unsigned int uTableIdx = 0; - CString sTmp; - - while (Table.GetLine(uTableIdx++, sTmp)) { - PutStatus(sTmp); - } - } - } - } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("LISTUSERS") == 0) { - const map<CString, CUser*>& msUsers = CZNC::Get().GetUserMap(); - CTable Table; - Table.AddColumn("Username"); - Table.AddColumn("Clients"); - Table.AddColumn("OnIRC"); - Table.AddColumn("IRC Server"); - Table.AddColumn("IRC User"); - - for (map<CString, CUser*>::const_iterator it = msUsers.begin(); it != msUsers.end(); it++) { - Table.AddRow(); - Table.SetCell("Username", it->first); - Table.SetCell("Clients", CString(it->second->GetClients().size())); - if (!it->second->IsIRCConnected()) { - Table.SetCell("OnIRC", "No"); - } else { - Table.SetCell("OnIRC", "Yes"); - Table.SetCell("IRC Server", it->second->GetIRCServer()); - Table.SetCell("IRC User", it->second->GetIRCNick().GetNickMask()); - } - } - - if (Table.size()) { - unsigned int uTableIdx = 0; - CString sTmp; - - while (Table.GetLine(uTableIdx++, sTmp)) { - PutStatus(sTmp); - } - } - } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("SetMOTD") == 0) { - CString sMessage = sLine.Token(1, true); - - if (sMessage.empty()) { - PutStatus("Usage: SetMOTD <Message>"); - } else { - CZNC::Get().SetMotd(sMessage); - PutStatus("MOTD set to [" + sMessage + "]"); - } - } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("AddMOTD") == 0) { - CString sMessage = sLine.Token(1, true); - - if (sMessage.empty()) { - PutStatus("Usage: AddMOTD <Message>"); - } else { - CZNC::Get().AddMotd(sMessage); - PutStatus("Added [" + sMessage + "] to MOTD"); - } - } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("ClearMOTD") == 0) { - CZNC::Get().ClearMotd(); - PutStatus("Cleared MOTD"); - } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("BROADCAST") == 0) { - CZNC::Get().Broadcast(sLine.Token(1, true)); - } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("SHUTDOWN") == 0) { - CString sMessage = sLine.Token(1, true); - - if (sMessage.empty()) { - sMessage = "ZNC is being shutdown NOW!!"; - } - - CZNC::Get().Broadcast(sMessage); - usleep(100000); // Sleep for 10ms to attempt to allow the previous Broadcast() to go through to all users - - throw CException(CException::EX_Shutdown); - } else if (sCommand.CaseCmp("JUMP") == 0 || - sCommand.CaseCmp("CONNECT") == 0) { - if (m_pUser) { - if (!m_pUser->HasServers()) { - PutStatus("You don't have any servers added."); - return; - } - - if (m_pIRCSock) { - m_pIRCSock->Quit(); - PutStatus("Jumping to the next server in the list..."); - } else { - PutStatus("Connecting..."); - } - - m_pUser->SetIRCConnectEnabled(true); - m_pUser->CheckIRCConnect(); - return; - } - } else if (sCommand.CaseCmp("DISCONNECT") == 0) { - if (m_pUser) { - if (m_pIRCSock) - m_pIRCSock->Quit(); - m_pUser->SetIRCConnectEnabled(false); - PutStatus("Disconnected from IRC. Use 'connect' to reconnect."); - return; - } - } else if (sCommand.CaseCmp("ENABLECHAN") == 0) { - CString sChan = sLine.Token(1, true); - - if (sChan.empty()) { - PutStatus("Usage: EnableChan <channel>"); - } else { - CChan* pChan = m_pUser->FindChan(sChan); - if (!pChan) { - PutStatus("Channel [" + sChan + "] not found."); - return; - } - - pChan->Enable(); - PutStatus("Channel [" + sChan + "] enabled."); - } - } else if (sCommand.CaseCmp("LISTCHANS") == 0) { - if (m_pUser) { - const vector<CChan*>& vChans = m_pUser->GetChans(); - CIRCSock* pIRCSock = (!m_pUser) ? NULL : m_pUser->GetIRCSock(); - const CString& sPerms = (pIRCSock) ? pIRCSock->GetPerms() : ""; - - if (!vChans.size()) { - PutStatus("You have no channels defined"); - return; - } - - CTable Table; - Table.AddColumn("Name"); - Table.AddColumn("Status"); - Table.AddColumn("Conf"); - Table.AddColumn("Buf"); - Table.AddColumn("Modes"); - Table.AddColumn("Users"); - - for (unsigned int p = 0; p < sPerms.size(); p++) { - CString sPerm; - sPerm += sPerms[p]; - Table.AddColumn(sPerm); - } - - for (unsigned int a = 0; a < vChans.size(); a++) { - CChan* pChan = vChans[a]; - Table.AddRow(); - Table.SetCell("Name", pChan->GetPermStr() + pChan->GetName()); - Table.SetCell("Status", ((vChans[a]->IsOn()) ? ((vChans[a]->IsDetached()) ? "Detached" : "Joined") : ((vChans[a]->IsDisabled()) ? "Disabled" : "Trying"))); - Table.SetCell("Conf", CString((pChan->InConfig()) ? "yes" : "")); - Table.SetCell("Buf", CString((pChan->KeepBuffer()) ? "*" : "") + CString(pChan->GetBufferCount())); - Table.SetCell("Modes", pChan->GetModeString()); - Table.SetCell("Users", CString(pChan->GetNickCount())); - - for (unsigned int b = 0; b < sPerms.size(); b++) { - CString sPerm; - sPerm += sPerms[b]; - Table.SetCell(sPerm, CString(pChan->GetPermCount(sPerms[b]))); - } - } - - if (Table.size()) { - unsigned int uTableIdx = 0; - CString sTmp; - - while (Table.GetLine(uTableIdx++, sTmp)) { - PutStatus(sTmp); - } - } - } - } else if (sCommand.CaseCmp("ADDSERVER") == 0) { - CString sServer = sLine.Token(1); - - if (sServer.empty()) { - PutStatus("Usage: AddServer <host> [[+]port] [pass]"); - return; - } - - if (m_pUser->FindServer(sServer)) { - PutStatus("That server already exists"); - return; - } - - if (m_pUser && m_pUser->AddServer(sLine.Token(1, true))) { - PutStatus("Server added"); - } else { - PutStatus("Unable to add that server"); - } - } else if (sCommand.CaseCmp("REMSERVER") == 0 || sCommand.CaseCmp("DELSERVER") == 0) { - CString sServer = sLine.Token(1); - - if (sServer.empty()) { - PutStatus("Usage: RemServer <host>"); - return; - } - - const vector<CServer*>& vServers = m_pUser->GetServers(); - - if (vServers.size() <= 0) { - PutStatus("You don't have any servers added."); - return; - } - - if (m_pUser && m_pUser->DelServer(sServer)) { - PutStatus("Server removed"); - } else { - PutStatus("No such server"); - } - } else if (sCommand.CaseCmp("LISTSERVERS") == 0) { - if (m_pUser) { - if (m_pUser->HasServers()) { - const vector<CServer*>& vServers = m_pUser->GetServers(); - CTable Table; - Table.AddColumn("Host"); - Table.AddColumn("Port"); - Table.AddColumn("SSL"); - Table.AddColumn("Pass"); - - for (unsigned int a = 0; a < vServers.size(); a++) { - CServer* pServer = vServers[a]; - Table.AddRow(); - Table.SetCell("Host", pServer->GetName()); - Table.SetCell("Port", CString(pServer->GetPort())); - Table.SetCell("SSL", (pServer->IsSSL()) ? "SSL" : ""); - Table.SetCell("Pass", pServer->GetPass()); - } - - if (Table.size()) { - unsigned int uTableIdx = 0; - CString sTmp; - - while (Table.GetLine(uTableIdx++, sTmp)) { - PutStatus(sTmp); - } - } - } else { - PutStatus("You don't have any servers added."); - } - } - } else if (sCommand.CaseCmp("TOPICS") == 0) { - if (m_pUser) { - const vector<CChan*>& vChans = m_pUser->GetChans(); - CTable Table; - Table.AddColumn("Name"); - Table.AddColumn("Set By"); - Table.AddColumn("Topic"); - - for (unsigned int a = 0; a < vChans.size(); a++) { - CChan* pChan = vChans[a]; - Table.AddRow(); - Table.SetCell("Name", pChan->GetName()); - Table.SetCell("Set By", pChan->GetTopicOwner()); - Table.SetCell("Topic", pChan->GetTopic()); - } - - if (Table.size()) { - unsigned int uTableIdx = 0; - CString sTmp; - - while (Table.GetLine(uTableIdx++, sTmp)) { - PutStatus(sTmp); - } - } - } - } else if (sCommand.CaseCmp("SEND") == 0) { - CString sToNick = sLine.Token(1); - CString sFile = sLine.Token(2); - CString sAllowedPath = m_pUser->GetDLPath(); - CString sAbsolutePath; - - if ((sToNick.empty()) || (sFile.empty())) { - PutStatus("Usage: Send <nick> <file>"); - return; - } - - sAbsolutePath = CDir::ChangeDir(m_pUser->GetDLPath(), sFile, CZNC::Get().GetHomePath()); - - if (sAbsolutePath.Left(sAllowedPath.length()) != sAllowedPath) { - PutStatus("Illegal path."); - return; - } - - if (m_pUser) { - m_pUser->SendFile(sToNick, sFile); - } - } else if (sCommand.CaseCmp("GET") == 0) { - CString sFile = sLine.Token(1); - CString sAllowedPath = m_pUser->GetDLPath(); - CString sAbsolutePath; - - if (sFile.empty()) { - PutStatus("Usage: Get <file>"); - return; - } - - sAbsolutePath = CDir::ChangeDir(m_pUser->GetDLPath(), sFile, CZNC::Get().GetHomePath()); - - if (sAbsolutePath.Left(sAllowedPath.length()) != sAllowedPath) { - PutStatus("Illegal path."); - return; - } - - if (m_pUser) { - m_pUser->SendFile(GetNick(), sFile); - } - } else if (sCommand.CaseCmp("LISTDCCS") == 0) { - CSockManager& Manager = CZNC::Get().GetManager(); - - CTable Table; - Table.AddColumn("Type"); - Table.AddColumn("State"); - Table.AddColumn("Speed"); - Table.AddColumn("Nick"); - Table.AddColumn("IP"); - Table.AddColumn("File"); - - for (unsigned int a = 0; a < Manager.size(); a++) { - const CString& sSockName = Manager[a]->GetSockName(); - - if (strncasecmp(sSockName.c_str(), "DCC::", 5) == 0) { - if (strncasecmp(sSockName.c_str() +5, "XFER::REMOTE::", 14) == 0) { - continue; - } - - if (strncasecmp(sSockName.c_str() +5, "CHAT::REMOTE::", 14) == 0) { - continue; - } - - if (strncasecmp(sSockName.c_str() +5, "SEND", 4) == 0) { - CDCCSock* pSock = (CDCCSock*) Manager[a]; - - Table.AddRow(); - Table.SetCell("Type", "Sending"); - Table.SetCell("State", CString::ToPercent(pSock->GetProgress())); - Table.SetCell("Speed", CString((int)(pSock->GetAvgWrite() / 1024.0)) + " KiB/s"); - Table.SetCell("Nick", pSock->GetRemoteNick()); - Table.SetCell("IP", pSock->GetRemoteIP()); - Table.SetCell("File", pSock->GetFileName()); - } else if (strncasecmp(sSockName.c_str() +5, "GET", 3) == 0) { - CDCCSock* pSock = (CDCCSock*) Manager[a]; - - Table.AddRow(); - Table.SetCell("Type", "Getting"); - Table.SetCell("State", CString::ToPercent(pSock->GetProgress())); - Table.SetCell("Speed", CString((int)(pSock->GetAvgRead() / 1024.0)) + " KiB/s"); - Table.SetCell("Nick", pSock->GetRemoteNick()); - Table.SetCell("IP", pSock->GetRemoteIP()); - Table.SetCell("File", pSock->GetFileName()); - } else if (strncasecmp(sSockName.c_str() +5, "LISTEN", 6) == 0) { - CDCCSock* pSock = (CDCCSock*) Manager[a]; - - Table.AddRow(); - Table.SetCell("Type", "Sending"); - Table.SetCell("State", "Waiting"); - Table.SetCell("Nick", pSock->GetRemoteNick()); - Table.SetCell("IP", pSock->GetRemoteIP()); - Table.SetCell("File", pSock->GetFileName()); - } else if (strncasecmp(sSockName.c_str() +5, "XFER::LOCAL", 11) == 0) { - CDCCBounce* pSock = (CDCCBounce*) Manager[a]; - - CString sState = "Waiting"; - if ((pSock->IsConnected()) || (pSock->IsPeerConnected())) { - sState = "Halfway"; - if ((pSock->IsPeerConnected()) && (pSock->IsPeerConnected())) { - sState = "Connected"; - } - } - - Table.AddRow(); - Table.SetCell("Type", "Xfer"); - Table.SetCell("State", sState); - Table.SetCell("Nick", pSock->GetRemoteNick()); - Table.SetCell("IP", pSock->GetRemoteIP()); - Table.SetCell("File", pSock->GetFileName()); - } else if (strncasecmp(sSockName.c_str() +5, "CHAT::LOCAL", 11) == 0) { - CDCCBounce* pSock = (CDCCBounce*) Manager[a]; - - CString sState = "Waiting"; - if ((pSock->IsConnected()) || (pSock->IsPeerConnected())) { - sState = "Halfway"; - if ((pSock->IsPeerConnected()) && (pSock->IsPeerConnected())) { - sState = "Connected"; - } - } - - Table.AddRow(); - Table.SetCell("Type", "Chat"); - Table.SetCell("State", sState); - Table.SetCell("Nick", pSock->GetRemoteNick()); - Table.SetCell("IP", pSock->GetRemoteIP()); - } - } - } - - if (Table.size()) { - unsigned int uTableIdx = 0; - CString sTmp; - - while (Table.GetLine(uTableIdx++, sTmp)) { - PutStatus(sTmp); - } - } else { - PutStatus("You have no active DCCs."); - } - } else if ((sCommand.CaseCmp("LISTMODS") == 0) || (sCommand.CaseCmp("LISTMODULES") == 0)) { -#ifdef _MODULES - if (m_pUser->IsAdmin()) { - CModules& GModules = CZNC::Get().GetModules(); - - if (!GModules.size()) { - PutStatus("No global modules loaded."); - } else { - CTable GTable; - GTable.AddColumn("Name"); - GTable.AddColumn("Description"); - - for (unsigned int b = 0; b < GModules.size(); b++) { - GTable.AddRow(); - GTable.SetCell("Name", GModules[b]->GetModName()); - GTable.SetCell("Description", GModules[b]->GetDescription().Ellipsize(128)); - } - - unsigned int uTableIdx = 0; - CString sTmp; - - while (GTable.GetLine(uTableIdx++, sTmp)) { - PutStatus(sTmp); - } - } - } - - if (m_pUser) { - CModules& Modules = m_pUser->GetModules(); - - if (!Modules.size()) { - PutStatus("You have no modules loaded."); - return; - } - - CTable Table; - Table.AddColumn("Name"); - Table.AddColumn("Description"); - - for (unsigned int b = 0; b < Modules.size(); b++) { - Table.AddRow(); - Table.SetCell("Name", Modules[b]->GetModName()); - Table.SetCell("Description", Modules[b]->GetDescription().Ellipsize(128)); - } - - unsigned int uTableIdx = 0; - CString sTmp; - while (Table.GetLine(uTableIdx++, sTmp)) { - PutStatus(sTmp); - } - } -#else - PutStatus("Modules are not enabled."); -#endif - return; - } else if ((sCommand.CaseCmp("LISTAVAILMODS") == 0) || (sCommand.CaseCmp("LISTAVAILABLEMODULES") == 0)) { -#ifdef _MODULES - if (m_pUser->DenyLoadMod()) { - PutStatus("Access Denied."); - return; - } - - if (m_pUser->IsAdmin()) { - set<CModInfo> ssGlobalMods; - CZNC::Get().GetModules().GetAvailableMods(ssGlobalMods, true); - - if (!ssGlobalMods.size()) { - PutStatus("No global modules available."); - } else { - CTable GTable; - GTable.AddColumn("Name"); - GTable.AddColumn("Description"); - set<CModInfo>::iterator it; - - for (it = ssGlobalMods.begin(); it != ssGlobalMods.end(); it++) { - const CModInfo& Info = *it; - GTable.AddRow(); - GTable.SetCell("Name", (CZNC::Get().GetModules().FindModule(Info.GetName()) ? "*" : " ") + Info.GetName()); - GTable.SetCell("Description", Info.GetDescription().Ellipsize(128)); - } - - unsigned int uTableIdx = 0; - CString sTmp; - - while (GTable.GetLine(uTableIdx++, sTmp)) { - PutStatus(sTmp); - } - } - } - - if (m_pUser) { - set<CModInfo> ssUserMods; - CZNC::Get().GetModules().GetAvailableMods(ssUserMods); - - if (!ssUserMods.size()) { - PutStatus("No user modules available."); - return; - } - - CTable Table; - Table.AddColumn("Name"); - Table.AddColumn("Description"); - set<CModInfo>::iterator it; - - for (it = ssUserMods.begin(); it != ssUserMods.end(); it++) { - const CModInfo& Info = *it; - Table.AddRow(); - Table.SetCell("Name", (m_pUser->GetModules().FindModule(Info.GetName()) ? "*" : " ") + Info.GetName()); - Table.SetCell("Description", Info.GetDescription().Ellipsize(128)); - } - - unsigned int uTableIdx = 0; - CString sTmp; - while (Table.GetLine(uTableIdx++, sTmp)) { - PutStatus(sTmp); - } - } -#else - PutStatus("Modules are not enabled."); -#endif - return; - } else if ((sCommand.CaseCmp("LOADMOD") == 0) || (sCommand.CaseCmp("LOADMODULE") == 0)) { - CString sMod; - CString sArgs; - bool bGlobal = false; - - if (sLine.Token(1).CaseCmp("-global") == 0) { - sMod = sLine.Token(2); - - if (!m_pUser->IsAdmin()) { - PutStatus("Unable to load global module [" + sMod + "] Access Denied."); - return; - } - - sArgs = sLine.Token(3, true); - bGlobal = true; - } else { - sMod = sLine.Token(1); - sArgs = sLine.Token(2, true); - } - - if (m_pUser->DenyLoadMod()) { - PutStatus("Unable to load [" + sMod + "] Access Denied."); - return; - } -#ifdef _MODULES - if (sMod.empty()) { - PutStatus("Usage: LoadMod [-global] <module> [args]"); - return; - } - - CString sModRet; - bool b; - - if (bGlobal) { - b = CZNC::Get().GetModules().LoadModule(sMod, sArgs, NULL, sModRet); - } else { - b = m_pUser->GetModules().LoadModule(sMod, sArgs, m_pUser, sModRet); - } - if (!b) { - PutStatus("Unable to load module [" + sMod + "] [" + sModRet + "]"); - return; - } - - PutStatus(sModRet); -#else - PutStatus("Unable to load [" + sMod + "] Modules are not enabled."); -#endif - return; - } else if ((sCommand.CaseCmp("UNLOADMOD") == 0) || (sCommand.CaseCmp("UNLOADMODULE") == 0)) { - CString sMod; - bool bGlobal = false; - - if (sLine.Token(1).CaseCmp("-global") == 0) { - sMod = sLine.Token(2); - - if (!m_pUser->IsAdmin()) { - PutStatus("Unable to unload global module [" + sMod + "] Access Denied."); - return; - } - - bGlobal = true; - } else - sMod = sLine.Token(1); - - if (m_pUser->DenyLoadMod()) { - PutStatus("Unable to unload [" + sMod + "] Access Denied."); - return; - } -#ifdef _MODULES - if (sMod.empty()) { - PutStatus("Usage: UnloadMod [-global] <module>"); - return; - } - - CString sModRet; - - if (bGlobal) { - CZNC::Get().GetModules().UnloadModule(sMod, sModRet); - } else { - m_pUser->GetModules().UnloadModule(sMod, sModRet); - } - - PutStatus(sModRet); -#else - PutStatus("Unable to unload [" + sMod + "] Modules are not enabled."); -#endif - return; - } else if ((sCommand.CaseCmp("RELOADMOD") == 0) || (sCommand.CaseCmp("RELOADMODULE") == 0)) { - CString sMod; - CString sArgs; - bool bGlobal = false; - - if (sLine.Token(1).CaseCmp("-global") == 0) { - sMod = sLine.Token(2); - - if (!m_pUser->IsAdmin()) { - PutStatus("Unable to reload global module [" + sMod + "] Access Denied."); - return; - } - - sArgs = sLine.Token(3, true); - bGlobal = true; - } else { - sMod = sLine.Token(1); - sArgs = sLine.Token(2, true); - } - - if (m_pUser->DenyLoadMod()) { - PutStatus("Unable to reload [" + sMod + "] Access Denied."); - return; - } -#ifdef _MODULES - if (sMod.empty()) { - PutStatus("Usage: ReloadMod [-global] <module> [args]"); - return; - } - - CString sModRet; - - if (bGlobal) { - CZNC::Get().GetModules().ReloadModule(sMod, sArgs, NULL, sModRet); - } else { - m_pUser->GetModules().ReloadModule(sMod, sArgs, m_pUser, sModRet); - } - - PutStatus(sModRet); -#else - PutStatus("Unable to unload [" + sMod + "] Modules are not enabled."); -#endif - return; - } else if (sCommand.CaseCmp("SETVHOST") == 0 && (m_pUser->IsAdmin() || !m_pUser->DenySetVHost())) { - CString sVHost = sLine.Token(1); - - if (sVHost.empty()) { - PutStatus("Usage: SetVHost <VHost>"); - return; - } - - m_pUser->SetVHost(sVHost); - PutStatus("Set VHost to [" + m_pUser->GetVHost() + "]"); - } else if (sCommand.CaseCmp("CLEARVHOST") == 0 && (m_pUser->IsAdmin() || !m_pUser->DenySetVHost())) { - m_pUser->SetVHost(""); - PutStatus("VHost Cleared"); - } else if (sCommand.CaseCmp("PLAYBUFFER") == 0) { - CString sChan = sLine.Token(1); - - if (sChan.empty()) { - PutStatus("Usage: PlayBuffer <#chan>"); - return; - } - - CChan* pChan = m_pUser->FindChan(sChan); - - if (!pChan) { - PutStatus("You are not on [" + sChan + "]"); - return; - } - - if (!pChan->IsOn()) { - PutStatus("You are not on [" + sChan + "] [trying]"); - return; - } - - if (pChan->GetBuffer().empty()) { - PutStatus("The buffer for [" + sChan + "] is empty"); - return; - } - - pChan->SendBuffer(this); - } else if (sCommand.CaseCmp("CLEARBUFFER") == 0) { - CString sChan = sLine.Token(1); - - if (sChan.empty()) { - PutStatus("Usage: ClearBuffer <#chan>"); - return; - } - - CChan* pChan = m_pUser->FindChan(sChan); - - if (!pChan) { - PutStatus("You are not on [" + sChan + "]"); - return; - } - - if (!pChan->IsOn()) { - PutStatus("You are not on [" + sChan + "] [trying]"); - return; - } - - pChan->ClearBuffer(); - PutStatus("The buffer for [" + sChan + "] has been cleared"); - } else if (sCommand.CaseCmp("CLEARALLCHANNELBUFFERS") == 0) { - vector<CChan*>::const_iterator it; - const vector<CChan*>& vChans = m_pUser->GetChans(); - - for (it = vChans.begin(); it != vChans.end(); it++) { - (*it)->ClearBuffer(); - } - PutStatus("All channel buffers have been cleared"); - } else if (sCommand.CaseCmp("SETBUFFER") == 0) { - CString sChan = sLine.Token(1); - - if (sChan.empty()) { - PutStatus("Usage: SetBuffer <#chan> [linecount]"); - return; - } - - CChan* pChan = m_pUser->FindChan(sChan); - - if (!pChan) { - PutStatus("You are not on [" + sChan + "]"); - return; - } - - if (!pChan->IsOn()) { - PutStatus("You are not on [" + sChan + "] [trying]"); - return; - } - - unsigned int uLineCount = strtoul(sLine.Token(2).c_str(), NULL, 10); - - if (uLineCount > 500) { - PutStatus("Max linecount is 500."); - return; - } - - pChan->SetBufferCount(uLineCount); - - PutStatus("BufferCount for [" + sChan + "] set to [" + CString(pChan->GetBufferCount()) + "]"); - } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("TRAFFIC") == 0) { - CZNC::Get().UpdateTrafficStats(); - const map<CString, CUser*>& msUsers = CZNC::Get().GetUserMap(); - CTable Table; - Table.AddColumn("Username"); - Table.AddColumn("In"); - Table.AddColumn("Out"); - Table.AddColumn("Total"); - unsigned long long users_total_in = 0; - unsigned long long users_total_out = 0; - for (map<CString, CUser*>::const_iterator it = msUsers.begin(); it != msUsers.end(); it++) { - Table.AddRow(); - Table.SetCell("Username", it->first); - Table.SetCell("In", CString::ToByteStr(it->second->BytesRead())); - Table.SetCell("Out", CString::ToByteStr(it->second->BytesWritten())); - Table.SetCell("Total", CString::ToByteStr(it->second->BytesRead() + it->second->BytesWritten())); - users_total_in += it->second->BytesRead(); - users_total_out += it->second->BytesWritten(); - } - Table.AddRow(); - Table.SetCell("Username", "<Users>"); - Table.SetCell("In", CString::ToByteStr(users_total_in)); - Table.SetCell("Out", CString::ToByteStr(users_total_out)); - Table.SetCell("Total", CString::ToByteStr(users_total_in + users_total_out)); - - Table.AddRow(); - Table.SetCell("Username", "<ZNC>"); - Table.SetCell("In", CString::ToByteStr(CZNC::Get().BytesRead())); - Table.SetCell("Out", CString::ToByteStr(CZNC::Get().BytesWritten())); - Table.SetCell("Total", CString::ToByteStr(CZNC::Get().BytesRead() + CZNC::Get().BytesWritten())); - - Table.AddRow(); - Table.SetCell("Username", "<Total>"); - Table.SetCell("In", CString::ToByteStr(users_total_in + CZNC::Get().BytesRead())); - Table.SetCell("Out", CString::ToByteStr(users_total_out + CZNC::Get().BytesWritten())); - Table.SetCell("Total", CString::ToByteStr(users_total_in + CZNC::Get().BytesRead() + users_total_out + CZNC::Get().BytesWritten())); - - if (Table.size()) { - unsigned int uTableIdx = 0; - CString sTmp; - while (Table.GetLine(uTableIdx++, sTmp)) { - PutStatus(sTmp); - } - } - } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("UPTIME") == 0) { - PutStatus("Running for " + CZNC::Get().GetUptime()); - } else { - PutStatus("Unknown command [" + sCommand + "] try 'Help'"); - } -} - bool CClient::SendMotd() { const VCString& vsMotd = CZNC::Get().GetMotd(); @@ -1586,227 +635,6 @@ return true; } -void CClient::HelpUser() { - CTable Table; - Table.AddColumn("Command"); - Table.AddColumn("Arguments"); - Table.AddColumn("Description"); - - Table.AddRow(); - Table.SetCell("Command", "Version"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "Prints which version of znc this is"); - - Table.AddRow(); - Table.SetCell("Command", "MOTD"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "Show the message of the day"); - - Table.AddRow(); - Table.SetCell("Command", "ListDCCs"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "List all active DCCs"); - - Table.AddRow(); - Table.SetCell("Command", "ListMods"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "List all loaded modules"); - - Table.AddRow(); - Table.SetCell("Command", "ListAvailMods"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "List all available modules"); - - Table.AddRow(); - Table.SetCell("Command", "ListChans"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "List all channels"); - - Table.AddRow(); - Table.SetCell("Command", "ListNicks"); - Table.SetCell("Arguments", "<#chan>"); - Table.SetCell("Description", "List all nicks on a channel"); - - if (!m_pUser->IsAdmin()) { // If they are an admin we will add this command below with an argument - Table.AddRow(); - Table.SetCell("Command", "ListClients"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "List all clients connected to your znc user"); - } - - Table.AddRow(); - Table.SetCell("Command", "ListServers"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "List all servers"); - - Table.AddRow(); - Table.SetCell("Command", "AddServer"); - Table.SetCell("Arguments", "<host> [[+]port] [pass]"); - Table.SetCell("Description", "Add a server to the list"); - - Table.AddRow(); - Table.SetCell("Command", "RemServer"); - Table.SetCell("Arguments", "<host>"); - Table.SetCell("Description", "Remove a server from the list"); - - Table.AddRow(); - Table.SetCell("Command", "Enablechan"); - Table.SetCell("Arguments", "<#chan>"); - Table.SetCell("Description", "Enable the channel"); - - Table.AddRow(); - Table.SetCell("Command", "Detach"); - Table.SetCell("Arguments", "<#chan>"); - Table.SetCell("Description", "Detach from the channel"); - - Table.AddRow(); - Table.SetCell("Command", "Topics"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "Show topics in all channels"); - - Table.AddRow(); - Table.SetCell("Command", "PlayBuffer"); - Table.SetCell("Arguments", "<#chan>"); - Table.SetCell("Description", "Play back the buffer for a given channel"); - - Table.AddRow(); - Table.SetCell("Command", "ClearBuffer"); - Table.SetCell("Arguments", "<#chan>"); - Table.SetCell("Description", "Clear the buffer for a given channel"); - - Table.AddRow(); - Table.SetCell("Command", "ClearAllChannelBuffers"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "Clear the channel buffers"); - - Table.AddRow(); - Table.SetCell("Command", "SetBuffer"); - Table.SetCell("Arguments", "<#chan> [linecount]"); - Table.SetCell("Description", "Set the buffer count for a channel"); - - if (m_pUser->IsAdmin() || !m_pUser->DenySetVHost()) { - Table.AddRow(); - Table.SetCell("Command", "SetVHost"); - Table.SetCell("Arguments", "<vhost (ip preferred)>"); - Table.SetCell("Description", "Set the VHost for this connection"); - - Table.AddRow(); - Table.SetCell("Command", "ClearVHost"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "Clear the VHost for this connection"); - } - - Table.AddRow(); - Table.SetCell("Command", "Jump"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "Jump to the next server in the list"); - - Table.AddRow(); - Table.SetCell("Command", "Disconnect"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "Disconnect from IRC"); - - Table.AddRow(); - Table.SetCell("Command", "Connect"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "Reconnect to IRC"); - - Table.AddRow(); - Table.SetCell("Command", "Send"); - Table.SetCell("Arguments", "<nick> <file>"); - Table.SetCell("Description", "Send a shell file to a nick on IRC"); - - Table.AddRow(); - Table.SetCell("Command", "Get"); - Table.SetCell("Arguments", "<file>"); - Table.SetCell("Description", "Send a shell file to yourself"); - - if (m_pUser) { - if (!m_pUser->DenyLoadMod()) { - Table.AddRow(); - Table.SetCell("Command", "LoadMod"); - Table.SetCell("Arguments", "<module>"); - Table.SetCell("Description", "Load a module"); - - Table.AddRow(); - Table.SetCell("Command", "UnloadMod"); - Table.SetCell("Arguments", "<module>"); - Table.SetCell("Description", "Unload a module"); - - Table.AddRow(); - Table.SetCell("Command", "ReloadMod"); - Table.SetCell("Arguments", "<module>"); - Table.SetCell("Description", "Reload a module"); - } - - if (m_pUser->IsAdmin()) { - Table.AddRow(); - Table.SetCell("Command", "Rehash"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "Reload znc.conf from disk"); - - Table.AddRow(); - Table.SetCell("Command", "SaveConfig"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "Save the current settings to disk"); - - Table.AddRow(); - Table.SetCell("Command", "ListUsers"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "List all users/clients connected to znc"); - - Table.AddRow(); - Table.SetCell("Command", "ListClients"); - Table.SetCell("Arguments", "[User]"); - Table.SetCell("Description", "List all clients connected to your znc user"); - - Table.AddRow(); - Table.SetCell("Command", "Traffic"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "Show basic traffic stats for all znc users"); - - Table.AddRow(); - Table.SetCell("Command", "Uptime"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "Show how long ZNC is already running"); - - Table.AddRow(); - Table.SetCell("Command", "SetMOTD"); - Table.SetCell("Arguments", "<Message>"); - Table.SetCell("Description", "Set the message of the day"); - - Table.AddRow(); - Table.SetCell("Command", "AddMOTD"); - Table.SetCell("Arguments", "<Message>"); - Table.SetCell("Description", "Append <Message> to MOTD"); - - Table.AddRow(); - Table.SetCell("Command", "ClearMOTD"); - Table.SetCell("Arguments", ""); - Table.SetCell("Description", "Clear the MOTD"); - - Table.AddRow(); - Table.SetCell("Command", "Broadcast"); - Table.SetCell("Arguments", "[message]"); - Table.SetCell("Description", "Broadcast a message to all users"); - - Table.AddRow(); - Table.SetCell("Command", "Shutdown"); - Table.SetCell("Arguments", "[message]"); - Table.SetCell("Description", "Shutdown znc completely"); - } - } - - if (Table.size()) { - unsigned int uTableIdx = 0; - CString sLine; - - while (Table.GetLine(uTableIdx++, sLine)) { - PutStatus(sLine); - } - } -} - bool CClient::ConnectionFrom(const CString& sHost, unsigned short uPort) { DEBUG_ONLY(cout << GetSockName() << " == ConnectionFrom(" << sHost << ", " << uPort << ")" << endl); return CZNC::Get().IsHostAllowed(sHost); Added: trunk/ClientCommand.cpp =================================================================== --- trunk/ClientCommand.cpp (rev 0) +++ trunk/ClientCommand.cpp 2008-07-24 10:38:24 UTC (rev 1150) @@ -0,0 +1,1184 @@ +/* + * Copyright (C) 2004-2008 See the AUTHORS file for details. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +#include "Client.h" +#include "Chan.h" +#include "DCCBounce.h" +#include "DCCSock.h" +#include "IRCSock.h" +#include "Server.h" +#include "User.h" +#include "znc.h" + +void CClient::UserCommand(const CString& sLine) { + if (!m_pUser) { + return; + } + + if (sLine.empty()) { + return; + } + + CString sCommand = sLine.Token(0); + + if (sCommand.CaseCmp("HELP") == 0) { + HelpUser(); + } else if (sCommand.CaseCmp("LISTNICKS") == 0) { + CString sChan = sLine.Token(1); + + if (sChan.empty()) { + PutStatus("Usage: ListNicks <#chan>"); + return; + } + + CChan* pChan = m_pUser->FindChan(sChan); + + if (!pChan) { + PutStatus("You are not on [" + sChan + "]"); + return; + } + + if (!pChan->IsOn()) { + PutStatus("You are not on [" + sChan + "] [trying]"); + return; + } + + const map<CString,CNick*>& msNicks = pChan->GetNicks(); + CIRCSock* pIRCSock = (!m_pUser) ? NULL : m_pUser->GetIRCSock(); + const CString& sPerms = (pIRCSock) ? pIRCSock->GetPerms() : ""; + + if (!msNicks.size()) { + PutStatus("No nicks on [" + sChan + "]"); + return; + } + + CTable Table; + + for (unsigned int p = 0; p < sPerms.size(); p++) { + CString sPerm; + sPerm += sPerms[p]; + Table.AddColumn(sPerm); + } + + Table.AddColumn("Nick"); + Table.AddColumn("Ident"); + Table.AddColumn("Host"); + + for (map<CString,CNick*>::const_iterator a = msNicks.begin(); a != msNicks.end(); a++) { + Table.AddRow(); + + for (unsigned int b = 0; b < sPerms.size(); b++) { + if (a->second->HasPerm(sPerms[b])) { + CString sPerm; + sPerm += sPerms[b]; + Table.SetCell(sPerm, sPerm); + } + } + + Table.SetCell("Nick", a->second->GetNick()); + Table.SetCell("Ident", a->second->GetIdent()); + Table.SetCell("Host", a->second->GetHost()); + } + + unsigned int uTableIdx = 0; + CString sTmp; + + while (Table.GetLine(uTableIdx++, sTmp)) { + PutStatus(sTmp); + } + } else if (sCommand.CaseCmp("DETACH") == 0) { + if (m_pUser) { + CString sChan = sLine.Token(1); + + if (sChan.empty()) { + PutStatus("Usage: Detach <#chan>"); + return; + } + + CChan* pChan = m_pUser->FindChan(sChan); + if (!pChan) { + PutStatus("You are not on [" + sChan + "]"); + return; + } + + PutStatus("Detaching you from [" + sChan + "]"); + pChan->DetachUser(); + } + } else if (sCommand.CaseCmp("VERSION") == 0) { + PutStatus(CZNC::GetTag()); + } else if (sCommand.CaseCmp("MOTD") == 0) { + if (!SendMotd()) { + PutStatus("There is no MOTD set."); + } + } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("Rehash") == 0) { + CString sRet; + + if (CZNC::Get().RehashConfig(sRet)) { + PutStatus("Rehashing succeeded!"); + } else { + PutStatus("Rehashing failed: " + sRet); + } + } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("SaveConfig") == 0) { + if (CZNC::Get().WriteConfig()) { + PutStatus("Wrote config to [" + CZNC::Get().GetConfigFile() + "]"); + } else { + PutStatus("Error while trying to write config."); + } + } else if (sCommand.CaseCmp("LISTCLIENTS") == 0) { + if (m_pUser) { + CUser* pUser = m_pUser; + CString sNick = sLine.Token(1); + + if (!sNick.empty()) { + if (!m_pUser->IsAdmin()) { + PutStatus("Usage: ListClients"); + return; + } + + pUser = CZNC::Get().FindUser(sNick); + + if (!pUser) { + PutStatus("No such user [" + sNick + "]"); + return; + } + } + + vector<CClient*>& vClients = pUser->GetClients(); + + if (vClients.empty()) { + PutStatus("No clients are connected"); + return; + } + + CTable Table; + Table.AddColumn("Host"); + + for (unsigned int a = 0; a < vClients.size(); a++) { + Table.AddRow(); + Table.SetCell("Host", vClients[a]->GetRemoteIP()); + } + + if (Table.size()) { + unsigned int uTableIdx = 0; + CString sTmp; + + while (Table.GetLine(uTableIdx++, sTmp)) { + PutStatus(sTmp); + } + } + } + } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("LISTUSERS") == 0) { + const map<CString, CUser*>& msUsers = CZNC::Get().GetUserMap(); + CTable Table; + Table.AddColumn("Username"); + Table.AddColumn("Clients"); + Table.AddColumn("OnIRC"); + Table.AddColumn("IRC Server"); + Table.AddColumn("IRC User"); + + for (map<CString, CUser*>::const_iterator it = msUsers.begin(); it != msUsers.end(); it++) { + Table.AddRow(); + Table.SetCell("Username", it->first); + Table.SetCell("Clients", CString(it->second->GetClients().size())); + if (!it->second->IsIRCConnected()) { + Table.SetCell("OnIRC", "No"); + } else { + Table.SetCell("OnIRC", "Yes"); + Table.SetCell("IRC Server", it->second->GetIRCServer()); + Table.SetCell("IRC User", it->second->GetIRCNick().GetNickMask()); + } + } + + if (Table.size()) { + unsigned int uTableIdx = 0; + CString sTmp; + + while (Table.GetLine(uTableIdx++, sTmp)) { + PutStatus(sTmp); + } + } + } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("SetMOTD") == 0) { + CString sMessage = sLine.Token(1, true); + + if (sMessage.empty()) { + PutStatus("Usage: SetMOTD <Message>"); + } else { + CZNC::Get().SetMotd(sMessage); + PutStatus("MOTD set to [" + sMessage + "]"); + } + } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("AddMOTD") == 0) { + CString sMessage = sLine.Token(1, true); + + if (sMessage.empty()) { + PutStatus("Usage: AddMOTD <Message>"); + } else { + CZNC::Get().AddMotd(sMessage); + PutStatus("Added [" + sMessage + "] to MOTD"); + } + } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("ClearMOTD") == 0) { + CZNC::Get().ClearMotd(); + PutStatus("Cleared MOTD"); + } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("BROADCAST") == 0) { + CZNC::Get().Broadcast(sLine.Token(1, true)); + } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("SHUTDOWN") == 0) { + CString sMessage = sLine.Token(1, true); + + if (sMessage.empty()) { + sMessage = "ZNC is being shutdown NOW!!"; + } + + CZNC::Get().Broadcast(sMessage); + usleep(100000); // Sleep for 10ms to attempt to allow the previous Broadcast() to go through to all users + + throw CException(CException::EX_Shutdown); + } else if (sCommand.CaseCmp("JUMP") == 0 || + sCommand.CaseCmp("CONNECT") == 0) { + if (m_pUser) { + if (!m_pUser->HasServers()) { + PutStatus("You don't have any servers added."); + return; + } + + if (m_pIRCSock) { + m_pIRCSock->Quit(); + PutStatus("Jumping to the next server in the list..."); + } else { + PutStatus("Connecting..."); + } + + m_pUser->SetIRCConnectEnabled(true); + m_pUser->CheckIRCConnect(); + return; + } + } else if (sCommand.CaseCmp("DISCONNECT") == 0) { + if (m_pUser) { + if (m_pIRCSock) + m_pIRCSock->Quit(); + m_pUser->SetIRCConnectEnabled(false); + PutStatus("Disconnected from IRC. Use 'connect' to reconnect."); + return; + } + } else if (sCommand.CaseCmp("ENABLECHAN") == 0) { + CString sChan = sLine.Token(1, true); + + if (sChan.empty()) { + PutStatus("Usage: EnableChan <channel>"); + } else { + CChan* pChan = m_pUser->FindChan(sChan); + if (!pChan) { + PutStatus("Channel [" + sChan + "] not found."); + return; + } + + pChan->Enable(); + PutStatus("Channel [" + sChan + "] enabled."); + } + } else if (sCommand.CaseCmp("LISTCHANS") == 0) { + if (m_pUser) { + const vector<CChan*>& vChans = m_pUser->GetChans(); + CIRCSock* pIRCSock = (!m_pUser) ? NULL : m_pUser->GetIRCSock(); + const CString& sPerms = (pIRCSock) ? pIRCSock->GetPerms() : ""; + + if (!vChans.size()) { + PutStatus("You have no channels defined"); + return; + } + + CTable Table; + Table.AddColumn("Name"); + Table.AddColumn("Status"); + Table.AddColumn("Conf"); + Table.AddColumn("Buf"); + Table.AddColumn("Modes"); + Table.AddColumn("Users"); + + for (unsigned int p = 0; p < sPerms.size(); p++) { + CString sPerm; + sPerm += sPerms[p]; + Table.AddColumn(sPerm); + } + + for (unsigned int a = 0; a < vChans.size(); a++) { + CChan* pChan = vChans[a]; + Table.AddRow(); + Table.SetCell("Name", pChan->GetPermStr() + pChan->GetName()); + Table.SetCell("Status", ((vChans[a]->IsOn()) ? ((vChans[a]->IsDetached()) ? "Detached" : "Joined") : ((vChans[a]->IsDisabled()) ? "Disabled" : "Trying"))); + Table.SetCell("Conf", CString((pChan->InConfig()) ? "yes" : "")); + Table.SetCell("Buf", CString((pChan->KeepBuffer()) ? "*" : "") + CString(pChan->GetBufferCount())); + Table.SetCell("Modes", pChan->GetModeString()); + Table.SetCell("Users", CString(pChan->GetNickCount())); + + for (unsigned int b = 0; b < sPerms.size(); b++) { + CString sPerm; + sPerm += sPerms[b]; + Table.SetCell(sPerm, CString(pChan->GetPermCount(sPerms[b]))); + } + } + + if (Table.size()) { + unsigned int uTableIdx = 0; + CString sTmp; + + while (Table.GetLine(uTableIdx++, sTmp)) { + PutStatus(sTmp); + } + } + } + } else if (sCommand.CaseCmp("ADDSERVER") == 0) { + CString sServer = sLine.Token(1); + + if (sServer.empty()) { + PutStatus("Usage: AddServer <host> [[+]port] [pass]"); + return; + } + + if (m_pUser->FindServer(sServer)) { + PutStatus("That server already exists"); + return; + } + + if (m_pUser && m_pUser->AddServer(sLine.Token(1, true))) { + PutStatus("Server added"); + } else { + PutStatus("Unable to add that server"); + } + } else if (sCommand.CaseCmp("REMSERVER") == 0 || sCommand.CaseCmp("DELSERVER") == 0) { + CString sServer = sLine.Token(1); + + if (sServer.empty()) { + PutStatus("Usage: RemServer <host>"); + return; + } + + const vector<CServer*>& vServers = m_pUser->GetServers(); + + if (vServers.size() <= 0) { + PutStatus("You don't have any servers added."); + return; + } + + if (m_pUser && m_pUser->DelServer(sServer)) { + PutStatus("Server removed"); + } else { + PutStatus("No such server"); + } + } else if (sCommand.CaseCmp("LISTSERVERS") == 0) { + if (m_pUser) { + if (m_pUser->HasServers()) { + const vector<CServer*>& vServers = m_pUser->GetServers(); + CTable Table; + Table.AddColumn("Host"); + Table.AddColumn("Port"); + Table.AddColumn("SSL"); + Table.AddColumn("Pass"); + + for (unsigned int a = 0; a < vServers.size(); a++) { + CServer* pServer = vServers[a]; + Table.AddRow(); + Table.SetCell("Host", pServer->GetName()); + Table.SetCell("Port", CString(pServer->GetPort())); + Table.SetCell("SSL", (pServer->IsSSL()) ? "SSL" : ""); + Table.SetCell("Pass", pServer->GetPass()); + } + + if (Table.size()) { + unsigned int uTableIdx = 0; + CString sTmp; + + while (Table.GetLine(uTableIdx++, sTmp)) { + PutStatus(sTmp); + } + } + } else { + PutStatus("You don't have any servers added."); + } + } + } else if (sCommand.CaseCmp("TOPICS") == 0) { + if (m_pUser) { + const vector<CChan*>& vChans = m_pUser->GetChans(); + CTable Table; + Table.AddColumn("Name"); + Table.AddColumn("Set By"); + Table.AddColumn("Topic"); + + for (unsigned int a = 0; a < vChans.size(); a++) { + CChan* pChan = vChans[a]; + Table.AddRow(); + Table.SetCell("Name", pChan->GetName()); + Table.SetCell("Set By", pChan->GetTopicOwner()); + Table.SetCell("Topic", pChan->GetTopic()); + } + + if (Table.size()) { + unsigned int uTableIdx = 0; + CString sTmp; + + while (Table.GetLine(uTableIdx++, sTmp)) { + PutStatus(sTmp); + } + } + } + } else if (sCommand.CaseCmp("SEND") == 0) { + CString sToNick = sLine.Token(1); + CString sFile = sLine.Token(2); + CString sAllowedPath = m_pUser->GetDLPath(); + CString sAbsolutePath; + + if ((sToNick.empty()) || (sFile.empty())) { + PutStatus("Usage: Send <nick> <file>"); + return; + } + + sAbsolutePath = CDir::ChangeDir(m_pUser->GetDLPath(), sFile, CZNC::Get().GetHomePath()); + + if (sAbsolutePath.Left(sAllowedPath.length()) != sAllowedPath) { + PutStatus("Illegal path."); + return; + } + + if (m_pUser) { + m_pUser->SendFile(sToNick, sFile); + } + } else if (sCommand.CaseCmp("GET") == 0) { + CString sFile = sLine.Token(1); + CString sAllowedPath = m_pUser->GetDLPath(); + CString sAbsolutePath; + + if (sFile.empty()) { + PutStatus("Usage: Get <file>"); + return; + } + + sAbsolutePath = CDir::ChangeDir(m_pUser->GetDLPath(), sFile, CZNC::Get().GetHomePath()); + + if (sAbsolutePath.Left(sAllowedPath.length()) != sAllowedPath) { + PutStatus("Illegal path."); + return; + } + + if (m_pUser) { + m_pUser->SendFile(GetNick(), sFile); + } + } else if (sCommand.CaseCmp("LISTDCCS") == 0) { + CSockManager& Manager = CZNC::Get().GetManager(); + + CTable Table; + Table.AddColumn("Type"); + Table.AddColumn("State"); + Table.AddColumn("Speed"); + Table.AddColumn("Nick"); + Table.AddColumn("IP"); + Table.AddColumn("File"); + + for (unsigned int a = 0; a < Manager.size(); a++) { + const CString& sSockName = Manager[a]->GetSockName(); + + if (strncasecmp(sSockName.c_str(), "DCC::", 5) == 0) { + if (strncasecmp(sSockName.c_str() +5, "XFER::REMOTE::", 14) == 0) { + continue; + } + + if (strncasecmp(sSockName.c_str() +5, "CHAT::REMOTE::", 14) == 0) { + continue; + } + + if (strncasecmp(sSockName.c_str() +5, "SEND", 4) == 0) { + CDCCSock* pSock = (CDCCSock*) Manager[a]; + + Table.AddRow(); + Table.SetCell("Type", "Sending"); + Table.SetCell("State", CString::ToPercent(pSock->GetProgress())); + Table.SetCell("Speed", CString((int)(pSock->GetAvgWrite() / 1024.0)) + " KiB/s"); + Table.SetCell("Nick", pSock->GetRemoteNick()); + Table.SetCell("IP", pSock->GetRemoteIP()); + Table.SetCell("File", pSock->GetFileName()); + } else if (strncasecmp(sSockName.c_str() +5, "GET", 3) == 0) { + CDCCSock* pSock = (CDCCSock*) Manager[a]; + + Table.AddRow(); + Table.SetCell("Type", "Getting"); + Table.SetCell("State", CString::ToPercent(pSock->GetProgress())); + Table.SetCell("Speed", CString((int)(pSock->GetAvgRead() / 1024.0)) + " KiB/s"); + Table.SetCell("Nick", pSock->GetRemoteNick()); + Table.SetCell("IP", pSock->GetRemoteIP()); + Table.SetCell("File", pSock->GetFileName()); + } else if (strncasecmp(sSockName.c_str() +5, "LISTEN", 6) == 0) { + CDCCSock* pSock = (CDCCSock*) Manager[a]; + + Table.AddRow(); + Table.SetCell("Type", "Sending"); + Table.SetCell("State", "Waiting"); + Table.SetCell("Nick", pSock->GetRemoteNick()); + Table.SetCell("IP", pSock->GetRemoteIP()); + Table.SetCell("File", pSock->GetFileName()); + } else if (strncasecmp(sSockName.c_str() +5, "XFER::LOCAL", 11) == 0) { + CDCCBounce* pSock = (CDCCBounce*) Manager[a]; + + CString sState = "Waiting"; + if ((pSock->IsConnected()) || (pSock->IsPeerConnected())) { + sState = "Halfway"; + if ((pSock->IsPeerConnected()) && (pSock->IsPeerConnected())) { + sState = "Connected"; + } + } + + Table.AddRow(); + Table.SetCell("Type", "Xfer"); + Table.SetCell("State", sState); + Table.SetCell("Nick", pSock->GetRemoteNick()); + Table.SetCell("IP", pSock->GetRemoteIP()); + Table.SetCell("File", pSock->GetFileName()); + } else if (strncasecmp(sSockName.c_str() +5, "CHAT::LOCAL", 11) == 0) { + CDCCBounce* pSock = (CDCCBounce*) Manager[a]; + + CString sState = "Waiting"; + if ((pSock->IsConnected()) || (pSock->IsPeerConnected())) { + sState = "Halfway"; + if ((pSock->IsPeerConnected()) && (pSock->IsPeerConnected())) { + sState = "Connected"; + } + } + + Table.AddRow(); + Table.SetCell("Type", "Chat"); + Table.SetCell("State", sState); + Table.SetCell("Nick", pSock->GetRemoteNick()); + Table.SetCell("IP", pSock->GetRemoteIP()); + } + } + } + + if (Table.size()) { + unsigned int uTableIdx = 0; + CString sTmp; + + while (Table.GetLine(uTableIdx++, sTmp)) { + PutStatus(sTmp); + } + } else { + PutStatus("You have no active DCCs."); + } + } else if ((sCommand.CaseCmp("LISTMODS") == 0) || (sCommand.CaseCmp("LISTMODULES") == 0)) { +#ifdef _MODULES + if (m_pUser->IsAdmin()) { + CModules& GModules = CZNC::Get().GetModules(); + + if (!GModules.size()) { + PutStatus("No global modules loaded."); + } else { + CTable GTable; + GTable.AddColumn("Name"); + GTable.AddColumn("Description"); + + for (unsigned int b = 0; b < GModules.size(); b++) { + GTable.AddRow(); + GTable.SetCell("Name", GModules[b]->GetModName()); + GTable.SetCell("Description", GModules[b]->GetDescription().Ellipsize(128)); + } + + unsigned int uTableIdx = 0; + CString sTmp; + + while (GTable.GetLine(uTableIdx++, sTmp)) { + PutStatus(sTmp); + } + } + } + + if (m_pUser) { + CModules& Modules = m_pUser->GetModules(); + + if (!Modules.size()) { + PutStatus("You have no modules loaded."); + return; + } + + CTable Table; + Table.AddColumn("Name"); + Table.AddColumn("Description"); + + for (unsigned int b = 0; b < Modules.size(); b++) { + Table.AddRow(); + Table.SetCell("Name", Modules[b]->GetModName()); + Table.SetCell("Description", Modules[b]->GetDescription().Ellipsize(128)); + } + + unsigned int uTableIdx = 0; + CString sTmp; + while (Table.GetLine(uTableIdx++, sTmp)) { + PutStatus(sTmp); + } + } +#else + PutStatus("Modules are not enabled."); +#endif + return; + } else if ((sCommand.CaseCmp("LISTAVAILMODS") == 0) || (sCommand.CaseCmp("LISTAVAILABLEMODULES") == 0)) { +#ifdef _MODULES + if (m_pUser->DenyLoadMod()) { + PutStatus("Access Denied."); + return; + } + + if (m_pUser->IsAdmin()) { + set<CModInfo> ssGlobalMods; + CZNC::Get().GetModules().GetAvailableMods(ssGlobalMods, true); + + if (!ssGlobalMods.size()) { + PutStatus("No global modules available."); + } else { + CTable GTable; + GTable.AddColumn("Name"); + GTable.AddColumn("Description"); + set<CModInfo>::iterator it; + + for (it = ssGlobalMods.begin(); it != ssGlobalMods.end(); it++) { + const CModInfo& Info = *it; + GTable.AddRow(); + GTable.SetCell("Name", (CZNC::Get().GetModules().FindModule(Info.GetName()) ? "*" : " ") + Info.GetName()); + GTable.SetCell("Description", Info.GetDescription().Ellipsize(128)); + } + + unsigned int uTableIdx = 0; + CString sTmp; + + while (GTable.GetLine(uTableIdx++, sTmp)) { + PutStatus(sTmp); + } + } + } + + if (m_pUser) { + set<CModInfo> ssUserMods; + CZNC::Get().GetModules().GetAvailableMods(ssUserMods); + + if (!ssUserMods.size()) { + PutStatus("No user modules available."); + return; + } + + CTable Table; + Table.AddColumn("Name"); + Table.AddColumn("Description"); + set<CModInfo>::iterator it; + + for (it = ssUserMods.begin(); it != ssUserMods.end(); it++) { + const CModInfo& Info = *it; + Table.AddRow(); + Table.SetCell("Name", (m_pUser->GetModules().FindModule(Info.GetName()) ? "*" : " ") + Info.GetName()); + Table.SetCell("Description", Info.GetDescription().Ellipsize(128)); + } + + unsigned int uTableIdx = 0; + CString sTmp; + while (Table.GetLine(uTableIdx++, sTmp)) { + PutStatus(sTmp); + } + } +#else + PutStatus("Modules are not enabled."); +#endif + return; + } else if ((sCommand.CaseCmp("LOADMOD") == 0) || (sCommand.CaseCmp("LOADMODULE") == 0)) { + CString sMod; + CString sArgs; + bool bGlobal = false; + + if (sLine.Token(1).CaseCmp("-global") == 0) { + sMod = sLine.Token(2); + + if (!m_pUser->IsAdmin()) { + PutStatus("Unable to load global module [" + sMod + "] Access Denied."); + return; + } + + sArgs = sLine.Token(3, true); + bGlobal = true; + } else { + sMod = sLine.Token(1); + sArgs = sLine.Token(2, true); + } + + if (m_pUser->DenyLoadMod()) { + PutStatus("Unable to load [" + sMod + "] Access Denied."); + return; + } +#ifdef _MODULES + if (sMod.empty()) { + PutStatus("Usage: LoadMod [-global] <module> [args]"); + return; + } + + CString sModRet; + bool b; + + if (bGlobal) { + b = CZNC::Get().GetModules().LoadModule(sMod, sArgs, NULL, sModRet); + } else { + b = m_pUser->GetModules().LoadModule(sMod, sArgs, m_pUser, sModRet); + } + if (!b) { + PutStatus("Unable to load module [" + sMod + "] [" + sModRet + "]"); + return; + } + + PutStatus(sModRet); +#else + PutStatus("Unable to load [" + sMod + "] Modules are not enabled."); +#endif + return; + } else if ((sCommand.CaseCmp("UNLOADMOD") == 0) || (sCommand.CaseCmp("UNLOADMODULE") == 0)) { + CString sMod; + bool bGlobal = false; + + if (sLine.Token(1).CaseCmp("-global") == 0) { + sMod = sLine.Token(2); + + if (!m_pUser->IsAdmin()) { + PutStatus("Unable to unload global module [" + sMod + "] Access Denied."); + return; + } + + bGlobal = true; + } else + sMod = sLine.Token(1); + + if (m_pUser->DenyLoadMod()) { + PutStatus("Unable to unload [" + sMod + "] Access Denied."); + return; + } +#ifdef _MODULES + if (sMod.empty()) { + PutStatus("Usage: UnloadMod [-global] <module>"); + return; + } + + CString sModRet; + + if (bGlobal) { + CZNC::Get().GetModules().UnloadModule(sMod, sModRet); + } else { + m_pUser->GetModules().UnloadModule(sMod, sModRet); + } + + PutStatus(sModRet); +#else + PutStatus("Unable to unload [" + sMod + "] Modules are not enabled."); +#endif + return; + } else if ((sCommand.CaseCmp("RELOADMOD") == 0) || (sCommand.CaseCmp("RELOADMODULE") == 0)) { + CString sMod; + CString sArgs; + bool bGlobal = false; + + if (sLine.Token(1).CaseCmp("-global") == 0) { + sMod = sLine.Token(2); + + if (!m_pUser->IsAdmin()) { + PutStatus("Unable to reload global module [" + sMod + "] Access Denied."); + return; + } + + sArgs = sLine.Token(3, true); + bGlobal = true; + } else { + sMod = sLine.Token(1); + sArgs = sLine.Token(2, true); + } + + if (m_pUser->DenyLoadMod()) { + PutStatus("Unable to reload [" + sMod + "] Access Denied."); + return; + } +#ifdef _MODULES + if (sMod.empty()) { + PutStatus("Usage: ReloadMod [-global] <module> [args]"); + return; + } + + CString sModRet; + + if (bGlobal) { + CZNC::Get().GetModules().ReloadModule(sMod, sArgs, NULL, sModRet); + } else { + m_pUser->GetModules().ReloadModule(sMod, sArgs, m_pUser, sModRet); + } + + PutStatus(sModRet); +#else + PutStatus("Unable to unload [" + sMod + "] Modules are not enabled."); +#endif + return; + } else if (sCommand.CaseCmp("SETVHOST") == 0 && (m_pUser->IsAdmin() || !m_pUser->DenySetVHost())) { + CString sVHost = sLine.Token(1); + + if (sVHost.empty()) { + PutStatus("Usage: SetVHost <VHost>"); + return; + } + + m_pUser->SetVHost(sVHost); + PutStatus("Set VHost to [" + m_pUser->GetVHost() + "]"); + } else if (sCommand.CaseCmp("CLEARVHOST") == 0 && (m_pUser->IsAdmin() || !m_pUser->DenySetVHost())) { + m_pUser->SetVHost(""); + PutStatus("VHost Cleared"); + } else if (sCommand.CaseCmp("PLAYBUFFER") == 0) { + CString sChan = sLine.Token(1); + + if (sChan.empty()) { + PutStatus("Usage: PlayBuffer <#chan>"); + return; + } + + CChan* pChan = m_pUser->FindChan(sChan); + + if (!pChan) { + PutStatus("You are not on [" + sChan + "]"); + return; + } + + if (!pChan->IsOn()) { + PutStatus("You are not on [" + sChan + "] [trying]"); + return; + } + + if (pChan->GetBuffer().empty()) { + PutStatus("The buffer for [" + sChan + "] is empty"); + return; + } + + pChan->SendBuffer(this); + } else if (sCommand.CaseCmp("CLEARBUFFER") == 0) { + CString sChan = sLine.Token(1); + + if (sChan.empty()) { + PutStatus("Usage: ClearBuffer <#chan>"); + return; + } + + CChan* pChan = m_pUser->FindChan(sChan); + + if (!pChan) { + PutStatus("You are not on [" + sChan + "]"); + return; + } + + if (!pChan->IsOn()) { + PutStatus("You are not on [" + sChan + "] [trying]"); + return; + } + + pChan->ClearBuffer(); + PutStatus("The buffer for [" + sChan + "] has been cleared"); + } else if (sCommand.CaseCmp("CLEARALLCHANNELBUFFERS") == 0) { + vector<CChan*>::const_iterator it; + const vector<CChan*>& vChans = m_pUser->GetChans(); + + for (it = vChans.begin(); it != vChans.end(); it++) { + (*it)->ClearBuffer(); + } + PutStatus("All channel buffers have been cleared"); + } else if (sCommand.CaseCmp("SETBUFFER") == 0) { + CString sChan = sLine.Token(1); + + if (sChan.empty()) { + PutStatus("Usage: SetBuffer <#chan> [linecount]"); + return; + } + + CChan* pChan = m_pUser->FindChan(sChan); + + if (!pChan) { + PutStatus("You are not on [" + sChan + "]"); + return; + } + + if (!pChan->IsOn()) { + PutStatus("You are not on [" + sChan + "] [trying]"); + return; + } + + unsigned int uLineCount = strtoul(sLine.Token(2).c_str(), NULL, 10); + + if (uLineCount > 500) { + PutStatus("Max linecount is 500."); + return; + } + + pChan->SetBufferCount(uLineCount); + + PutStatus("BufferCount for [" + sChan + "] set to [" + CString(pChan->GetBufferCount()) + "]"); + } else if (m_pUser->IsAdmin() && sC... [truncated message content] |
From: <ps...@us...> - 2008-07-24 11:34:03
|
Revision: 1151 http://znc.svn.sourceforge.net/znc/?rev=1151&view=rev Author: psychon Date: 2008-07-24 11:34:11 +0000 (Thu, 24 Jul 2008) Log Message: ----------- Remove KeepNick Modified Paths: -------------- trunk/Client.cpp trunk/Client.h trunk/IRCSock.cpp trunk/IRCSock.h trunk/Timers.h trunk/User.cpp trunk/User.h trunk/modules/awaynick.cpp trunk/modules/webadmin.cpp trunk/znc.conf trunk/znc.cpp Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2008-07-24 10:38:24 UTC (rev 1150) +++ trunk/Client.cpp 2008-07-24 11:34:11 UTC (rev 1151) @@ -84,26 +84,9 @@ } if (!m_pIRCSock) { - // No need to check against IRC nick or to forward it + // No need to forward it return; } - - if ((m_pUser) && (sNick.CaseCmp(m_pUser->GetNick()) == 0)) { - m_uKeepNickCounter++; - // If the user is changing his nick to the conifg nick, set keepnick to the config value - if (m_pUser->GetKeepNick() && !m_pIRCSock->GetKeepNick()) { - m_pIRCSock->SetKeepNick(true); - PutStatusNotice("Reset KeepNick back to true"); - } - } - - if (m_pUser && GetNick().CaseCmp(m_pUser->GetNick()) == 0) { - // If the user changes his nick away from the config nick, we shut off keepnick for this session - if (m_pUser->GetKeepNick()) { - m_pIRCSock->SetKeepNick(false); - PutStatusNotice("Set KeepNick to false"); - } - } } else if (sCommand.CaseCmp("USER") == 0) { if (!IsAttached()) { if (m_sUser.empty()) { @@ -593,24 +576,9 @@ } void CClient::SetNick(const CString& s) { - m_sNick = s; - - if (m_pUser) { - if (m_sNick.CaseCmp(m_pUser->GetNick()) == 0) { - m_uKeepNickCounter = 0; - } - } + m_sNick = s; } -bool CClient::DecKeepNickCounter() { - if (!m_uKeepNickCounter) { - return false; - } - - m_uKeepNickCounter--; - return true; -} - void CClient::StatusCTCP(const CString& sLine) { CString sCommand = sLine.Token(0); Modified: trunk/Client.h =================================================================== --- trunk/Client.h 2008-07-24 10:38:24 UTC (rev 1150) +++ trunk/Client.h 2008-07-24 11:34:11 UTC (rev 1151) @@ -84,7 +84,6 @@ m_bGotUser = false; m_bNamesx = false; m_bUHNames = false; - m_uKeepNickCounter = 0; EnableReadLine(); } @@ -98,7 +97,6 @@ bool HasNamesx() const { return m_bNamesx; } bool HasUHNames() const { return m_bUHNames; } - bool DecKeepNickCounter(); void UserCommand(const CString& sCommand); void StatusCTCP(const CString& sCommand); void IRCConnected(CIRCSock* pIRCSock); @@ -138,7 +136,6 @@ CString m_sPass; CString m_sUser; CIRCSock* m_pIRCSock; - unsigned int m_uKeepNickCounter; CSmartPtr<CAuthBase> m_spAuth; CClientTimeout* m_pTimeout; }; Modified: trunk/IRCSock.cpp =================================================================== --- trunk/IRCSock.cpp 2008-07-24 10:38:24 UTC (rev 1150) +++ trunk/IRCSock.cpp 2008-07-24 11:34:11 UTC (rev 1151) @@ -16,9 +16,7 @@ CIRCSock::CIRCSock(CUser* pUser) : Csock() { m_pUser = pUser; m_bISpoofReleased = false; - m_bKeepNick = true; m_bAuthed = false; - m_bOrigNickPending = false; m_bNamesx = false; m_bUHNames = false; EnableReadLine(); @@ -181,22 +179,6 @@ if (sNick == "*") { SendAltNick(sBadNick); return; - } else { - // :irc.server.net 433 mynick badnick :Nickname is already in use. - if ((m_bKeepNick) && (m_pUser->GetKeepNick())) { - if (sBadNick.CaseCmp(sConfNick) == 0) { - vector<CClient*>& vClients = m_pUser->GetClients(); - - for (unsigned int a = 0; a < vClients.size(); a++) { - CClient* pClient = vClients[a]; - - if (!pClient || !pClient->DecKeepNickCounter()) { - SetOrigNickPending(false); - return; - } - } - } - } } break; } @@ -369,8 +351,6 @@ // We are changing our own nick, the clients always must see this! bIsVisible = true; SetNick(sNewNick); - } else if (Nick.GetNick().CaseCmp(m_pUser->GetNick()) == 0) { - KeepNick(true); } MODULECALL(OnNick(Nick, sNewNick, vFoundChans), m_pUser, NULL, ); @@ -407,10 +387,6 @@ } } - if (Nick.GetNick().CaseCmp(m_pUser->GetNick()) == 0) { - KeepNick(true); - } - MODULECALL(OnQuit(Nick, sMessage, vFoundChans), m_pUser, NULL, ); if (!bIsVisible) { @@ -649,15 +625,6 @@ m_pUser->PutUser(sLine); } -void CIRCSock::KeepNick(bool bForce) { - const CString& sConfNick = m_pUser->GetNick(); - - if (m_bAuthed && m_bKeepNick && (!IsOrigNickPending() || bForce) && m_pUser->GetKeepNick() && GetNick().CaseCmp(sConfNick) != 0) { - PutIRC("NICK " + sConfNick); - SetOrigNickPending(true); - } -} - bool CIRCSock::OnCTCPReply(CNick& Nick, CString& sMessage) { MODULECALL(OnCTCPReply(Nick, sMessage), m_pUser, NULL, return true); Modified: trunk/IRCSock.h =================================================================== --- trunk/IRCSock.h 2008-07-24 10:38:24 UTC (rev 1150) +++ trunk/IRCSock.h 2008-07-24 11:34:11 UTC (rev 1151) @@ -47,19 +47,15 @@ virtual void SockError(int iErrno); virtual void Timeout(); - void KeepNick(bool bForce = false); void PutIRC(const CString& sLine); void ResetChans(); void Quit(); // Setters void SetPass(const CString& s) { m_sPass = s; } - void SetKeepNick(bool b) { m_bKeepNick = b; } - void SetOrigNickPending(bool b) { m_bOrigNickPending = b; } // !Setters // Getters - bool GetKeepNick() const { return m_bKeepNick; } unsigned int GetMaxNickLen() const { return m_uMaxNickLen; } EChanModeArgs GetModeType(unsigned char uMode) const; unsigned char GetPermFromMode(unsigned char uMode) const; @@ -71,7 +67,6 @@ CString GetNickMask() const { return m_Nick.GetNickMask(); } const CString& GetNick() const { return m_Nick.GetNick(); } const CString& GetPass() const { return m_sPass; } - bool IsOrigNickPending() const { return m_bOrigNickPending; } CUser* GetUser() const { return m_pUser; } bool HasNamesx() const { return m_bNamesx; } bool HasUHNames() const { return m_bUHNames; } @@ -88,8 +83,6 @@ protected: bool m_bISpoofReleased; bool m_bAuthed; - bool m_bKeepNick; - bool m_bOrigNickPending; bool m_bNamesx; bool m_bUHNames; CString m_sPerms; Modified: trunk/Timers.h =================================================================== --- trunk/Timers.h 2008-07-24 10:38:24 UTC (rev 1150) +++ trunk/Timers.h 2008-07-24 11:34:11 UTC (rev 1151) @@ -13,35 +13,6 @@ #include "IRCSock.h" #include "User.h" -class CKeepNickTimer : public CCron { -public: - CKeepNickTimer(CUser* pUser) : CCron() { - m_pUser = pUser; - m_uTrys = 0; - SetName("CKeepNickTimer::" + m_pUser->GetUserName()); - Start(5); - } - virtual ~CKeepNickTimer() {} - -private: -protected: - virtual void RunJob() { - CIRCSock* pSock = m_pUser->GetIRCSock(); - - if (pSock) { - if (m_uTrys++ >= 40) { - pSock->SetOrigNickPending(false); - m_uTrys = 0; - } - - pSock->KeepNick(); - } - } - - CUser* m_pUser; - unsigned int m_uTrys; -}; - class CMiscTimer : public CCron { public: CMiscTimer(CUser* pUser) : CCron() { Modified: trunk/User.cpp =================================================================== --- trunk/User.cpp 2008-07-24 10:38:24 UTC (rev 1150) +++ trunk/User.cpp 2008-07-24 11:34:11 UTC (rev 1151) @@ -34,7 +34,6 @@ m_bBounceDCCs = true; m_bPassHashed = false; m_bUseClientIP = false; - m_bKeepNick = false; m_bDenyLoadMod = false; m_bAdmin= false; m_bDenySetVHost= false; @@ -49,10 +48,8 @@ m_bAppendTimestamp = false; m_bPrependTimestamp = true; m_bIRCConnectEnabled = true; - m_pKeepNickTimer = new CKeepNickTimer(this); m_pJoinTimer = new CJoinTimer(this); m_pMiscTimer = new CMiscTimer(this); - CZNC::Get().GetManager().AddCron(m_pKeepNickTimer); CZNC::Get().GetManager().AddCron(m_pJoinTimer); CZNC::Get().GetManager().AddCron(m_pMiscTimer); m_sUserPath = CZNC::Get().GetUserPath() + "/" + sUserName; @@ -72,7 +69,6 @@ delete m_vChans[b]; } - CZNC::Get().GetManager().DelCronByAddr(m_pKeepNickTimer); CZNC::Get().GetManager().DelCronByAddr(m_pJoinTimer); CZNC::Get().GetManager().DelCronByAddr(m_pMiscTimer); } @@ -424,7 +420,6 @@ // Flags SetKeepBuffer(User.KeepBuffer()); SetAutoCycle(User.AutoCycle()); - SetKeepNick(User.GetKeepNick()); SetMultiClients(User.MultiClients()); SetBounceDCCs(User.BounceDCCs()); SetUseClientIP(User.UseClientIP()); @@ -579,7 +574,6 @@ PrintLine(File, "StatusPrefix", GetStatusPrefix()); PrintLine(File, "ChanModes", GetDefaultChanModes()); PrintLine(File, "Buffer", CString(GetBufferCount())); - PrintLine(File, "KeepNick", CString((GetKeepNick()) ? "true" : "false")); PrintLine(File, "KeepBuffer", CString((KeepBuffer()) ? "true" : "false")); PrintLine(File, "MultiClients", CString((MultiClients()) ? "true" : "false")); PrintLine(File, "BounceDCCs", CString((BounceDCCs()) ? "true" : "false")); @@ -1028,7 +1022,6 @@ void CUser::SetMultiClients(bool b) { m_bMultiClients = b; } void CUser::SetBounceDCCs(bool b) { m_bBounceDCCs = b; } void CUser::SetUseClientIP(bool b) { m_bUseClientIP = b; } -void CUser::SetKeepNick(bool b) { m_bKeepNick = b; } void CUser::SetDenyLoadMod(bool b) { m_bDenyLoadMod = b; } void CUser::SetAdmin(bool b) { m_bAdmin = b; } void CUser::SetDenySetVHost(bool b) { m_bDenySetVHost = b; } @@ -1100,7 +1093,6 @@ } bool CUser::UseClientIP() const { return m_bUseClientIP; } -bool CUser::GetKeepNick() const { return m_bKeepNick; } bool CUser::DenyLoadMod() const { return m_bDenyLoadMod; } bool CUser::IsAdmin() const { return m_bAdmin; } bool CUser::DenySetVHost() const { return m_bDenySetVHost; } Modified: trunk/User.h =================================================================== --- trunk/User.h 2008-07-24 10:38:24 UTC (rev 1150) +++ trunk/User.h 2008-07-24 11:34:11 UTC (rev 1151) @@ -26,7 +26,6 @@ class CClient; class CIRCSock; class CJoinTimer; -class CKeepNickTimer; class CMiscTimer; class CServer; @@ -123,7 +122,6 @@ void SetBounceDCCs(bool b); void SetMultiClients(bool b); void SetUseClientIP(bool b); - void SetKeepNick(bool b); void SetDenyLoadMod(bool b); void SetAdmin(bool b); void SetDenySetVHost(bool b); @@ -173,7 +171,6 @@ const CString& GetDLPath() const { if (!CFile::Exists(m_sDLPath)) { CDir::MakeDir(m_sDLPath); } return m_sDLPath; } bool UseClientIP() const; - bool GetKeepNick() const; bool DenyLoadMod() const; bool IsAdmin() const; bool DenySetVHost() const; @@ -231,7 +228,6 @@ bool m_bBounceDCCs; bool m_bPassHashed; bool m_bUseClientIP; - bool m_bKeepNick; bool m_bDenyLoadMod; bool m_bAdmin; bool m_bDenySetVHost; @@ -243,7 +239,6 @@ bool m_bIRCConnectEnabled; CIRCSock* m_pIRCSock; - CKeepNickTimer* m_pKeepNickTimer; CJoinTimer* m_pJoinTimer; CMiscTimer* m_pMiscTimer; Modified: trunk/modules/awaynick.cpp =================================================================== --- trunk/modules/awaynick.cpp 2008-07-24 10:38:24 UTC (rev 1150) +++ trunk/modules/awaynick.cpp 2008-07-24 11:34:11 UTC (rev 1151) @@ -59,14 +59,6 @@ SetNV("nick", m_sFormat); - if (m_pUser->GetKeepNick()) { - sMessage = "KeepNick disabled"; - PutModule("You have KeepNick enabled. " - "This won't work together with awaynick."); - PutModule("Disabling KeepNick for you..."); - m_pUser->SetKeepNick(false); - } - return true; } @@ -103,11 +95,6 @@ } virtual void OnUserAttached() { - if (m_pUser->GetKeepNick()) { - PutModule("WARNING: You have KeepNick enabled. " - "This won't work with awaynick."); - } - StartBackNickTimer(); } Modified: trunk/modules/webadmin.cpp =================================================================== --- trunk/modules/webadmin.cpp 2008-07-24 10:38:24 UTC (rev 1150) +++ trunk/modules/webadmin.cpp 2008-07-24 11:34:11 UTC (rev 1151) @@ -893,11 +893,6 @@ o2["DisplayName"] = "Auto Cycle"; if (!pUser || pUser->AutoCycle()) { o2["Checked"] = "true"; } - CTemplate& o3 = m_Template.AddRow("OptionLoop"); - o3["Name"] = "keepnick"; - o3["DisplayName"] = "Keep Nick"; - if (!pUser || pUser->GetKeepNick()) { o3["Checked"] = "true"; } - CTemplate& o4 = m_Template.AddRow("OptionLoop"); o4["Name"] = "multiclients"; o4["DisplayName"] = "Multi Clients"; @@ -1115,7 +1110,6 @@ pNewUser->SetMultiClients(GetParam("multiclients").ToBool()); pNewUser->SetBounceDCCs(GetParam("bouncedccs").ToBool()); pNewUser->SetAutoCycle(GetParam("autocycle").ToBool()); - pNewUser->SetKeepNick(GetParam("keepnick").ToBool()); pNewUser->SetUseClientIP(GetParam("useclientip").ToBool()); pNewUser->SetTimestampAppend(GetParam("appendtimestamp").ToBool()); pNewUser->SetTimestampPrepend(GetParam("prependtimestamp").ToBool()); Modified: trunk/znc.conf =================================================================== --- trunk/znc.conf 2008-07-24 10:38:24 UTC (rev 1150) +++ trunk/znc.conf 2008-07-24 11:34:11 UTC (rev 1151) @@ -50,7 +50,6 @@ QuitMsg = ZNC by prozac - http://znc.sourceforge.net CTCPReply = VERSION ZNC by prozac - http://znc.sourceforge.net ChanModes = +stn - KeepNick = true // You may use multiple Allow lines to restrict access to this user. All connections are denied by default unless they match an ip below. // Note: IPs only! Modified: trunk/znc.cpp =================================================================== --- trunk/znc.cpp 2008-07-24 10:38:24 UTC (rev 1150) +++ trunk/znc.cpp 2008-07-24 11:34:11 UTC (rev 1151) @@ -691,12 +691,6 @@ } // todo: Possibly add motd - if (CUtils::GetBoolInput("Would you like ZNC to keep trying for your primary nick?", false)) { - vsLines.push_back("\tKeepNick = true"); - } else { - vsLines.push_back("\tKeepNick = false"); - } - unsigned int uBufferCount = 0; CUtils::GetNumInput("Number of lines to buffer per channel", uBufferCount, 0, ~0, 50); @@ -1229,7 +1223,9 @@ pUser->SetRealName(sValue); continue; } else if (sName.CaseCmp("KeepNick") == 0) { - pUser->SetKeepNick((sValue.CaseCmp("true") == 0)); + if (sValue.CaseCmp("true") == 0) { + CUtils::PrintError("WARNING: KeepNick has been deprecated, instead try -> LoadModule = keepnick"); + } continue; } else if (sName.CaseCmp("ChanModes") == 0) { pUser->SetDefaultChanModes(sValue); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-08-18 11:10:21
|
Revision: 1159 http://znc.svn.sourceforge.net/znc/?rev=1159&view=rev Author: psychon Date: 2008-08-18 11:10:27 +0000 (Mon, 18 Aug 2008) Log Message: ----------- Update to latest Csocket Modified Paths: -------------- trunk/Csocket.cpp trunk/Csocket.h Modified: trunk/Csocket.cpp =================================================================== --- trunk/Csocket.cpp 2008-08-17 18:46:43 UTC (rev 1158) +++ trunk/Csocket.cpp 2008-08-18 11:10:27 UTC (rev 1159) @@ -28,7 +28,7 @@ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * -* $Revision: 1.80 $ +* $Revision: 1.82 $ */ #include "Csocket.h" @@ -388,6 +388,7 @@ m_iTime = 0; m_iTimeSequence = 60; m_bPause = false; + m_bRunOnNextCall = false; } void CCron::run( time_t & iNow ) @@ -398,8 +399,9 @@ if( iNow == 0 ) iNow = time( NULL ); - if ( ( m_bActive ) && ( iNow >= m_iTime ) ) + if ( ( m_bActive ) && ( iNow >= m_iTime || m_bRunOnNextCall ) ) { + m_bRunOnNextCall = false; // Setting this here because RunJob() could set it back to true RunJob(); if ( ( m_iMaxCycles > 0 ) && ( ++m_iCycles >= m_iMaxCycles ) ) Modified: trunk/Csocket.h =================================================================== --- trunk/Csocket.h 2008-08-17 18:46:43 UTC (rev 1158) +++ trunk/Csocket.h 2008-08-18 11:10:27 UTC (rev 1159) @@ -28,7 +28,7 @@ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * -* $Revision: 1.191 $ +* $Revision: 1.195 $ */ // note to compile with win32 need to link to winsock2, using gcc its -lws2_32 @@ -375,6 +375,9 @@ //! this is the method you should override virtual void RunJob(); +protected: + bool m_bRunOnNextCall; //!< if set to true, RunJob() gets called on next invocation of run() despite the timeout + private: time_t m_iTime; bool m_bActive, m_bPause; @@ -1589,9 +1592,11 @@ //! returns a pointer to the FIRST sock found by name or NULL on no match virtual T * FindSockByName( const CS_STRING & sName ) { - for( unsigned int i = 0; i < this->size(); i++ ) - if ( (*this)[i]->GetSockName() == sName ) - return( (*this)[i] ); + typename std::vector<T *>::iterator it; + typename std::vector<T *>::iterator it_end = this->end(); + for( it = this->begin(); it != it_end; it++ ) + if ( (*it)->GetSockName() == sName ) + return( *it ); return( NULL ); } @@ -2062,6 +2067,14 @@ } else CS_Delete( NewpcSock ); } +#ifdef _WIN32 + else if( GetSockError() != WSAEWOULDBLOCK ) +#else /* _WIN32 */ + else if( GetSockError() != EAGAIN ) +#endif /* _WIN32 */ + { + pcSock->SockError( GetSockError() ); + } } } } @@ -2071,15 +2084,21 @@ { time_t iNextRunTime = iNow + iMaxResolution; time_t iMinTimeout = iMaxResolution; - for( u_long a = 0; a < this->size() && iMinTimeout; a++ ) + typename std::vector<T *>::const_iterator it; + // This is safe, because we don't modify the vector. + typename std::vector<T *>::const_iterator it_end = this->end(); + + for (it = this->begin(); it != it_end; it++) { - if( (*this)[a]->GetConState() != T::CST_OK ) + T* pSock = *it; + + if( pSock->GetConState() != T::CST_OK ) iMinTimeout = 0; // this is in a nebulous state, need to let it proceed like normal - time_t iTimeoutInSeconds = (*this)[a]->GetTimeout(); + time_t iTimeoutInSeconds = pSock->GetTimeout(); if( iTimeoutInSeconds > 0 ) { - time_t iLastTimeData = (*this)[a]->GetLastCheckTimeout(); + time_t iLastTimeData = pSock->GetLastCheckTimeout(); time_t iDiff = iNow - iLastTimeData; if( iDiff > iTimeoutInSeconds ) iTimeoutInSeconds = 0; @@ -2089,12 +2108,16 @@ iMinTimeout = std::min( iMinTimeout, iTimeoutInSeconds ); } - const std::vector<CCron *> & vCrons = (*this)[a]->GetCrons(); - for( u_long b = 0; b < vCrons.size(); b++ ) - iNextRunTime = std::min( iNextRunTime, vCrons[b]->GetNextRun() ); + const std::vector<CCron *> & vCrons = pSock->GetCrons(); + std::vector<CCron *>::const_iterator cit; + std::vector<CCron *>::const_iterator cit_end = vCrons.end(); + for (cit = vCrons.begin(); cit != cit_end; it++) + iNextRunTime = std::min( iNextRunTime, (*cit)->GetNextRun() ); } - for( u_long a = 0; a < m_vcCrons.size(); a++ ) - iNextRunTime = std::min( iNextRunTime, m_vcCrons[a]->GetNextRun() ); + std::vector<CCron *>::const_iterator cit; + std::vector<CCron *>::const_iterator cit_end = m_vcCrons.end(); + for (cit = m_vcCrons.begin(); cit != cit_end; cit++) + iNextRunTime = std::min( iNextRunTime, (*cit)->GetNextRun() ); if( iNextRunTime < iNow ) return( 0 ); // smallest unit possible This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-08-20 08:13:13
|
Revision: 1160 http://znc.svn.sourceforge.net/znc/?rev=1160&view=rev Author: psychon Date: 2008-08-20 08:13:23 +0000 (Wed, 20 Aug 2008) Log Message: ----------- Some cleanup and optimizations to CTable CTable now caches the width of each column instead of recalculating it each time it is needed. The code for this was there before, but it was not used. Now the widths are calculated when the table is filled, not when the width is needed the first time. This caching leads to a huge speedup (3-4 times faster) if there are many rows in the table. This also cleans up the interface by making it possible to mark GetColumnWidth and GetLine as const. Modified Paths: -------------- trunk/Utils.cpp trunk/Utils.h Modified: trunk/Utils.cpp =================================================================== --- trunk/Utils.cpp 2008-08-18 11:10:27 UTC (rev 1159) +++ trunk/Utils.cpp 2008-08-20 08:13:23 UTC (rev 1160) @@ -396,15 +396,6 @@ fflush(stdout); } -CTable::CTable() {} -CTable::~CTable() { - for (unsigned int a = 0; a < size(); a++) { - delete (*this)[a]; - } - - clear(); -} - bool CTable::AddColumn(const CString& sName) { for (unsigned int a = 0; a < m_vsHeaders.size(); a++) { if (m_vsHeaders[a].CaseCmp(sName) == 0) { @@ -413,11 +404,13 @@ } m_vsHeaders.push_back(sName); + m_msuWidths[sName] = sName.size(); + return true; } unsigned int CTable::AddRow() { - push_back(new map<CString, CString>); + push_back(map<CString, CString>()); return size() -1; } @@ -430,11 +423,15 @@ uRowIdx = size() -1; } - (*(*this)[uRowIdx])[sColumn] = sValue; + (*this)[uRowIdx][sColumn] = sValue; + + if (m_msuWidths[sColumn] < sValue.size()) + m_msuWidths[sColumn] = sValue.size(); + return true; } -bool CTable::GetLine(unsigned int uIdx, CString& sLine) { +bool CTable::GetLine(unsigned int uIdx, CString& sLine) const { stringstream ssRet; if (!size()) { @@ -442,7 +439,6 @@ } if (uIdx == 1) { - m_msuWidths.clear(); // Clear out the width cache ssRet.fill(' '); ssRet << "| "; @@ -470,13 +466,13 @@ uIdx -= 3; if (uIdx < size()) { - map<CString, CString>* pRow = (*this)[uIdx]; + const map<CString, CString>& mRow = (*this)[uIdx]; ssRet.fill(' '); ssRet << "| "; for (unsigned int c = 0; c < m_vsHeaders.size(); c++) { ssRet.width(GetColumnWidth(c)); - ssRet << std::left << (*pRow)[m_vsHeaders[c]]; + ssRet << std::left << mRow.at(m_vsHeaders[c]); ssRet << ((c == m_vsHeaders.size() -1) ? " |" : " | "); } @@ -515,29 +511,19 @@ } */ -unsigned int CTable::GetColumnWidth(unsigned int uIdx) { +unsigned int CTable::GetColumnWidth(unsigned int uIdx) const { if (uIdx >= m_vsHeaders.size()) { return 0; } const CString& sColName = m_vsHeaders[uIdx]; - unsigned int uRet = sColName.size(); - map<CString, unsigned int>::iterator it = m_msuWidths.find(sColName); + map<CString, unsigned int>::const_iterator it = m_msuWidths.find(sColName); - if (it != m_msuWidths.end()) { - return it->second; + if (it == m_msuWidths.end()) { + // AddColumn() and SetCell() should make sure that we get a value :/ + return 0; } - - for (unsigned int a = 0; a < size(); a++) { - map<CString, CString>* pRow = (*this)[a]; - unsigned int uTmp = (*pRow)[m_vsHeaders[uIdx]].size(); - - if (uTmp > uRet) { - uRet = uTmp; - } - } - - return uRet; + return it->second; } Modified: trunk/Utils.h =================================================================== --- trunk/Utils.h 2008-08-18 11:10:27 UTC (rev 1159) +++ trunk/Utils.h 2008-08-20 08:13:23 UTC (rev 1160) @@ -198,17 +198,17 @@ }; -class CTable : public vector<map<CString, CString>* > { +class CTable : public vector<map<CString, CString> > { public: - CTable(); - virtual ~CTable(); + CTable() {} + virtual ~CTable() {} bool AddColumn(const CString& sName); unsigned int AddRow(); bool SetCell(const CString& sColumn, const CString& sValue, unsigned int uRowIdx = ~0); - bool GetLine(unsigned int uIdx, CString& sLine); + bool GetLine(unsigned int uIdx, CString& sLine) const; - unsigned int GetColumnWidth(unsigned int uIdx); + unsigned int GetColumnWidth(unsigned int uIdx) const; private: protected: vector<CString> m_vsHeaders; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-08-23 13:24:19
|
Revision: 1163 http://znc.svn.sourceforge.net/znc/?rev=1163&view=rev Author: psychon Date: 2008-08-23 13:24:28 +0000 (Sat, 23 Aug 2008) Log Message: ----------- Fix FTBFS with CTable on g++ 3 g++ 3 doesnt like map<>.at(). This changes how CTable stores its data internally. This *might* be faster than the older system. Thanks to kroimon for finding this. Modified Paths: -------------- trunk/Utils.cpp trunk/Utils.h Modified: trunk/Utils.cpp =================================================================== --- trunk/Utils.cpp 2008-08-22 12:48:56 UTC (rev 1162) +++ trunk/Utils.cpp 2008-08-23 13:24:28 UTC (rev 1163) @@ -410,7 +410,8 @@ } unsigned int CTable::AddRow() { - push_back(map<CString, CString>()); + // Add a vector with enough space for each column + push_back(vector<CString>(m_vsHeaders.size())); return size() -1; } @@ -423,7 +424,7 @@ uRowIdx = size() -1; } - (*this)[uRowIdx][sColumn] = sValue; + (*this)[uRowIdx][GetColumnIndex(sColumn)] = sValue; if (m_msuWidths[sColumn] < sValue.size()) m_msuWidths[sColumn] = sValue.size(); @@ -466,13 +467,13 @@ uIdx -= 3; if (uIdx < size()) { - const map<CString, CString>& mRow = (*this)[uIdx]; + const vector<CString>& mRow = (*this)[uIdx]; ssRet.fill(' '); ssRet << "| "; for (unsigned int c = 0; c < m_vsHeaders.size(); c++) { ssRet.width(GetColumnWidth(c)); - ssRet << std::left << mRow.at(m_vsHeaders[c]); + ssRet << std::left << mRow[c]; ssRet << ((c == m_vsHeaders.size() -1) ? " |" : " | "); } @@ -511,6 +512,15 @@ } */ +unsigned int CTable::GetColumnIndex(const CString& sName) const { + for (unsigned int i = 0; i < m_vsHeaders.size(); i++) { + if (m_vsHeaders[i] == sName) + return i; + } + + return 0; +} + unsigned int CTable::GetColumnWidth(unsigned int uIdx) const { if (uIdx >= m_vsHeaders.size()) { return 0; Modified: trunk/Utils.h =================================================================== --- trunk/Utils.h 2008-08-22 12:48:56 UTC (rev 1162) +++ trunk/Utils.h 2008-08-23 13:24:28 UTC (rev 1163) @@ -198,7 +198,7 @@ }; -class CTable : public vector<map<CString, CString> > { +class CTable : public vector<vector<CString> > { public: CTable() {} virtual ~CTable() {} @@ -210,6 +210,8 @@ unsigned int GetColumnWidth(unsigned int uIdx) const; private: + unsigned int GetColumnIndex(const CString& sName) const; + protected: vector<CString> m_vsHeaders; map<CString, unsigned int> m_msuWidths; // Used to cache the width of a column This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-08-24 12:49:31
|
Revision: 1168 http://znc.svn.sourceforge.net/znc/?rev=1168&view=rev Author: psychon Date: 2008-08-24 12:49:40 +0000 (Sun, 24 Aug 2008) Log Message: ----------- Add a new function CModule::PutModule(const CTable&) This function displays a CTable via PutModule(), something that is often needed. The function returns the number of lines displayed. The idea for this function is from the user-contributed admin module by Sebastian Ramacher. Thanks. Modified Paths: -------------- trunk/Modules.cpp trunk/Modules.h Modified: trunk/Modules.cpp =================================================================== --- trunk/Modules.cpp 2008-08-24 10:41:01 UTC (rev 1167) +++ trunk/Modules.cpp 2008-08-24 12:49:40 UTC (rev 1168) @@ -503,6 +503,16 @@ bool CModule::PutStatus(const CString& sLine) { return (m_pUser) ? m_pUser->PutStatus(sLine, m_pClient) : false; } +unsigned int CModule::PutModule(const CTable& table, const CString& sIdent, const CString& sHost) { + if (!m_pUser) + return 0; + + unsigned int idx = 0; + CString sLine; + while (table.GetLine(idx++, sLine)) + PutModule(sLine, sIdent, sHost); + return idx - 1; +} bool CModule::PutModule(const CString& sLine, const CString& sIdent, const CString& sHost) { if (!m_pUser) return false; Modified: trunk/Modules.h =================================================================== --- trunk/Modules.h 2008-08-24 10:41:01 UTC (rev 1167) +++ trunk/Modules.h 2008-08-24 12:49:40 UTC (rev 1168) @@ -283,6 +283,7 @@ virtual bool PutUser(const CString& sLine); virtual bool PutStatus(const CString& sLine); virtual bool PutModule(const CString& sLine, const CString& sIdent = "", const CString& sHost = "znc.com"); + virtual unsigned int PutModule(const CTable& table, const CString& sIdent = "", const CString& sHost = "znc.com"); virtual bool PutModNotice(const CString& sLine, const CString& sIdent = "", const CString& sHost = "znc.com"); const CString& GetModName() const { return m_sModName; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-08-26 13:54:07
|
Revision: 1173 http://znc.svn.sourceforge.net/znc/?rev=1173&view=rev Author: psychon Date: 2008-08-26 13:54:17 +0000 (Tue, 26 Aug 2008) Log Message: ----------- Some changes to CZNC::WriteNewConfig (znc --makeconf) I think this is intended to make this more user-friendly. If it is not, well I think this patch does exactly this, so what? Thanks to kroimon for the patch. Modified Paths: -------------- trunk/znc.cpp trunk/znc.h Modified: trunk/znc.cpp =================================================================== --- trunk/znc.cpp 2008-08-25 14:46:22 UTC (rev 1172) +++ trunk/znc.cpp 2008-08-26 13:54:17 UTC (rev 1173) @@ -554,25 +554,13 @@ return true; } -bool CZNC::WriteNewConfig(const CString& sConfig) { - CString sConfigFile = ExpandConfigPath((sConfig.empty()) ? "znc.conf" : sConfig); +bool CZNC::WriteNewConfig(CString& sConfigFile) { CString sAnswer, sUser; - vector<CString> vsLines; + VCString vsLines; - if (CFile::Exists(sConfigFile)) { - if (!m_LockFile.TryExLock(sConfigFile)) { - CUtils::PrintError("ZNC is currently running on this config."); - return false; - } + sConfigFile = ExpandConfigPath((sConfigFile.empty()) ? "znc.conf" : sConfigFile); + CUtils::PrintMessage("Building new config"); - if (!CUtils::GetBoolInput("This config already exists. Would you like to overwrite it?", false)) { - m_LockFile.UnLock(); - return false; - } - } - - CUtils::PrintMessage("Writing new config [" + sConfigFile + "]"); - CUtils::PrintMessage(""); CUtils::PrintMessage("First lets start with some global settings..."); CUtils::PrintMessage(""); @@ -769,6 +757,8 @@ #endif vsLines.push_back("\tServer = " + sHost + ((bSSL) ? " +" : " ") + CString(uServerPort) + " " + sPass); + + CUtils::PrintMessage(""); } while (CUtils::GetBoolInput("Would you like to add another server?", false)); vsLines.push_back(""); @@ -796,32 +786,47 @@ } while (CUtils::GetBoolInput("Would you like to setup another user?", false)); // !User - CUtils::PrintAction("Writing config [" + sConfigFile + "]"); - CFile File(sConfigFile); + CFile File; + bool bFileOK, bFileOpen = false; + do { + CUtils::PrintAction("Writing config [" + sConfigFile + "]"); - bool bFileOpen = false; + bFileOK = true; + if (CFile::Exists(sConfigFile)) { + if (!m_LockFile.TryExLock(sConfigFile)) { + CUtils::PrintStatus(false, "ZNC is currently running on this config."); + bFileOK = false; + } else { + m_LockFile.Close(); + CUtils::PrintStatus(false, "This config already exists."); + if (CUtils::GetBoolInput("Would you like to overwrite it?", false)) + CUtils::PrintAction("Overwriting config [" + sConfigFile + "]"); + else + bFileOK = false; + } + } - if (File.Open(O_WRONLY | O_CREAT | O_TRUNC, 0600)) { - bFileOpen = true; - } else { - CUtils::PrintStatus(false, "Unable to open file"); - CUtils::GetInput("Alternate location", sConfigFile, "/tmp/" + sConfig); - - if (!CFile::Exists(sConfigFile) || CUtils::GetBoolInput("Would you like to overwrite the existing alt file", false)) { - CUtils::PrintAction("Writing to alt location [" + sConfigFile + "]"); + if (bFileOK) { File.SetFileName(sConfigFile); - if (File.Open(O_WRONLY | O_CREAT | O_TRUNC, 0600)) { bFileOpen = true; } else { - CUtils::PrintStatus(false, "Unable to open alt file"); + CUtils::PrintStatus(false, "Unable to open file"); + bFileOK = false; } } - } + if (!bFileOK) { + CUtils::GetInput("Please specify an alternate location (or \"stdout\" for displaying the config)", sConfigFile, sConfigFile); + if (sConfigFile.CaseCmp("stdout") == 0) + bFileOK = true; + else + sConfigFile = ExpandConfigPath(sConfigFile); + } + } while (!bFileOK); if (!bFileOpen) { CUtils::PrintMessage(""); - CUtils::PrintMessage("Printing new config to stdout since we were unable to open a file"); + CUtils::PrintMessage("Printing the new config to stdout:"); CUtils::PrintMessage(""); cout << endl << "----------------------------------------------------------------------------" << endl << endl; } @@ -836,7 +841,6 @@ if (bFileOpen) { File.Close(); - CUtils::PrintStatus(true); } else { cout << endl << "----------------------------------------------------------------------------" << endl << endl; @@ -845,14 +849,14 @@ CUtils::PrintMessage(""); CUtils::PrintMessage("To connect to this znc you need to connect to it as your irc server", true); CUtils::PrintMessage("using the port that you supplied. You have to supply your login info", true); - CUtils::PrintMessage("as the irc server password like so.. user:pass.", true); + CUtils::PrintMessage("as the irc server password like so... user:pass.", true); CUtils::PrintMessage(""); CUtils::PrintMessage("Try something like this in your IRC client...", true); CUtils::PrintMessage("/server <znc_server_ip> " + CString(uListenPort) + " " + sUser + ":<pass>", true); CUtils::PrintMessage(""); m_LockFile.UnLock(); - return CUtils::GetBoolInput("Launch znc now?", true); + return bFileOpen && CUtils::GetBoolInput("Launch znc now?", true); } bool CZNC::ParseConfig(const CString& sConfig) Modified: trunk/znc.h =================================================================== --- trunk/znc.h 2008-08-25 14:46:22 UTC (rev 1172) +++ trunk/znc.h 2008-08-26 13:54:17 UTC (rev 1173) @@ -104,7 +104,7 @@ void InitDirs(const CString& sArgvPath, const CString& sDataDir); bool OnBoot(); CString ExpandConfigPath(const CString& sConfigFile); - bool WriteNewConfig(const CString& sConfig); + bool WriteNewConfig(CString& sConfigFile); bool WriteConfig(); bool ParseConfig(const CString& sConfig); bool RehashConfig(CString& sError); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-08-27 14:43:55
|
Revision: 1174 http://znc.svn.sourceforge.net/znc/?rev=1174&view=rev Author: psychon Date: 2008-08-27 14:44:04 +0000 (Wed, 27 Aug 2008) Log Message: ----------- Add '/msg *status restart' Thanks to kroimon for the patch. Modified Paths: -------------- trunk/ClientCommand.cpp trunk/Utils.h trunk/main.cpp Modified: trunk/ClientCommand.cpp =================================================================== --- trunk/ClientCommand.cpp 2008-08-26 13:54:17 UTC (rev 1173) +++ trunk/ClientCommand.cpp 2008-08-27 14:44:04 UTC (rev 1174) @@ -236,6 +236,15 @@ usleep(100000); // Sleep for 10ms to attempt to allow the previous Broadcast() to go through to all users throw CException(CException::EX_Shutdown); + } else if (m_pUser->IsAdmin() && sCommand.CaseCmp("RESTART") == 0) { + CString sMessage = sLine.Token(1, true); + + if (sMessage.empty()) { + sMessage = "ZNC is being restarted NOW!!"; + } + + CZNC::Get().Broadcast(sMessage); + throw CException(CException::EX_Restart); } else if (sCommand.CaseCmp("JUMP") == 0 || sCommand.CaseCmp("CONNECT") == 0) { if (m_pUser) { @@ -1171,6 +1180,11 @@ Table.SetCell("Command", "Shutdown"); Table.SetCell("Arguments", "[message]"); Table.SetCell("Description", "Shutdown znc completely"); + + Table.AddRow(); + Table.SetCell("Command", "Restart"); + Table.SetCell("Arguments", "[message]"); + Table.SetCell("Description", "Restarts znc"); } if (Table.size()) { Modified: trunk/Utils.h =================================================================== --- trunk/Utils.h 2008-08-26 13:54:17 UTC (rev 1173) +++ trunk/Utils.h 2008-08-27 14:44:04 UTC (rev 1174) @@ -183,7 +183,8 @@ class CException { public: typedef enum { - EX_Shutdown + EX_Shutdown, + EX_Restart } EType; CException(EType e) { Modified: trunk/main.cpp =================================================================== --- trunk/main.cpp 2008-08-26 13:54:17 UTC (rev 1173) +++ trunk/main.cpp 2008-08-27 14:44:04 UTC (rev 1174) @@ -260,10 +260,22 @@ try { iRet = pZNC->Loop(); } catch (CException e) { - // EX_Shutdown is thrown to exit switch (e.GetType()) { case CException::EX_Shutdown: iRet = 0; + break; + case CException::EX_Restart: { + // strdup() because GCC is stupid + char *args[] = { + strdup(argv[0]), + strdup("--datadir"), + strdup(pZNC->GetZNCPath().c_str()), + strdup(pZNC->GetConfigFile().c_str()), + NULL + }; + execvp(args[0], args); + CUtils::PrintError("Unable to restart znc [" + CString(strerror(errno)) + "]"); + } /* Fall through */ default: iRet = 1; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-08-29 15:05:59
|
Revision: 1177 http://znc.svn.sourceforge.net/znc/?rev=1177&view=rev Author: psychon Date: 2008-08-29 15:06:08 +0000 (Fri, 29 Aug 2008) Log Message: ----------- Add a config option 'MaxJoins' to limit the number of joins ZNC does at once This should hopefully fix a couple of 'Excess flood' problems we were having. Thanks to SilverLeo for finally writing this :P Modified Paths: -------------- trunk/User.cpp trunk/User.h trunk/modules/webadmin.cpp trunk/znc.cpp Modified: trunk/User.cpp =================================================================== --- trunk/User.cpp 2008-08-28 18:50:42 UTC (rev 1176) +++ trunk/User.cpp 2008-08-29 15:06:08 UTC (rev 1177) @@ -41,6 +41,7 @@ m_sChanPrefixes = ""; m_uBufferCount = 50; m_uMaxJoinTries = 0; + m_uMaxJoins = 5; m_bKeepBuffer = false; m_bAutoCycle = true; m_bBeingDeleted = false; @@ -295,6 +296,7 @@ SetDefaultChanModes(User.GetDefaultChanModes()); SetBufferCount(User.GetBufferCount()); SetJoinTries(User.JoinTries()); + SetMaxJoins(User.MaxJoins()); // Allowed Hosts m_ssAllowedHosts.clear(); @@ -405,8 +407,6 @@ pChan->Clone(*pNewChan); } } - - JoinChans(); // !Chans // CTCP Replies @@ -587,6 +587,7 @@ PrintLine(File, "PrependTimestamp", CString((GetTimestampPrepend()) ? "true" : "false")); PrintLine(File, "TimezoneOffset", CString(m_fTimezoneOffset)); PrintLine(File, "JoinTries", CString(m_uMaxJoinTries)); + PrintLine(File, "MaxJoins", CString(m_uMaxJoins)); File.Write("\n"); // Allow Hosts @@ -659,6 +660,7 @@ } void CUser::JoinChans() { + unsigned int uJoins = m_uMaxJoins; for (unsigned int a = 0; a < m_vChans.size(); a++) { CChan* pChan = m_vChans[a]; if (!pChan->IsOn() && !pChan->IsDisabled()) { @@ -668,6 +670,10 @@ } else { pChan->IncJoinTries(); PutIRC("JOIN " + pChan->GetName() + " " + pChan->GetKey()); + + // Limit the number of joins + if (uJoins != 0 && --uJoins == 0) + return; } } } Modified: trunk/User.h =================================================================== --- trunk/User.h 2008-08-28 18:50:42 UTC (rev 1176) +++ trunk/User.h 2008-08-29 15:06:08 UTC (rev 1177) @@ -141,6 +141,7 @@ void SetTimestampPrepend(bool b) { m_bPrependTimestamp = b; } void SetTimezoneOffset(float b) { m_fTimezoneOffset = b; } void SetJoinTries(unsigned int i) { m_uMaxJoinTries = i; } + void SetMaxJoins(unsigned int i) { m_uMaxJoins = i; } void SetIRCConnectEnabled(bool b) { m_bIRCConnectEnabled = b; } // !Setters @@ -193,6 +194,7 @@ unsigned long long BytesRead() const { return m_uBytesRead; } unsigned long long BytesWritten() const { return m_uBytesWritten; } unsigned int JoinTries() const { return m_uMaxJoinTries; } + unsigned int MaxJoins() const { return m_uMaxJoins; } // !Getters private: protected: @@ -251,6 +253,7 @@ unsigned long long m_uBytesRead; unsigned long long m_uBytesWritten; unsigned int m_uMaxJoinTries; + unsigned int m_uMaxJoins; #ifdef _MODULES CModules* m_pModules; Modified: trunk/modules/webadmin.cpp =================================================================== --- trunk/modules/webadmin.cpp 2008-08-28 18:50:42 UTC (rev 1176) +++ trunk/modules/webadmin.cpp 2008-08-29 15:06:08 UTC (rev 1177) @@ -733,8 +733,6 @@ } } - m_pUser->JoinChans(); - if (!CZNC::Get().WriteConfig()) { GetErrorPage(sPageRet, "Channel added/modified, but config was not written"); return true; Modified: trunk/znc.cpp =================================================================== --- trunk/znc.cpp 2008-08-28 18:50:42 UTC (rev 1176) +++ trunk/znc.cpp 2008-08-29 15:06:08 UTC (rev 1177) @@ -1278,6 +1278,9 @@ } else if (sName.CaseCmp("JoinTries") == 0) { pUser->SetJoinTries(sValue.ToUInt()); continue; + } else if (sName.CaseCmp("MaxJoins") == 0) { + pUser->SetMaxJoins(sValue.ToUInt()); + continue; } else if (sName.CaseCmp("LoadModule") == 0) { CString sModName = sValue.Token(0); CUtils::PrintAction("Loading Module [" + sModName + "]"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-08-29 18:50:58
|
Revision: 1178 http://znc.svn.sourceforge.net/znc/?rev=1178&view=rev Author: psychon Date: 2008-08-29 18:51:08 +0000 (Fri, 29 Aug 2008) Log Message: ----------- Instead of (ab)using a CClient for listening, use an own class this job Modified Paths: -------------- trunk/Client.cpp trunk/Client.h trunk/znc.h Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2008-08-29 15:06:08 UTC (rev 1177) +++ trunk/Client.cpp 2008-08-29 18:51:08 UTC (rev 1178) @@ -601,11 +601,6 @@ return true; } -bool CClient::ConnectionFrom(const CString& sHost, unsigned short uPort) { - DEBUG_ONLY(cout << GetSockName() << " == ConnectionFrom(" << sHost << ", " << uPort << ")" << endl); - return CZNC::Get().IsHostAllowed(sHost); -} - void CClient::AuthUser() { /* #ifdef _MODULES @@ -729,12 +724,6 @@ m_pIRCSock = NULL; } -Csock* CClient::GetSockObj(const CString& sHost, unsigned short uPort) { - CClient* pSock = new CClient(sHost, uPort); - pSock->StartLoginTimeout(); - return pSock; -} - void CClient::PutIRC(const CString& sLine) { if (m_pIRCSock) { m_pIRCSock->PutIRC(sLine); Modified: trunk/Client.h =================================================================== --- trunk/Client.h 2008-08-29 15:06:08 UTC (rev 1177) +++ trunk/Client.h 2008-08-29 18:51:08 UTC (rev 1178) @@ -65,17 +65,7 @@ class CClient : public Csock { public: - CClient() : Csock() { - InitClient(); - } - CClient(const CString& sHostname, unsigned short uPort, int iTimeout = 60) : Csock(sHostname, uPort, iTimeout) { - InitClient(); - } - - virtual ~CClient(); - - void InitClient() { m_pUser = NULL; m_pTimeout = NULL; m_pIRCSock = NULL; @@ -85,8 +75,12 @@ m_bNamesx = false; m_bUHNames = false; EnableReadLine(); + + StartLoginTimeout(); } + virtual ~CClient(); + void AcceptLogin(CUser& User); void RefuseLogin(const CString& sReason); void StartLoginTimeout(); @@ -118,8 +112,6 @@ virtual void Connected(); virtual void Disconnected(); virtual void ConnectionRefused(); - virtual bool ConnectionFrom(const CString& sHost, unsigned short uPort); - virtual Csock* GetSockObj(const CString& sHost, unsigned short uPort); void SetNick(const CString& s); CUser* GetUser() const { return m_pUser; } Modified: trunk/znc.h =================================================================== --- trunk/znc.h 2008-08-29 15:06:08 UTC (rev 1177) +++ trunk/znc.h 2008-08-29 18:51:08 UTC (rev 1178) @@ -223,6 +223,21 @@ CConnectUserTimer *m_pConnectUserTimer; }; +class CRealListener : public Csock { +public: + CRealListener() : Csock() {} + ~CRealListener() {} + + virtual bool ConnectionFrom(const CString& sHost, unsigned short uPort) { + DEBUG_ONLY(cout << GetSockName() << " == ConnectionFrom(" << sHost << ", " << uPort << ")" << endl); + return CZNC::Get().IsHostAllowed(sHost); + } + + virtual Csock* GetSockObj(const CString& sHost, unsigned short uPort) { + return new CClient(sHost, uPort); + } +}; + class CListener { public: CListener(unsigned short uPort, const CString& sBindHost, bool bSSL, bool bIPV6) { @@ -230,12 +245,12 @@ m_sBindHost = sBindHost; m_bSSL = bSSL; m_bIPV6 = bIPV6; - m_pClient = NULL; + m_pListener = NULL; } virtual ~CListener() { - if (m_pClient) - CZNC::Get().GetManager().DelSockByAddr(m_pClient); + if (m_pListener) + CZNC::Get().GetManager().DelSockByAddr(m_pListener); } // Setters @@ -253,21 +268,22 @@ // !Getters bool Listen() { - if (!m_uPort || m_pClient) { + if (!m_uPort || m_pListener) { return false; } - m_pClient = new CClient; + m_pListener = new CRealListener; bool bSSL = false; #ifdef HAVE_LIBSSL if (IsSSL()) { bSSL = true; - m_pClient->SetPemLocation(CZNC::Get().GetPemLocation()); + m_pListener->SetPemLocation(CZNC::Get().GetPemLocation()); } #endif - return CZNC::Get().GetManager().ListenHost(m_uPort, "_LISTENER", m_sBindHost, bSSL, SOMAXCONN, m_pClient, 0, m_bIPV6); + return CZNC::Get().GetManager().ListenHost(m_uPort, "_LISTENER", m_sBindHost, bSSL, SOMAXCONN, + m_pListener, 0, m_bIPV6); } private: protected: @@ -275,7 +291,7 @@ bool m_bIPV6; unsigned short m_uPort; CString m_sBindHost; - CClient* m_pClient; + CRealListener* m_pListener; }; #endif // !_ZNC_H This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-08-30 09:00:14
|
Revision: 1181 http://znc.svn.sourceforge.net/znc/?rev=1181&view=rev Author: psychon Date: 2008-08-30 09:00:21 +0000 (Sat, 30 Aug 2008) Log Message: ----------- Use znc.in instead of znc.com No cookie for that domain catcher at znc.com! Modified Paths: -------------- trunk/Chan.cpp trunk/Client.cpp trunk/Modules.h trunk/User.cpp trunk/modules/modperl.pm trunk/modules/partyline.cpp trunk/modules/savebuff.cpp trunk/modules/schat.cpp trunk/modules/watch.cpp Modified: trunk/Chan.cpp =================================================================== --- trunk/Chan.cpp 2008-08-30 08:35:11 UTC (rev 1180) +++ trunk/Chan.cpp 2008-08-30 09:00:21 UTC (rev 1181) @@ -585,7 +585,7 @@ const vector<CString>& vsBuffer = GetBuffer(); if (vsBuffer.size()) { - m_pUser->PutUser(":***!zn...@zn... PRIVMSG " + GetName() + " :Buffer Playback...", pClient); + m_pUser->PutUser(":***!zn...@zn... PRIVMSG " + GetName() + " :Buffer Playback...", pClient); for (unsigned int a = 0; a < vsBuffer.size(); a++) { m_pUser->PutUser(vsBuffer[a], pClient); @@ -595,7 +595,7 @@ ClearBuffer(); } - m_pUser->PutUser(":***!zn...@zn... PRIVMSG " + GetName() + " :Playback Complete.", pClient); + m_pUser->PutUser(":***!zn...@zn... PRIVMSG " + GetName() + " :Playback Complete.", pClient); } } } Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2008-08-30 08:35:11 UTC (rev 1180) +++ trunk/Client.cpp 2008-08-30 09:00:21 UTC (rev 1181) @@ -132,7 +132,7 @@ if ((m_bGotPass) && (m_bGotNick)) { AuthUser(); } else if (!m_bGotPass) { - PutClient(":irc.znc.com NOTICE AUTH :*** " + PutClient(":irc.znc.in NOTICE AUTH :*** " "You need to send your password. " "Try /quote PASS <username>:<password>"); } @@ -174,7 +174,7 @@ // If the client meant to ping us or we can be sure the server // won't answer the ping (=no server connected) -> PONG back. // else: It's the server's job to send a PONG. - if (sTarget.CaseCmp("irc.znc.com") == 0 || !m_pIRCSock) { + if (sTarget.CaseCmp("irc.znc.in") == 0 || !m_pIRCSock) { PutClient("PONG " + sLine.substr(5)); return; } @@ -441,7 +441,7 @@ // Need to lookup the connection by port, filter the port, and forward to the user if (strncasecmp(sTarget.c_str(), m_pUser->GetStatusPrefix().c_str(), m_pUser->GetStatusPrefix().length()) == 0) { if ((m_pUser) && (m_pUser->ResumeFile(uResumePort, uResumeSize))) { - PutClient(":" + sTarget + "!zn...@zn... PRIVMSG " + GetNick() + " :\001DCC ACCEPT " + sFile + " " + CString(uResumePort) + " " + CString(uResumeSize) + "\001"); + PutClient(":" + sTarget + "!zn...@zn... PRIVMSG " + GetNick() + " :\001DCC ACCEPT " + sFile + " " + CString(uResumePort) + " " + CString(uResumeSize) + "\001"); } else { PutStatus("DCC -> [" + GetNick() + "][" + sFile + "] Unable to find send to initiate resume."); } @@ -648,7 +648,7 @@ } PutStatus("Bad username and/or password."); - PutClient(":irc.znc.com 464 " + GetNick() + " :" + sReason); + PutClient(":irc.znc.in 464 " + GetNick() + " :" + sReason); Close(); } @@ -748,8 +748,8 @@ return; } - DEBUG_ONLY(cout << "(" << m_pUser->GetUserName() << ") ZNC -> CLI [:" + m_pUser->GetStatusPrefix() + ((sModule.empty()) ? "status" : sModule) + "!zn...@zn... NOTICE " << GetNick() << " :" << sLine << "]" << endl); - Write(":" + m_pUser->GetStatusPrefix() + ((sModule.empty()) ? "status" : sModule) + "!zn...@zn... NOTICE " + GetNick() + " :" + sLine + "\r\n"); + DEBUG_ONLY(cout << "(" << m_pUser->GetUserName() << ") ZNC -> CLI [:" + m_pUser->GetStatusPrefix() + ((sModule.empty()) ? "status" : sModule) + "!zn...@zn... NOTICE " << GetNick() << " :" << sLine << "]" << endl); + Write(":" + m_pUser->GetStatusPrefix() + ((sModule.empty()) ? "status" : sModule) + "!zn...@zn... NOTICE " + GetNick() + " :" + sLine + "\r\n"); } void CClient::PutModule(const CString& sModule, const CString& sLine) { @@ -757,8 +757,8 @@ return; } - DEBUG_ONLY(cout << "(" << m_pUser->GetUserName() << ") ZNC -> CLI [:" + m_pUser->GetStatusPrefix() + ((sModule.empty()) ? "status" : sModule) + "!zn...@zn... PRIVMSG " << GetNick() << " :" << sLine << "]" << endl); - Write(":" + m_pUser->GetStatusPrefix() + ((sModule.empty()) ? "status" : sModule) + "!zn...@zn... PRIVMSG " + GetNick() + " :" + sLine + "\r\n"); + DEBUG_ONLY(cout << "(" << m_pUser->GetUserName() << ") ZNC -> CLI [:" + m_pUser->GetStatusPrefix() + ((sModule.empty()) ? "status" : sModule) + "!zn...@zn... PRIVMSG " << GetNick() << " :" << sLine << "]" << endl); + Write(":" + m_pUser->GetStatusPrefix() + ((sModule.empty()) ? "status" : sModule) + "!zn...@zn... PRIVMSG " + GetNick() + " :" + sLine + "\r\n"); } CString CClient::GetNick(bool bAllowIRCNick) const { @@ -778,7 +778,7 @@ CString sHost = m_pUser->GetVHost(); if (sHost.empty()) { - sHost = "irc.znc.com"; + sHost = "irc.znc.in"; } return GetNick() + "!" + m_pUser->GetIdent() + "@" + sHost; Modified: trunk/Modules.h =================================================================== --- trunk/Modules.h 2008-08-30 08:35:11 UTC (rev 1180) +++ trunk/Modules.h 2008-08-30 09:00:21 UTC (rev 1181) @@ -144,8 +144,8 @@ virtual bool PutIRC(const CString& sLine); virtual bool PutUser(const CString& sLine); virtual bool PutStatus(const CString& sLine); - virtual bool PutModule(const CString& sLine, const CString& sIdent = "", const CString& sHost = "znc.com"); - virtual bool PutModNotice(const CString& sLine, const CString& sIdent = "", const CString& sHost = "znc.com"); + virtual bool PutModule(const CString& sLine, const CString& sIdent = "", const CString& sHost = "znc.in"); + virtual bool PutModNotice(const CString& sLine, const CString& sIdent = "", const CString& sHost = "znc.in"); // Setters void SetModule(CModule* p); @@ -282,9 +282,9 @@ virtual bool PutIRC(const CString& sLine); virtual bool PutUser(const CString& sLine); virtual bool PutStatus(const CString& sLine); - virtual bool PutModule(const CString& sLine, const CString& sIdent = "", const CString& sHost = "znc.com"); - virtual unsigned int PutModule(const CTable& table, const CString& sIdent = "", const CString& sHost = "znc.com"); - virtual bool PutModNotice(const CString& sLine, const CString& sIdent = "", const CString& sHost = "znc.com"); + virtual bool PutModule(const CString& sLine, const CString& sIdent = "", const CString& sHost = "znc.in"); + virtual unsigned int PutModule(const CTable& table, const CString& sIdent = "", const CString& sHost = "znc.in"); + virtual bool PutModNotice(const CString& sLine, const CString& sIdent = "", const CString& sHost = "znc.in"); const CString& GetModName() const { return m_sModName; } // This is where constant module data (e.g. webadmin skins) are saved Modified: trunk/User.cpp =================================================================== --- trunk/User.cpp 2008-08-30 08:35:11 UTC (rev 1180) +++ trunk/User.cpp 2008-08-30 09:00:21 UTC (rev 1181) @@ -204,7 +204,7 @@ m_vClients.push_back(pClient); if (m_RawBuffer.IsEmpty()) { - pClient->PutClient(":irc.znc.com 001 " + pClient->GetNick() + " :- Welcome to ZNC -"); + pClient->PutClient(":irc.znc.in 001 " + pClient->GetNick() + " :- Welcome to ZNC -"); } else { unsigned int uIdx = 0; CString sLine; @@ -949,7 +949,7 @@ unsigned short uPort = CZNC::Get().GetManager().ListenRand("DCC::LISTEN::" + sRemoteNick, GetLocalIP(), false, SOMAXCONN, pSock, 120); if (GetNick().CaseCmp(sRemoteNick) == 0) { - PutUser(":" + GetStatusPrefix() + "status!zn...@zn... PRIVMSG " + sRemoteNick + " :\001DCC SEND " + pFile->GetShortName() + " " + CString(CUtils::GetLongIP(GetLocalIP())) + " " + PutUser(":" + GetStatusPrefix() + "status!zn...@zn... PRIVMSG " + sRemoteNick + " :\001DCC SEND " + pFile->GetShortName() + " " + CString(CUtils::GetLongIP(GetLocalIP())) + " " + CString(uPort) + " " + CString(pFile->GetSize()) + "\001"); } else { PutIRC("PRIVMSG " + sRemoteNick + " :\001DCC SEND " + pFile->GetShortName() + " " + CString(CUtils::GetLongIP(GetLocalIP())) + " " Modified: trunk/modules/modperl.pm =================================================================== --- trunk/modules/modperl.pm 2008-08-30 08:35:11 UTC (rev 1180) +++ trunk/modules/modperl.pm 2008-08-30 09:00:21 UTC (rev 1181) @@ -249,7 +249,7 @@ } if ( !$host ) { - $host = "znc.com"; + $host = "znc.in"; } COREPutModule( "Module", $line, $ident, $host ); @@ -265,7 +265,7 @@ } if ( !$host ) { - $host = "znc.com"; + $host = "znc.in"; } COREPutModule( "ModNotice", $line, $ident, $host ); Modified: trunk/modules/partyline.cpp =================================================================== --- trunk/modules/partyline.cpp 2008-08-30 08:35:11 UTC (rev 1180) +++ trunk/modules/partyline.cpp 2008-08-30 09:00:21 UTC (rev 1181) @@ -181,7 +181,7 @@ sHost = m_pUser->GetIRCNick().GetHost(); } if (sHost.empty()) { - sHost = "znc.com"; + sHost = "znc.in"; } PutChan(ssNicks, ":?" + sNick + "!" + m_pUser->GetIdent() + "@" + sHost + " JOIN " + *a, false); pChannel->AddNick(sNick); @@ -240,19 +240,19 @@ PutChan(ssNicks, ":" + m_pUser->GetIRCNick().GetNickMask() + " TOPIC " + sChannel + " :" + sTopic); pChannel->SetTopic(sTopic); } else { - m_pUser->PutUser(":irc.znc.com 482 " + m_pUser->GetIRCNick().GetNick() + " " + sChannel + " :You're not channel operator"); + m_pUser->PutUser(":irc.znc.in 482 " + m_pUser->GetIRCNick().GetNick() + " " + sChannel + " :You're not channel operator"); } } else { sTopic = pChannel->GetTopic(); if (sTopic.empty()) { - m_pUser->PutUser(":irc.znc.com 331 " + m_pUser->GetIRCNick().GetNick() + " " + sChannel + " :No topic is set."); + m_pUser->PutUser(":irc.znc.in 331 " + m_pUser->GetIRCNick().GetNick() + " " + sChannel + " :No topic is set."); } else { - m_pUser->PutUser(":irc.znc.com 332 " + m_pUser->GetIRCNick().GetNick() + " " + sChannel + " :" + sTopic); + m_pUser->PutUser(":irc.znc.in 332 " + m_pUser->GetIRCNick().GetNick() + " " + sChannel + " :" + sTopic); } } } else { - m_pUser->PutUser(":irc.znc.com 442 " + m_pUser->GetIRCNick().GetNick() + " " + sChannel + " :You're not on that channel"); + m_pUser->PutUser(":irc.znc.in 442 " + m_pUser->GetIRCNick().GetNick() + " " + sChannel + " :You're not on that channel"); } return HALT; } @@ -546,7 +546,7 @@ if (!sServer.empty()) return sServer; - return "irc.znc.com"; + return "irc.znc.in"; } bool PutChan(const CString& sChan, const CString& sLine, bool bIncludeCurUser = true, bool bIncludeClient = true, CUser* pUser = NULL, CClient* pClient = NULL) { Modified: trunk/modules/savebuff.cpp =================================================================== --- trunk/modules/savebuff.cpp 2008-08-30 08:35:11 UTC (rev 1180) +++ trunk/modules/savebuff.cpp 2008-08-30 09:00:21 UTC (rev 1181) @@ -204,7 +204,7 @@ void Replay(const CString & sChan) { CString sFile; - PutUser(":***!zn...@zn... PRIVMSG " + sChan + " :Buffer Playback..."); + PutUser(":***!zn...@zn... PRIVMSG " + sChan + " :Buffer Playback..."); if (DecryptChannel(sChan, sFile)) { CString sLine; @@ -215,7 +215,7 @@ PutUser(sLine); } } - PutUser(":***!zn...@zn... PRIVMSG " + sChan + " :Playback Complete."); + PutUser(":***!zn...@zn... PRIVMSG " + sChan + " :Playback Complete."); } CString GetPath(const CString & sChannel) @@ -228,7 +228,7 @@ CString SpoofChanMsg(const CString & sChannel, const CString & sMesg) { - CString sReturn = ":*" + GetModName() + "!zn...@zn... PRIVMSG " + sChannel + " :" + CString(time(NULL)) + " " + sMesg; + CString sReturn = ":*" + GetModName() + "!zn...@zn... PRIVMSG " + sChannel + " :" + CString(time(NULL)) + " " + sMesg; return(sReturn); } Modified: trunk/modules/schat.cpp =================================================================== --- trunk/modules/schat.cpp 2008-08-30 08:35:11 UTC (rev 1180) +++ trunk/modules/schat.cpp 2008-08-30 09:00:21 UTC (rev 1181) @@ -439,7 +439,7 @@ void SendToUser(const CString & sFrom, const CString & sText) { - //:*schat!zn...@zn... PRIVMSG Jim : + //:*schat!zn...@zn... PRIVMSG Jim : CString sSend = ":" + sFrom + " PRIVMSG " + m_pUser->GetCurNick() + " :" + sText; PutUser(sSend); } Modified: trunk/modules/watch.cpp =================================================================== --- trunk/modules/watch.cpp 2008-08-30 08:35:11 UTC (rev 1180) +++ trunk/modules/watch.cpp 2008-08-30 09:00:21 UTC (rev 1181) @@ -280,9 +280,9 @@ if (WatchEntry.IsMatch(Nick, sMessage, sSource)) { if (m_pUser->IsUserAttached()) { - m_pUser->PutUser(":" + WatchEntry.GetTarget() + "!wa...@zn... PRIVMSG " + m_pUser->GetCurNick() + " :" + sMessage); + m_pUser->PutUser(":" + WatchEntry.GetTarget() + "!wa...@zn... PRIVMSG " + m_pUser->GetCurNick() + " :" + sMessage); } else { - m_Buffer.AddLine(":" + WatchEntry.GetTarget() + "!wa...@zn... PRIVMSG ", " :" + sMessage); + m_Buffer.AddLine(":" + WatchEntry.GetTarget() + "!wa...@zn... PRIVMSG ", " :" + sMessage); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-08-30 19:46:20
|
Revision: 1182 http://znc.svn.sourceforge.net/znc/?rev=1182&view=rev Author: psychon Date: 2008-08-30 19:46:28 +0000 (Sat, 30 Aug 2008) Log Message: ----------- Handle clients in CModules the same way users are This should remove some additional complexity, but I doubt one can benchmark these savings... BTW: Here is what I found out on how this works: The user module manager (CModules) always has m_pUser set to NULL which means that it never touches its module's user pointer. That way, the modules always have the correct pointer. For global modules, m_pUser is set on some calls. This pointer is then passed on to the modules and reset afterwards. Modified Paths: -------------- trunk/Modules.cpp trunk/Modules.h Modified: trunk/Modules.cpp =================================================================== --- trunk/Modules.cpp 2008-08-30 09:00:21 UTC (rev 1181) +++ trunk/Modules.cpp 2008-08-30 19:46:28 UTC (rev 1182) @@ -22,6 +22,7 @@ for (unsigned int a = 0; a < size(); a++) { \ try { \ type* pMod = (type *) (*this)[a]; \ + pMod->SetClient(m_pClient); \ if (m_pUser) { \ pMod->SetUser(m_pUser); \ pMod->func; \ @@ -29,6 +30,7 @@ } else { \ pMod->func; \ } \ + pMod->SetClient(NULL); \ } catch (CModule::EModException e) { \ if (e == CModule::UNLOAD) { \ UnloadModule((*this)[a]->GetModName()); \ @@ -45,6 +47,7 @@ try { \ type* pMod = (type*) (*this)[a]; \ CModule::EModRet e = CModule::CONTINUE; \ + pMod->SetClient(m_pClient); \ if (m_pUser) { \ pMod->SetUser(m_pUser); \ e = pMod->func; \ @@ -52,6 +55,7 @@ } else { \ e = pMod->func; \ } \ + pMod->SetClient(NULL); \ if (e == CModule::HALTMODS) { \ break; \ } else if (e == CModule::HALTCORE) { \ @@ -541,6 +545,7 @@ CModules::CModules() { m_pUser = NULL; + m_pClient = NULL; } CModules::~CModules() { @@ -555,12 +560,6 @@ } } -void CModules::SetClient(CClient* pClient) { - for (unsigned int a = 0; a < size(); a++) { - (*this)[a]->SetClient(pClient); - } -} - bool CModules::OnBoot() { for (unsigned int a = 0; a < size(); a++) { if (!(*this)[a]->OnBoot()) { Modified: trunk/Modules.h =================================================================== --- trunk/Modules.h 2008-08-30 09:00:21 UTC (rev 1181) +++ trunk/Modules.h 2008-08-30 19:46:28 UTC (rev 1182) @@ -359,7 +359,7 @@ virtual ~CModules(); void SetUser(CUser* pUser) { m_pUser = pUser; } - void SetClient(CClient* pClient); + void SetClient(CClient* pClient) { m_pClient = pClient; } void UnloadAll(); @@ -426,6 +426,7 @@ protected: CUser* m_pUser; + CClient* m_pClient; }; class CGlobalModule : public CModule { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-08-31 07:21:13
|
Revision: 1183 http://znc.svn.sourceforge.net/znc/?rev=1183&view=rev Author: psychon Date: 2008-08-31 07:21:21 +0000 (Sun, 31 Aug 2008) Log Message: ----------- Keep the traffic stats more up-to-date (/msg *status traffic) This now also adds the traffic caused by webadmin, schat and dcc bouncing to the stats. Modified Paths: -------------- trunk/DCCBounce.cpp trunk/DCCBounce.h trunk/DCCSock.cpp trunk/DCCSock.h trunk/modules/schat.cpp trunk/modules/webadmin.cpp Modified: trunk/DCCBounce.cpp =================================================================== --- trunk/DCCBounce.cpp 2008-08-30 19:46:28 UTC (rev 1182) +++ trunk/DCCBounce.cpp 2008-08-31 07:21:21 UTC (rev 1183) @@ -15,6 +15,17 @@ // If less than this is in the buffer, the receiving side continues const unsigned int CDCCBounce::m_uiMinDCCBuffer = 2 * 1024; +CDCCBounce::~CDCCBounce() { + if (m_pPeer) { + m_pPeer->Shutdown(); + m_pPeer = NULL; + } + if (m_pUser) { + m_pUser->AddBytesRead(GetBytesRead()); + m_pUser->AddBytesWritten(GetBytesWritten()); + } +} + void CDCCBounce::ReadLine(const CString& sData) { CString sLine = sData; Modified: trunk/DCCBounce.h =================================================================== --- trunk/DCCBounce.h 2008-08-30 19:46:28 UTC (rev 1182) +++ trunk/DCCBounce.h 2008-08-31 07:21:21 UTC (rev 1183) @@ -47,12 +47,7 @@ EnableReadLine(); } } - virtual ~CDCCBounce() { - if (m_pPeer) { - m_pPeer->Shutdown(); - m_pPeer = NULL; - } - } + virtual ~CDCCBounce(); static unsigned short DCCRequest(const CString& sNick, unsigned long uLongIP, unsigned short uPort, const CString& sFileName, bool bIsChat, CUser* pUser, const CString& sLocalIP, const CString& sRemoteIP); Modified: trunk/DCCSock.cpp =================================================================== --- trunk/DCCSock.cpp 2008-08-30 19:46:28 UTC (rev 1182) +++ trunk/DCCSock.cpp 2008-08-31 07:21:21 UTC (rev 1183) @@ -9,6 +9,17 @@ #include "DCCSock.h" #include "User.h" +CDCCSock::~CDCCSock() { + if ((m_pFile) && (!m_bNoDelFile)) { + m_pFile->Close(); + delete m_pFile; + } + if (m_pUser) { + m_pUser->AddBytesRead(GetBytesRead()); + m_pUser->AddBytesWritten(GetBytesWritten()); + } +} + void CDCCSock::ReadData(const char* data, int len) { if (!m_pFile) { DEBUG_ONLY(cout << "File not open! closing get." << endl); Modified: trunk/DCCSock.h =================================================================== --- trunk/DCCSock.h 2008-08-30 19:46:28 UTC (rev 1182) +++ trunk/DCCSock.h 2008-08-31 07:21:21 UTC (rev 1183) @@ -53,12 +53,7 @@ m_bNoDelFile = false; } */ - virtual ~CDCCSock() { - if ((m_pFile) && (!m_bNoDelFile)) { - m_pFile->Close(); - delete m_pFile; - } - } + virtual ~CDCCSock(); virtual void ReadData(const char* data, int len); virtual void ConnectionRefused(); Modified: trunk/modules/schat.cpp =================================================================== --- trunk/modules/schat.cpp 2008-08-30 19:46:28 UTC (rev 1182) +++ trunk/modules/schat.cpp 2008-08-31 07:21:21 UTC (rev 1183) @@ -57,6 +57,8 @@ EnableReadLine(); } + ~CSChatSock(); + virtual Csock *GetSockObj(const CS_STRING & sHostname, u_short iPort) { CSChatSock *p = new CSChatSock(sHostname, iPort); @@ -457,6 +459,12 @@ //////////////////// methods //////////////// +CSChatSock::~CSChatSock() +{ + m_pModule->GetUser()->AddBytesRead(GetBytesRead()); + m_pModule->GetUser()->AddBytesWritten(GetBytesWritten()); +} + void CSChatSock::ReadLine(const CS_STRING & sLine) { if (m_pModule) Modified: trunk/modules/webadmin.cpp =================================================================== --- trunk/modules/webadmin.cpp 2008-08-30 19:46:28 UTC (rev 1182) +++ trunk/modules/webadmin.cpp 2008-08-31 07:21:21 UTC (rev 1183) @@ -335,6 +335,9 @@ CWebAdminAuth* pAuth = (CWebAdminAuth*) &(*m_spAuth); pAuth->SetWebAdminSock(NULL); } + + CZNC::Get().AddBytesRead(GetBytesRead()); + CZNC::Get().AddBytesWritten(GetBytesWritten()); } bool CWebAdminSock::OnPageRequest(const CString& sURI, CString& sPageRet) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-09-02 12:39:09
|
Revision: 1185 http://znc.svn.sourceforge.net/znc/?rev=1185&view=rev Author: psychon Date: 2008-09-02 12:39:18 +0000 (Tue, 02 Sep 2008) Log Message: ----------- Add OnUserTopicRequest() for topic requests OnUserTopic() used to try to handle this, but it really failed to... Modified Paths: -------------- trunk/Client.cpp trunk/Modules.cpp trunk/Modules.h Modified: trunk/Client.cpp =================================================================== --- trunk/Client.cpp 2008-08-31 18:01:44 UTC (rev 1184) +++ trunk/Client.cpp 2008-09-02 12:39:18 UTC (rev 1185) @@ -251,21 +251,15 @@ } else if (sCommand.CaseCmp("TOPIC") == 0) { CString sChan = sLine.Token(1); CString sTopic = sLine.Token(2, true); - bool bUnset = false; - if (sTopic.Left(1) == ":") { - sTopic.LeftChomp(); - if (sTopic.empty()) - bUnset = true; + if (!sTopic.empty()) { + if (sTopic.Left(1) == ":") + sTopic.LeftChomp(); + MODULECALL(OnUserTopic(sChan, sTopic), m_pUser, this, return); + sLine = "TOPIC " + sChan + " :" + sTopic; + } else { + MODULECALL(OnUserTopicRequest(sChan), m_pUser, this, return); } - - MODULECALL(OnUserTopic(sChan, sTopic), m_pUser, this, return); - - sLine = "TOPIC " + sChan; - - if (!sTopic.empty() || bUnset) { - sLine += " :" + sTopic; - } } else if (sCommand.CaseCmp("MODE") == 0) { CString sTarget = sLine.Token(1); CString sModes = sLine.Token(2, true); Modified: trunk/Modules.cpp =================================================================== --- trunk/Modules.cpp 2008-08-31 18:01:44 UTC (rev 1184) +++ trunk/Modules.cpp 2008-09-02 12:39:18 UTC (rev 1185) @@ -485,6 +485,7 @@ CModule::EModRet CModule::OnUserJoin(CString& sChannel, CString& sKey) { return CONTINUE; } CModule::EModRet CModule::OnUserPart(CString& sChannel, CString& sMessage) { return CONTINUE; } CModule::EModRet CModule::OnUserTopic(CString& sChannel, CString& sTopic) { return CONTINUE; } +CModule::EModRet CModule::OnUserTopicRequest(CString& sChannel) { return CONTINUE; } CModule::EModRet CModule::OnCTCPReply(CNick& Nick, CString& sMessage) { return CONTINUE; } CModule::EModRet CModule::OnPrivCTCP(CNick& Nick, CString& sMessage) { return CONTINUE; } @@ -595,6 +596,7 @@ bool CModules::OnUserJoin(CString& sChannel, CString& sKey) { MODHALTCHK(OnUserJoin(sChannel, sKey)); } bool CModules::OnUserPart(CString& sChannel, CString& sMessage) { MODHALTCHK(OnUserPart(sChannel, sMessage)); } bool CModules::OnUserTopic(CString& sChannel, CString& sTopic) { MODHALTCHK(OnUserTopic(sChannel, sTopic)); } +bool CModules::OnUserTopicRequest(CString& sChannel) { MODHALTCHK(OnUserTopicRequest(sChannel)); } bool CModules::OnQuit(const CNick& Nick, const CString& sMessage, const vector<CChan*>& vChans) { MODUNLOADCHK(OnQuit(Nick, sMessage, vChans)); return false; } bool CModules::OnNick(const CNick& Nick, const CString& sNewNick, const vector<CChan*>& vChans) { MODUNLOADCHK(OnNick(Nick, sNewNick, vChans)); return false; } Modified: trunk/Modules.h =================================================================== --- trunk/Modules.h 2008-08-31 18:01:44 UTC (rev 1184) +++ trunk/Modules.h 2008-09-02 12:39:18 UTC (rev 1185) @@ -264,6 +264,7 @@ virtual EModRet OnUserJoin(CString& sChannel, CString& sKey); virtual EModRet OnUserPart(CString& sChannel, CString& sMessage); virtual EModRet OnUserTopic(CString& sChannel, CString& sTopic); + virtual EModRet OnUserTopicRequest(CString& sChannel); virtual EModRet OnCTCPReply(CNick& Nick, CString& sMessage); virtual EModRet OnPrivCTCP(CNick& Nick, CString& sMessage); @@ -403,6 +404,7 @@ virtual bool OnUserJoin(CString& sChannel, CString& sKey); virtual bool OnUserPart(CString& sChannel, CString& sMessage); virtual bool OnUserTopic(CString& sChannel, CString& sTopic); + virtual bool OnUserTopicRequest(CString& sChannel); virtual bool OnCTCPReply(CNick& Nick, CString& sMessage); virtual bool OnPrivCTCP(CNick& Nick, CString& sMessage); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-09-02 17:25:32
|
Revision: 1186 http://znc.svn.sourceforge.net/znc/?rev=1186&view=rev Author: psychon Date: 2008-09-02 17:25:37 +0000 (Tue, 02 Sep 2008) Log Message: ----------- Fix some channel key-related mess ups. ZNC used to keep track of two channel keys: The current one from the config and the last one it got from a +k channel mode (/mode #chan is done on join). The +k one, if it was known, always overwrote the config one and thus the one from the config doesnt need to be saved anymore. This patch now makes ZNC only use one var to hold the current channel key and this key is NOT overwritten for +k on channels. The reason for the last change: Stupid quakenet. (RFC, anyone?) In /mode replies quakenet always shows '*' as channel key, if one is set. This whole patch started with someone reporting that ZNC kept forgetting the current channel key and used '*' instead... Modified Paths: -------------- trunk/Chan.cpp trunk/Chan.h Modified: trunk/Chan.cpp =================================================================== --- trunk/Chan.cpp 2008-09-02 12:39:18 UTC (rev 1185) +++ trunk/Chan.cpp 2008-09-02 17:25:37 UTC (rev 1186) @@ -207,7 +207,6 @@ void CChan::SetModes(const CString& sModes) { m_musModes.clear(); m_uLimit = 0; - m_sCurKey = ""; ModeChange(sModes); } @@ -331,10 +330,6 @@ break; } - if (uMode == M_Key) { - m_sCurKey = (bAdd) ? sArg : ""; - } - if (!bList) { (bAdd) ? AddMode(uMode, sArg) : RemMode(uMode, sArg); } Modified: trunk/Chan.h =================================================================== --- trunk/Chan.h 2008-09-02 12:39:18 UTC (rev 1185) +++ trunk/Chan.h 2008-09-02 17:25:37 UTC (rev 1186) @@ -131,7 +131,7 @@ bool IsOn() const { return m_bIsOn; } const CString& GetName() const { return m_sName; } const map<unsigned char, CString>& GetModes() const { return m_musModes; } - const CString& GetKey() const { return (!m_sCurKey.empty()) ? m_sCurKey : m_sKey; } + const CString& GetKey() const { return m_sKey; } unsigned int GetLimit() const { return m_uLimit; } const CString& GetTopic() const { return m_sTopic; } const CString& GetTopicOwner() const { return m_sTopicOwner; } @@ -161,7 +161,6 @@ bool m_bDisabled; CString m_sName; CString m_sKey; - CString m_sCurKey; CString m_sTopic; CString m_sTopicOwner; unsigned long m_ulTopicDate; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-09-04 10:28:14
|
Revision: 1189 http://znc.svn.sourceforge.net/znc/?rev=1189&view=rev Author: psychon Date: 2008-09-04 10:28:19 +0000 (Thu, 04 Sep 2008) Log Message: ----------- Add new module call OnMode() It's basically OnRawMode() but once per single mode. Oh and this also fixes a problem where ZNC lost track of chan modes with params (See hunk in CChan::AddMode). Modified Paths: -------------- trunk/Chan.cpp trunk/Modules.cpp trunk/Modules.h Modified: trunk/Chan.cpp =================================================================== --- trunk/Chan.cpp 2008-09-03 16:24:08 UTC (rev 1188) +++ trunk/Chan.cpp 2008-09-04 10:28:19 UTC (rev 1189) @@ -330,6 +330,18 @@ break; } +#ifdef _MODULES + bool bNoChange; + if (bList) { + bNoChange = false; + } else if (bAdd) { + bNoChange = HasMode(uMode) && GetModeArg(uMode) == sArg; + } else { + bNoChange = !HasMode(uMode); + } + MODULECALL(OnMode(*pOpNick, *this, uMode, sArg, bAdd, bNoChange), m_pUser, NULL, ); +#endif + if (!bList) { (bAdd) ? AddMode(uMode, sArg) : RemMode(uMode, sArg); } @@ -372,10 +384,6 @@ } bool CChan::AddMode(unsigned char uMode, const CString& sArg) { - if (HasMode(uMode)) { - return false; - } - m_musModes[uMode] = sArg; return true; } Modified: trunk/Modules.cpp =================================================================== --- trunk/Modules.cpp 2008-09-03 16:24:08 UTC (rev 1188) +++ trunk/Modules.cpp 2008-09-04 10:28:19 UTC (rev 1189) @@ -460,6 +460,7 @@ void CModule::OnVoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange) {} void CModule::OnDevoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange) {} void CModule::OnRawMode(const CNick& OpNick, CChan& Channel, const CString& sModes, const CString& sArgs) {} +void CModule::OnMode(const CNick& OpNick, CChan& Channel, char uMode, const CString& sArg, bool bAdded, bool bNoChange) {} CModule::EModRet CModule::OnRaw(CString& sLine) { return CONTINUE; } @@ -583,6 +584,7 @@ bool CModules::OnVoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange) { MODUNLOADCHK(OnVoice(OpNick, Nick, Channel, bNoChange)); return false; } bool CModules::OnDevoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange) { MODUNLOADCHK(OnDevoice(OpNick, Nick, Channel, bNoChange)); return false; } bool CModules::OnRawMode(const CNick& OpNick, CChan& Channel, const CString& sModes, const CString& sArgs) { MODUNLOADCHK(OnRawMode(OpNick, Channel, sModes, sArgs)); return false; } +bool CModules::OnMode(const CNick& OpNick, CChan& Channel, char uMode, const CString& sArg, bool bAdded, bool bNoChange) { MODUNLOADCHK(OnMode(OpNick, Channel, uMode, sArg, bAdded, bNoChange)); return false; } bool CModules::OnRaw(CString& sLine) { MODHALTCHK(OnRaw(sLine)); } bool CModules::OnUserAttached() { MODUNLOADCHK(OnUserAttached()); return false; } Modified: trunk/Modules.h =================================================================== --- trunk/Modules.h 2008-09-03 16:24:08 UTC (rev 1188) +++ trunk/Modules.h 2008-09-04 10:28:19 UTC (rev 1189) @@ -239,6 +239,7 @@ virtual void OnVoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange); virtual void OnDevoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange); virtual void OnRawMode(const CNick& OpNick, CChan& Channel, const CString& sModes, const CString& sArgs); + virtual void OnMode(const CNick& OpNick, CChan& Channel, char uMode, const CString& sArg, bool bAdded, bool bNoChange); virtual EModRet OnRaw(CString& sLine); @@ -379,6 +380,7 @@ virtual bool OnVoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange); virtual bool OnDevoice(const CNick& OpNick, const CNick& Nick, CChan& Channel, bool bNoChange); virtual bool OnRawMode(const CNick& OpNick, CChan& Channel, const CString& sModes, const CString& sArgs); + virtual bool OnMode(const CNick& OpNick, CChan& Channel, char uMode, const CString& sArg, bool bAdded, bool bNoChange); virtual bool OnRaw(CString& sLine); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <kr...@us...> - 2008-09-07 11:23:50
|
Revision: 1191 http://znc.svn.sourceforge.net/znc/?rev=1191&view=rev Author: kroimon Date: 2008-09-07 11:23:57 +0000 (Sun, 07 Sep 2008) Log Message: ----------- Removed AutoCycle from core Modified Paths: -------------- trunk/Chan.cpp trunk/Chan.h trunk/User.cpp trunk/User.h trunk/modules/webadmin.cpp trunk/znc.cpp Modified: trunk/Chan.cpp =================================================================== --- trunk/Chan.cpp 2008-09-05 19:46:43 UTC (rev 1190) +++ trunk/Chan.cpp 2008-09-07 11:23:57 UTC (rev 1191) @@ -22,7 +22,6 @@ m_bInConfig = bInConfig; m_Nick.SetUser(pUser); - m_bAutoCycle = m_pUser->AutoCycle(); m_bDetached = false; m_uBufferCount = m_pUser->GetBufferCount(); m_bKeepBuffer = m_pUser->KeepBuffer(); @@ -63,8 +62,6 @@ File.Write("\t\tKeepBuffer = " + CString((KeepBuffer()) ? "true" : "false") + "\n"); if (IsDetached()) File.Write("\t\tDetached = true\n"); - if (m_pUser->AutoCycle() != AutoCycle()) - File.Write("\t\tAutoCycle = " + CString((AutoCycle()) ? "true" : "false") + "\n"); if (!GetKey().empty()) { File.Write("\t\tKey = " + GetKey() + "\n"); } if (!GetDefaultModes().empty()) { File.Write("\t\tModes = " + GetDefaultModes() + "\n"); } @@ -76,7 +73,6 @@ // We assume that m_sName and m_pUser are equal SetBufferCount(chan.GetBufferCount()); SetKeepBuffer(chan.KeepBuffer()); - SetAutoCycle(chan.AutoCycle()); SetKey(chan.GetKey()); SetDefaultModes(chan.GetDefaultModes()); @@ -356,10 +352,6 @@ sRet += (sRet.empty()) ? "Detached" : ", Detached"; } - if (AutoCycle()) { - sRet += (sRet.empty()) ? "AutoCycle" : ", AutoCycle"; - } - if (KeepBuffer()) { sRet += (sRet.empty()) ? "KeepBuffer" : ", KeepBuffer"; } @@ -530,16 +522,6 @@ delete it->second; m_msNicks.erase(it); - if (m_msNicks.size() == 1) { - CNick* pNick = m_msNicks.begin()->second; - - if (!pNick->HasPerm(Op) && pNick->GetNick().CaseCmp(m_pUser->GetCurNick()) == 0) { - if (AutoCycle()) { - Cycle(); - } - } - } - return true; } Modified: trunk/Chan.h =================================================================== --- trunk/Chan.h 2008-09-05 19:46:43 UTC (rev 1190) +++ trunk/Chan.h 2008-09-07 11:23:57 UTC (rev 1191) @@ -112,7 +112,6 @@ void SetDefaultModes(const CString& s) { m_sDefaultModes = s; } void SetBufferCount(unsigned int u) { m_uBufferCount = u; } void SetKeepBuffer(bool b) { m_bKeepBuffer = b; } - void SetAutoCycle(bool b) { m_bAutoCycle = b; } void SetWhoDone(bool b = true) { m_bWhoDone = b; } void SetDetached(bool b = true) { m_bDetached = b; } void SetInConfig(bool b) { m_bInConfig = b; } @@ -143,7 +142,6 @@ unsigned int GetNickCount() const { return m_msNicks.size(); } unsigned int GetBufferCount() const { return m_uBufferCount; } bool KeepBuffer() const { return m_bKeepBuffer; } - bool AutoCycle() const { return m_bAutoCycle; } bool IsDetached() const { return m_bDetached; } bool InConfig() const { return m_bInConfig; } unsigned long GetCreationDate() const { return m_ulCreationDate; } @@ -156,7 +154,6 @@ bool m_bIsOn; bool m_bWhoDone; bool m_bKeepBuffer; - bool m_bAutoCycle; bool m_bInConfig; bool m_bDisabled; CString m_sName; Modified: trunk/User.cpp =================================================================== --- trunk/User.cpp 2008-09-05 19:46:43 UTC (rev 1190) +++ trunk/User.cpp 2008-09-07 11:23:57 UTC (rev 1191) @@ -43,7 +43,6 @@ m_uMaxJoinTries = 0; m_uMaxJoins = 5; m_bKeepBuffer = false; - m_bAutoCycle = true; m_bBeingDeleted = false; m_sTimestampFormat = "[%H:%M:%S]"; m_bAppendTimestamp = false; @@ -419,7 +418,6 @@ // Flags SetKeepBuffer(User.KeepBuffer()); - SetAutoCycle(User.AutoCycle()); SetMultiClients(User.MultiClients()); SetBounceDCCs(User.BounceDCCs()); SetUseClientIP(User.UseClientIP()); @@ -577,7 +575,6 @@ PrintLine(File, "KeepBuffer", CString((KeepBuffer()) ? "true" : "false")); PrintLine(File, "MultiClients", CString((MultiClients()) ? "true" : "false")); PrintLine(File, "BounceDCCs", CString((BounceDCCs()) ? "true" : "false")); - PrintLine(File, "AutoCycle", CString((AutoCycle()) ? "true" : "false")); PrintLine(File, "DenyLoadMod", CString((DenyLoadMod()) ? "true" : "false")); PrintLine(File, "Admin", CString((IsAdmin()) ? "true" : "false")); PrintLine(File, "DenySetVHost", CString((DenySetVHost()) ? "true" : "false")); @@ -1036,7 +1033,6 @@ void CUser::SetQuitMsg(const CString& s) { m_sQuitMsg = s; } void CUser::SetBufferCount(unsigned int u) { m_uBufferCount = u; } void CUser::SetKeepBuffer(bool b) { m_bKeepBuffer = b; } -void CUser::SetAutoCycle(bool b) { m_bAutoCycle = b; } void CUser::CheckIRCConnect() { @@ -1114,5 +1110,4 @@ const MCString& CUser::GetCTCPReplies() const { return m_mssCTCPReplies; } unsigned int CUser::GetBufferCount() const { return m_uBufferCount; } bool CUser::KeepBuffer() const { return m_bKeepBuffer; } -bool CUser::AutoCycle() const { return m_bAutoCycle; } // !Getters Modified: trunk/User.h =================================================================== --- trunk/User.h 2008-09-05 19:46:43 UTC (rev 1190) +++ trunk/User.h 2008-09-07 11:23:57 UTC (rev 1191) @@ -133,7 +133,6 @@ bool AddCTCPReply(const CString& sCTCP, const CString& sReply); void SetBufferCount(unsigned int u); void SetKeepBuffer(bool b); - void SetAutoCycle(bool b); void SetChanPrefixes(const CString& s) { m_sChanPrefixes = s; } void SetBeingDeleted(bool b) { m_bBeingDeleted = b; } void SetTimestampFormat(const CString& s) { m_sTimestampFormat = s; } @@ -187,7 +186,6 @@ const MCString& GetCTCPReplies() const; unsigned int GetBufferCount() const; bool KeepBuffer() const; - bool AutoCycle() const; bool IsBeingDeleted() const { return m_bBeingDeleted; } bool HasServers() const { return m_vServers.size() > 0; } float GetTimezoneOffset() const { return m_fTimezoneOffset; } @@ -234,7 +232,6 @@ bool m_bAdmin; bool m_bDenySetVHost; bool m_bKeepBuffer; - bool m_bAutoCycle; bool m_bBeingDeleted; bool m_bAppendTimestamp; bool m_bPrependTimestamp; Modified: trunk/modules/webadmin.cpp =================================================================== --- trunk/modules/webadmin.cpp 2008-09-05 19:46:43 UTC (rev 1190) +++ trunk/modules/webadmin.cpp 2008-09-07 11:23:57 UTC (rev 1191) @@ -684,10 +684,7 @@ m_Template["InConfig"] = "true"; } - CTemplate& o1 = m_Template.AddRow("OptionLoop"); - o1["Name"] = "autocycle"; - o1["DisplayName"] = "Auto Cycle"; - if ((pChan && pChan->AutoCycle()) || (!pChan && m_pUser->AutoCycle())) { o1["Checked"] = "true"; } + /* o1 used to be AutoCycle which was removed */ CTemplate& o2 = m_Template.AddRow("OptionLoop"); o2["Name"] = "keepbuffer"; @@ -723,7 +720,6 @@ pChan->SetDefaultModes(GetParam("defmodes")); pChan->SetBufferCount(GetParam("buffercount").ToUInt()); pChan->SetInConfig(GetParam("save").ToBool()); - pChan->SetAutoCycle(GetParam("autocycle").ToBool()); pChan->SetKeepBuffer(GetParam("keepbuffer").ToBool()); bool bDetached = GetParam("detached").ToBool(); @@ -891,10 +887,7 @@ o1["DisplayName"] = "Keep Buffer"; if (!pUser || pUser->KeepBuffer()) { o1["Checked"] = "true"; } - CTemplate& o2 = m_Template.AddRow("OptionLoop"); - o2["Name"] = "autocycle"; - o2["DisplayName"] = "Auto Cycle"; - if (!pUser || pUser->AutoCycle()) { o2["Checked"] = "true"; } + /* o2 used to be auto cycle which was removed */ CTemplate& o4 = m_Template.AddRow("OptionLoop"); o4["Name"] = "multiclients"; @@ -1112,7 +1105,6 @@ pNewUser->SetKeepBuffer(GetParam("keepbuffer").ToBool()); pNewUser->SetMultiClients(GetParam("multiclients").ToBool()); pNewUser->SetBounceDCCs(GetParam("bouncedccs").ToBool()); - pNewUser->SetAutoCycle(GetParam("autocycle").ToBool()); pNewUser->SetUseClientIP(GetParam("useclientip").ToBool()); pNewUser->SetTimestampAppend(GetParam("appendtimestamp").ToBool()); pNewUser->SetTimestampPrepend(GetParam("prependtimestamp").ToBool()); Modified: trunk/znc.cpp =================================================================== --- trunk/znc.cpp 2008-09-05 19:46:43 UTC (rev 1190) +++ trunk/znc.cpp 2008-09-07 11:23:57 UTC (rev 1191) @@ -1134,7 +1134,9 @@ pChan->SetDetached((sValue.CaseCmp("true") == 0)); continue; } else if (sName.CaseCmp("AutoCycle") == 0) { - pChan->SetAutoCycle((sValue.CaseCmp("true") == 0)); + if (sValue.CaseCmp("true") == 0) { + CUtils::PrintError("WARNING: AutoCycle has been removed, instead try -> LoadModule = autocycle " + pChan->GetName()); + } continue; } else if (sName.CaseCmp("Key") == 0) { pChan->SetKey(sValue); @@ -1150,9 +1152,6 @@ } else if (sName.CaseCmp("KeepBuffer") == 0) { pUser->SetKeepBuffer((sValue.CaseCmp("true") == 0)); continue; - } else if (sName.CaseCmp("AutoCycle") == 0) { - pUser->SetAutoCycle((sValue.CaseCmp("true") == 0)); - continue; } else if (sName.CaseCmp("Nick") == 0) { pUser->SetNick(sValue); continue; @@ -1168,6 +1167,11 @@ } else if (sName.CaseCmp("AwaySuffix") == 0) { CUtils::PrintMessage("WARNING: AwaySuffix has been depricated, instead try -> LoadModule = awaynick %nick%_" + sValue); continue; + } else if (sName.CaseCmp("AutoCycle") == 0) { + if (sValue.CaseCmp("true") == 0) { + CUtils::PrintError("WARNING: AutoCycle has been removed, instead try -> LoadModule = autocycle"); + } + continue; } else if (sName.CaseCmp("Pass") == 0) { // There are different formats for this available: // Pass = <plain text> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ps...@us...> - 2008-09-07 16:25:08
|
Revision: 1193 http://znc.svn.sourceforge.net/znc/?rev=1193&view=rev Author: psychon Date: 2008-09-07 16:25:11 +0000 (Sun, 07 Sep 2008) Log Message: ----------- Make ./configure --help output look a little better Modified Paths: -------------- trunk/configure trunk/configure.in Modified: trunk/configure =================================================================== --- trunk/configure 2008-09-07 11:50:43 UTC (rev 1192) +++ trunk/configure 2008-09-07 16:25:11 UTC (rev 1193) @@ -1239,13 +1239,11 @@ Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-openssl=/path/to/openssl + --with-openssl=DIR openssl's installation prefix + --with-module-prefix module object code [LIBDIR/znc] + --with-module-data-prefix=DIR + static module data (webadmin skins) [DATADIR/znc] - --with-module-prefix=/path/to/moduledir - - --with-module-data-prefix=/path/to/moduledir - - Some influential environment variables: CXX C++ compiler command CXXFLAGS C++ compiler flags Modified: trunk/configure.in =================================================================== --- trunk/configure.in 2008-09-07 11:50:43 UTC (rev 1192) +++ trunk/configure.in 2008-09-07 16:25:11 UTC (rev 1193) @@ -64,7 +64,7 @@ fi AC_ARG_WITH( [openssl], - AC_HELP_STRING([--with-openssl=/path/to/openssl], []), + AC_HELP_STRING([--with-openssl=DIR], [openssl's installation prefix]), [OPENSSL=$withval],) AC_ARG_ENABLE( [debug], AC_HELP_STRING([--enable-debug], [enable debuging]), @@ -126,12 +126,14 @@ fi AC_ARG_WITH( [module-prefix], - AC_HELP_STRING([--with-module-prefix=/path/to/moduledir], []), + AC_HELP_STRING([--with-module-prefix], + [module object code [[LIBDIR/znc]]]), [MODDIR=$withval], [MODDIR="${libdir}/znc"] ) AC_ARG_WITH( [module-data-prefix], - AC_HELP_STRING([--with-module-data-prefix=/path/to/moduledir], []), + AC_HELP_STRING([--with-module-data-prefix=DIR], + [static module data (webadmin skins) [[DATADIR/znc]]]), [DATADIR=$withval], [DATADIR="${datadir}/znc"] ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |