diff --git a/User.cpp b/User.cpp index 1f596da6..af82876c 100644 --- a/User.cpp +++ b/User.cpp @@ -15,6 +15,7 @@ #include "znc.h" CUser::CUser(const CString& sUserName) { + m_pIRCSock = NULL; m_fTimezoneOffset = 0; m_uConnectTime = 0; SetUserName(sUserName); @@ -105,6 +106,8 @@ void CUser::DelServers() } void CUser::IRCConnected(CIRCSock* pIRCSock) { + m_pIRCSock = pIRCSock; + for (unsigned int a = 0; a < m_vClients.size(); a++) { m_vClients[a]->IRCConnected(pIRCSock); } @@ -113,6 +116,8 @@ void CUser::IRCConnected(CIRCSock* pIRCSock) { void CUser::IRCDisconnected() { m_bIRCConnected = false; + m_pIRCSock = NULL; + for (unsigned int a = 0; a < m_vClients.size(); a++) { m_vClients[a]->IRCDisconnected(); } @@ -802,13 +807,11 @@ bool CUser::CheckPass(const CString& sPass) { }*/ CIRCSock* CUser::GetIRCSock() { - // Todo: optimize this by saving a pointer to the sock - return (CIRCSock*) CZNC::Get().GetManager().FindSockByName("IRC::" + m_sUserName); + return m_pIRCSock; } const CIRCSock* CUser::GetIRCSock() const { - // Todo: same as above - return (CIRCSock*) CZNC::Get().GetManager().FindSockByName("IRC::" + m_sUserName); + return m_pIRCSock; } CString CUser::GetLocalIP() { diff --git a/User.h b/User.h index 2803d170..3dbad504 100644 --- a/User.h +++ b/User.h @@ -240,6 +240,7 @@ protected: bool m_bAppendTimestamp; bool m_bPrependTimestamp; bool m_bIRCConnectEnabled; + CIRCSock* m_pIRCSock; CKeepNickTimer* m_pKeepNickTimer; CJoinTimer* m_pJoinTimer; diff --git a/znc.cpp b/znc.cpp index e9066c87..4b9359f6 100644 --- a/znc.cpp +++ b/znc.cpp @@ -100,6 +100,8 @@ bool CZNC::OnBoot() { bool CZNC::ConnectUser(CUser *pUser) { CString sSockName = "IRC::" + pUser->GetUserName(); + // Don't use pUser->GetIRCSock(), as that only returns something if the + // CIRCSock is already connected, not when it's still connecting! CIRCSock* pIRCSock = (CIRCSock*) m_Manager.FindSockByName(sSockName); if (m_pISpoofLockFile != NULL) {