From b5a3cd3727943300a1a37168b9d6c295eb79a18e Mon Sep 17 00:00:00 2001 From: prozacx Date: Sun, 9 Oct 2005 21:47:57 +0000 Subject: [PATCH] Fixed AwayNick timer and added BackNick timer git-svn-id: https://znc.svn.sourceforge.net/svnroot/znc/trunk@553 726aef4b-f618-498e-8847-2d620e286838 --- IRCSock.cpp | 10 ++-------- IRCSock.h | 2 -- Timers.h | 36 ++++++++++++++++++++++++++++++++++-- User.cpp | 29 ++++++++++++++++++++++++----- User.h | 7 +++++++ 5 files changed, 67 insertions(+), 17 deletions(-) diff --git a/IRCSock.cpp b/IRCSock.cpp index e5fa782b..6a6dc5bb 100644 --- a/IRCSock.cpp +++ b/IRCSock.cpp @@ -2,12 +2,10 @@ #include "IRCSock.h" #include "DCCBounce.h" #include "UserSock.h" -#include "Timers.h" #include CIRCSock::CIRCSock(CUser* pUser) : Csock() { m_pUser = pUser; - m_pAwayNickTimer = NULL; m_bISpoofReleased = false; m_bKeepNick = true; m_bAuthed = false; @@ -49,8 +47,6 @@ CIRCSock::~CIRCSock() { PutServ("QUIT :" + m_pUser->GetQuitMsg()); m_msChans.clear(); - - CZNC::Get().GetManager().DelCronByAddr(m_pAwayNickTimer); } void CIRCSock::ReadLine(const CString& sData) { @@ -87,10 +83,8 @@ void CIRCSock::ReadLine(const CString& sData) { m_pUser->SetIRCServer(sServer); SetTimeout(900); // Now that we are connected, let nature take its course PutServ("WHO " + sNick); - if (!m_pAwayNickTimer) { - m_pAwayNickTimer = new CAwayNickTimer(m_pUser); - CZNC::Get().GetManager().AddCron(m_pAwayNickTimer); - } + + m_pUser->StartAwayNickTimer(); VOIDMODULECALL(OnIRCConnected()); diff --git a/IRCSock.h b/IRCSock.h index 7bb5173e..85418093 100644 --- a/IRCSock.h +++ b/IRCSock.h @@ -8,7 +8,6 @@ // Forward Declarations class CZNC; -class CAwayNickTimer; // !Forward Declarations class CIRCSock : public Csock { @@ -80,7 +79,6 @@ protected: CString m_sPass; map m_msChans; unsigned int m_uMaxNickLen; - CAwayNickTimer* m_pAwayNickTimer; }; #endif // !_IRCSOCK_H diff --git a/Timers.h b/Timers.h index bded26e9..1b60b782 100644 --- a/Timers.h +++ b/Timers.h @@ -47,6 +47,36 @@ protected: CUser* m_pUser; }; +class CBackNickTimer : public CCron { +public: + CBackNickTimer(CUser* pUser) : CCron() { + m_pUser = pUser; + Start(3); + } + virtual ~CBackNickTimer() {} + +private: +protected: + virtual void RunJob() { + if (m_pUser->IsUserAttached()) { + CIRCSock* pSock = m_pUser->GetIRCSock(); + + if (pSock) { + CString sConfNick = m_pUser->GetNick(); + + if (pSock->GetNick().CaseCmp(CNick::Concat(sConfNick, m_pUser->GetAwaySuffix(), pSock->GetMaxNickLen())) == 0) { + pSock->PutServ("NICK " + sConfNick); + } + } + } + + CZNC::Get().GetManager().DelCronByAddr(this); + m_pUser->DelBackNickTimer(); + } + + CUser* m_pUser; +}; + class CAwayNickTimer : public CCron { public: @@ -61,17 +91,19 @@ protected: virtual void RunJob() { if (!m_pUser->IsUserAttached()) { CIRCSock* pSock = m_pUser->GetIRCSock(); + if (pSock) { const CString& sSuffix = m_pUser->GetAwaySuffix(); if (!sSuffix.empty()) { - CString sNewNick = CNick::Concat(m_pUser->GetNick(), sSuffix, pSock->GetMaxNickLen()); - pSock->PutServ("NICK " + sNewNick); + CString sAwayNick = CNick::Concat(m_pUser->GetNick(), sSuffix, pSock->GetMaxNickLen()); + pSock->PutServ("NICK " + sAwayNick); } } } CZNC::Get().GetManager().DelCronByAddr(this); + m_pUser->DelAwayNickTimer(); } CUser* m_pUser; diff --git a/User.cpp b/User.cpp index 98e89b82..e5822c52 100644 --- a/User.cpp +++ b/User.cpp @@ -32,6 +32,8 @@ CUser::CUser(const CString& sUserName) { m_uBufferCount = 50; m_bKeepBuffer = false; m_bAutoCycle = true; + m_pBackNickTimer = NULL; + m_pAwayNickTimer = NULL; m_pKeepNickTimer = new CKeepNickTimer(this); m_pJoinTimer = new CJoinTimer(this); CZNC::Get().GetManager().AddCron(m_pKeepNickTimer); @@ -56,6 +58,8 @@ CUser::~CUser() { CZNC::Get().GetManager().DelSockByAddr(m_vUserSocks[c]); } + CZNC::Get().GetManager().DelCronByAddr(m_pBackNickTimer); + CZNC::Get().GetManager().DelCronByAddr(m_pAwayNickTimer); CZNC::Get().GetManager().DelCronByAddr(m_pKeepNickTimer); CZNC::Get().GetManager().DelCronByAddr(m_pJoinTimer); } @@ -89,12 +93,13 @@ void CUser::IRCDisconnected() { void CUser::UserConnected(CUserSock* pUserSock) { m_vUserSocks.push_back(pUserSock); - CString sConfNick = GetNick(); CIRCSock* pIRCSock = GetIRCSock(); + CString sConfNick = GetNick(); if (pIRCSock) { if (pIRCSock->GetNick().CaseCmp(CNick::Concat(sConfNick, GetAwaySuffix(), pIRCSock->GetMaxNickLen())) == 0) { - PutIRC("NICK " + sConfNick); + m_pBackNickTimer = new CBackNickTimer(this); + CZNC::Get().GetManager().AddCron(m_pBackNickTimer); } } @@ -134,18 +139,32 @@ void CUser::UserConnected(CUserSock* pUserSock) { } } -void CUser::UserDisconnected(CUserSock* pUserSock) { - /*if (!m_pAwayNickTimer) { +void CUser::StartAwayNickTimer() { + if (!m_pAwayNickTimer) { m_pAwayNickTimer = new CAwayNickTimer(this); CZNC::Get().GetManager().AddCron(m_pAwayNickTimer); - }*/ + } +} +void CUser::DelAwayNickTimer() { + m_pAwayNickTimer = NULL; +} + +void CUser::DelBackNickTimer() { + m_pBackNickTimer = NULL; +} + +void CUser::UserDisconnected(CUserSock* pUserSock) { for (unsigned int a = 0; a < m_vUserSocks.size(); a++) { if (m_vUserSocks[a] == pUserSock) { m_vUserSocks.erase(m_vUserSocks.begin() + a); break; } } + + if (!IsUserAttached()) { + StartAwayNickTimer(); + } } bool CUser::Clone(const CUser& User, CString& sErrorRet) { diff --git a/User.h b/User.h index 49c13edf..6816b29b 100644 --- a/User.h +++ b/User.h @@ -20,6 +20,8 @@ class CChan; class CServer; class CIRCSock; class CUserSock; +class CBackNickTimer; +class CAwayNickTimer; class CKeepNickTimer; class CJoinTimer; @@ -85,6 +87,9 @@ public: bool ResumeFile(const CString& sRemoteNick, unsigned short uPort, unsigned long uFileSize); CString GetCurNick(); bool Clone(const CUser& User, CString& sErrorRet); + void StartAwayNickTimer(); + void DelAwayNickTimer(); + void DelBackNickTimer(); // Setters void SetUserName(const CString& s); @@ -186,6 +191,8 @@ protected: bool m_bKeepBuffer; bool m_bAutoCycle; + CBackNickTimer* m_pBackNickTimer; + CAwayNickTimer* m_pAwayNickTimer; CKeepNickTimer* m_pKeepNickTimer; CJoinTimer* m_pJoinTimer;