From c315a07d1ec870a59a790ef37425d3ed175f45dd Mon Sep 17 00:00:00 2001 From: prozacx Date: Mon, 4 Jul 2005 23:14:43 +0000 Subject: [PATCH] Added DeleteUser() FindUser() and a method for deleting users git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@405 726aef4b-f618-498e-8847-2d620e286838 --- znc.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- znc.h | 4 ++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/znc.cpp b/znc.cpp index f535a395..4e8e490e 100644 --- a/znc.cpp +++ b/znc.cpp @@ -65,6 +65,30 @@ int CZNC::Loop() { m_itUserIter = m_msUsers.begin(); while (true) { + // Check for users that need to be deleted + if (m_ssDelUsers.size()) { + for (set::iterator it = m_ssDelUsers.begin(); it != m_ssDelUsers.end(); it++) { + CUser* pUser = *it; + m_msUsers.erase(pUser->GetUserName()); + CUserSock* pUserSock = pUser->GetUserSock(); + + if (pUserSock) { + m_Manager.DelSockByAddr(pUserSock); + } + + CIRCSock* pIRCSock = pUser->GetIRCSock(); + + if (pIRCSock) { + m_Manager.DelSockByAddr(pIRCSock); + } + + delete pUser; + } + + m_ssDelUsers.clear(); + m_itUserIter = m_msUsers.begin(); + } + m_Manager.Loop(); if (m_bISpoofLocked) { @@ -75,6 +99,11 @@ int CZNC::Loop() { m_itUserIter = m_msUsers.begin(); } + if (m_msUsers.empty()) { + usleep(10000); + continue; + } + CString sSockName = "IRC::" + m_itUserIter->first; CUser* pUser = m_itUserIter->second; @@ -618,7 +647,7 @@ bool CZNC::ParseConfig(const CString& sConfig) { return false; } - m_msUsers[pUser->GetUserName()] = pUser; + AddUser(pUser); pUser = NULL; continue; @@ -944,3 +973,36 @@ CString CZNC::FindModPath(const CString& sModule) const { return sModPath; } + +CUser* CZNC::FindUser(const CString& sUsername) { + map::iterator it = m_msUsers.find(sUsername); + + if (it != m_msUsers.end()) { + return it->second; + } + + return NULL; +} + +bool CZNC::DeleteUser(const CString& sUsername) { + CUser* pUser = FindUser(sUsername); + + if (!pUser) { + return false; + } + + m_ssDelUsers.insert(pUser); + return true; +} + +bool CZNC::AddUser(CUser* pUser) { + CString sErr; + + if (pUser->IsValid(sErr)) { + m_msUsers[pUser->GetUserName()] = pUser; + return true; + } + + DEBUG_ONLY(cout << "Invalid user [" << pUser->GetUserName() << "] - [" << sErr << "]" << endl); + return false; +} diff --git a/znc.h b/znc.h index 9808cc31..c9a9323d 100644 --- a/znc.h +++ b/znc.h @@ -57,12 +57,16 @@ public: return pZNC; } + CUser* FindUser(const CString& sUsername); + bool DeleteUser(const CString& sUsername); + bool AddUser(CUser* pUser); const map & GetUserMap() const { return( m_msUsers ); } private: protected: unsigned short m_uListenPort; map m_msUsers; + set m_ssDelUsers; TSocketManager m_Manager; CString m_sCurPath;