diff --git a/znc.cpp b/znc.cpp index 8e554e5d..e46d91b1 100644 --- a/znc.cpp +++ b/znc.cpp @@ -130,45 +130,55 @@ bool CZNC::ConnectUser(CUser *pUser) { return true; } +bool CZNC::HandleUserDeletion() +{ + map::iterator it; + map::iterator end; + + if (m_msDelUsers.size() == 0) + return false; + + end = m_msDelUsers.end(); + for (it = m_msDelUsers.begin(); it != end; it++) { + CUser* pUser = it->second; + pUser->SetBeingDeleted(true); + +#ifdef _MODULES + if (GetModules().OnDeleteUser(*pUser)) { + pUser->SetBeingDeleted(false); + continue; + } +#endif + m_msUsers.erase(pUser->GetUserName()); + + CIRCSock* pIRCSock = pUser->GetIRCSock(); + + if (pIRCSock) { + m_Manager.DelSockByAddr(pIRCSock); + } + + pUser->DelClients(); +#ifdef _MODULES + pUser->DelModules(); +#endif + AddBytesRead(pUser->BytesRead()); + AddBytesWritten(pUser->BytesWritten()); + delete pUser; + } + + m_msDelUsers.clear(); + RestartConnectUser(); + + return true; +} + int CZNC::Loop() { EnableConnectUser(); while (true) { // Check for users that need to be deleted - map::iterator it; - map::iterator end; - - if (m_msDelUsers.size()) { - end = m_msDelUsers.end(); - for (it = m_msDelUsers.begin(); it != end; it++) { - CUser* pUser = it->second; - pUser->SetBeingDeleted(true); - -#ifdef _MODULES - if (GetModules().OnDeleteUser(*pUser)) { - pUser->SetBeingDeleted(false); - continue; - } -#endif - m_msUsers.erase(pUser->GetUserName()); - - CIRCSock* pIRCSock = pUser->GetIRCSock(); - - if (pIRCSock) { - m_Manager.DelSockByAddr(pIRCSock); - } - - pUser->DelClients(); -#ifdef _MODULES - pUser->DelModules(); -#endif - AddBytesRead(pUser->BytesRead()); - AddBytesWritten(pUser->BytesWritten()); - delete pUser; - } - - m_msDelUsers.clear(); - RestartConnectUser(); + if (HandleUserDeletion()) { + // Also remove those user(s) from the config file WriteConfig(); } diff --git a/znc.h b/znc.h index c9bccfc7..559cb051 100644 --- a/znc.h +++ b/znc.h @@ -172,6 +172,8 @@ public: void RestartConnectUser(); private: + // Returns true if something was done + bool HandleUserDeletion(); protected: vector m_vpListeners; map m_msUsers;