diff --git a/Csocket.h b/Csocket.h index 6943b643..fae20956 100644 --- a/Csocket.h +++ b/Csocket.h @@ -864,6 +864,9 @@ public: */ virtual void ReadPaused() {} + //! return the duration since last write + int GetLastWriteDuration() { return m_iTcount; } + //! return the data imediatly ready for read virtual int GetPending(); diff --git a/Timers.h b/Timers.h index 75df6de1..018d72b9 100644 --- a/Timers.h +++ b/Timers.h @@ -28,6 +28,31 @@ protected: unsigned int m_uTrys; }; +class CMiscTimer : public CCron { +public: + CMiscTimer(CUser* pUser) : CCron() { + m_pUser = pUser; + Start(30); + } + virtual ~CMiscTimer() {} + +private: +protected: + virtual void RunJob() { + vector& vClients = m_pUser->GetClients(); + + for (size_t a = 0; a < vClients.size(); a++) { + CClient* pClient = vClients[a]; + + if (pClient->GetLastWriteDuration() >= 470) { + pClient->PutClient("PING :ZNC"); + } + } + } + + CUser* m_pUser; +}; + class CJoinTimer : public CCron { public: CJoinTimer(CUser* pUser) : CCron() { diff --git a/User.cpp b/User.cpp index 10f06c7f..8a078f13 100644 --- a/User.cpp +++ b/User.cpp @@ -38,8 +38,10 @@ CUser::CUser(const CString& sUserName) { m_pAwayNickTimer = NULL; 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; m_sDLPath = GetUserPath() + "/downloads"; } @@ -60,6 +62,7 @@ CUser::~CUser() { CZNC::Get().GetManager().DelCronByAddr(m_pAwayNickTimer); CZNC::Get().GetManager().DelCronByAddr(m_pKeepNickTimer); CZNC::Get().GetManager().DelCronByAddr(m_pJoinTimer); + CZNC::Get().GetManager().DelCronByAddr(m_pMiscTimer); } #ifdef _MODULES diff --git a/User.h b/User.h index b0a6479c..6e708f95 100644 --- a/User.h +++ b/User.h @@ -24,6 +24,7 @@ class CBackNickTimer; class CAwayNickTimer; class CKeepNickTimer; class CJoinTimer; +class CMiscTimer; class CUser { public: @@ -206,6 +207,7 @@ protected: CAwayNickTimer* m_pAwayNickTimer; CKeepNickTimer* m_pKeepNickTimer; CJoinTimer* m_pJoinTimer; + CMiscTimer* m_pMiscTimer; vector m_vServers; vector m_vChans; diff --git a/znc.cpp b/znc.cpp index eaf5d2d9..7c47989e 100644 --- a/znc.cpp +++ b/znc.cpp @@ -24,7 +24,6 @@ CZNC::CZNC() { CZNC::~CZNC() { #ifdef _MODULES m_pModules->UnloadAll(); - delete m_pModules; for (map::iterator a = m_msUsers.begin(); a != m_msUsers.end(); a++) { a->second->GetModules().UnloadAll(); @@ -37,6 +36,7 @@ CZNC::~CZNC() { m_Manager.Cleanup(); DeleteUsers(); + delete m_pModules; } CString CZNC::GetTag(bool bIncludeVersion) {