diff --git a/IRCSock.cpp b/IRCSock.cpp index a0aa4b18..afd66859 100644 --- a/IRCSock.cpp +++ b/IRCSock.cpp @@ -9,6 +9,7 @@ CIRCSock::CIRCSock(CZNC* pZNC, CUser* pUser) : Csock() { m_pZNC = pZNC; m_pUser = pUser; m_pUserSock = NULL; + m_pAwayNickTimer = NULL; m_uQueryBufferCount = 50; m_bISpoofReleased = false; m_bKeepNick = true; @@ -56,6 +57,8 @@ CIRCSock::~CIRCSock() { PutServ("QUIT :" + m_pUser->GetQuitMsg()); m_msChans.clear(); + + m_pZNC->GetManager().DelCronByAddr(m_pAwayNickTimer); } void CIRCSock::ReadLine(const CString& sData) { @@ -91,7 +94,10 @@ void CIRCSock::ReadLine(const CString& sData) { case 1: {// :irc.server.com 001 nick :Welcome to the Internet Relay Network nick SetTimeout(900); // Now that we are connected, let nature take its course PutServ("WHO " + sNick); - m_pZNC->GetManager().AddCron(new CAwayNickTimer(m_pUser)); + if (!m_pAwayNickTimer) { + m_pAwayNickTimer = new CAwayNickTimer(m_pUser); + m_pZNC->GetManager().AddCron(m_pAwayNickTimer); + } VOIDMODULECALL(OnIRCConnected()); @@ -803,8 +809,9 @@ void CIRCSock::UserConnected(CUserSock* pUserSock) { } void CIRCSock::UserDisconnected() { - if (m_pUserSock) { - m_pZNC->GetManager().AddCron(new CAwayNickTimer(m_pUser)); + if (m_pUserSock && !m_pAwayNickTimer) { + m_pAwayNickTimer = new CAwayNickTimer(m_pUser); + m_pZNC->GetManager().AddCron(m_pAwayNickTimer); } m_pUserSock = NULL; @@ -887,7 +894,7 @@ void CIRCSock::ParseISupport(const CString& sLine) { if (sName.CaseCmp("PREFIX") == 0) { CString sPrefixes = sValue.Token(1, false, ")"); CString sPermModes = sValue.Token(0, false, ")"); - sPermModes.LeftTrim("("); + sPermModes.TrimLeft("("); if (!sPrefixes.empty() && sPermModes.size() == sPrefixes.size()) { m_sPerms = sPrefixes; diff --git a/IRCSock.h b/IRCSock.h index 4167a98f..e3810f53 100644 --- a/IRCSock.h +++ b/IRCSock.h @@ -9,6 +9,7 @@ // Forward Declarations class CZNC; class CUserSock; +class CAwayNickTimer; // !Forward Declarations class CIRCSock : public Csock { @@ -90,6 +91,7 @@ protected: map m_msChans; unsigned int m_uMaxNickLen; unsigned int m_uQueryBufferCount; + CAwayNickTimer* m_pAwayNickTimer; CBuffer m_QueryBuffer; }; diff --git a/User.cpp b/User.cpp index 67fa58b2..351d0f27 100644 --- a/User.cpp +++ b/User.cpp @@ -28,8 +28,10 @@ CUser::CUser(const CString& sUserName, CZNC* pZNC) { m_sStatusPrefix = "*"; m_uBufferCount = 50; m_bKeepBuffer = false; - m_pZNC->GetManager().AddCron(new CKeepNickTimer(this)); - m_pZNC->GetManager().AddCron(new CJoinTimer(this)); + m_pKeepNickTimer = new CKeepNickTimer(this); + m_pJoinTimer = new CJoinTimer(this); + m_pZNC->GetManager().AddCron(m_pKeepNickTimer); + m_pZNC->GetManager().AddCron(m_pJoinTimer); m_sUserPath = m_pZNC->GetUserPath() + "/" + sUserName; m_sDLPath = GetUserPath() + "/downloads"; } @@ -45,6 +47,9 @@ CUser::~CUser() { for (unsigned int b = 0; b < m_vChans.size(); b++) { delete m_vChans[b]; } + + m_pZNC->GetManager().DelCronByAddr(m_pKeepNickTimer); + m_pZNC->GetManager().DelCronByAddr(m_pJoinTimer); } bool CUser::OnBoot() { diff --git a/User.h b/User.h index b47b1466..79b395ff 100644 --- a/User.h +++ b/User.h @@ -19,6 +19,8 @@ class CChan; class CServer; class CIRCSock; class CUserSock; +class CKeepNickTimer; +class CJoinTimer; class CUser { public: @@ -154,6 +156,9 @@ protected: bool m_bDenyLoadMod; bool m_bKeepBuffer; + CKeepNickTimer* m_pKeepNickTimer; + CJoinTimer* m_pJoinTimer; + vector m_vServers; vector m_vChans; set m_ssAllowedHosts;