From bce4e60c08fa59909811d8ef411190403c627f44 Mon Sep 17 00:00:00 2001 From: Kyle Fuller Date: Sun, 2 Oct 2011 18:37:20 +0000 Subject: [PATCH] Allow a client to become "away" The result of CIRCNetwork::IsUserOnline() will only show clients which do not have the away state set. This value is not set from the IRC command AWAY, but a future module could use this behaviour. Some CIRCNetwork::IsUserAttached() checks are now moved into of CIRCNetwork::IsUserOnline() checks. This allows "away" clients to store buffer even if KeepBuffer is false. --- include/znc/Client.h | 4 ++++ include/znc/IRCNetwork.h | 1 + modules/buffextras.cpp | 2 +- src/IRCNetwork.cpp | 12 ++++++++++++ src/IRCSock.cpp | 14 +++++++------- 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/include/znc/Client.h b/include/znc/Client.h index 22115fee..090998ee 100644 --- a/include/znc/Client.h +++ b/include/znc/Client.h @@ -84,6 +84,7 @@ public: m_bInCap = false; m_bNamesx = false; m_bUHNames = false; + m_bAway = false; EnableReadLine(); // RFC says a line can have 512 chars max, but we are // a little more gentle ;) @@ -101,6 +102,7 @@ public: CString GetNickMask() const; bool HasNamesx() const { return m_bNamesx; } bool HasUHNames() const { return m_bUHNames; } + bool IsAway() const { return m_bAway; } void UserCommand(CString& sLine); void UserPortCommand(CString& sLine); @@ -129,6 +131,7 @@ public: virtual void ReachedMaxBuffer(); void SetNick(const CString& s); + void SetAway(bool bAway) { m_bAway = bAway; } CUser* GetUser() const { return m_pUser; } void SetNetwork(CIRCNetwork* pNetwork, bool bDisconnect=true, bool bReconnect=true); CIRCNetwork* GetNetwork() const { return m_pNetwork; } @@ -147,6 +150,7 @@ protected: bool m_bInCap; bool m_bNamesx; bool m_bUHNames; + bool m_bAway; CUser* m_pUser; CIRCNetwork* m_pNetwork; CString m_sNick; diff --git a/include/znc/IRCNetwork.h b/include/znc/IRCNetwork.h index 524c407a..c4f5245b 100644 --- a/include/znc/IRCNetwork.h +++ b/include/znc/IRCNetwork.h @@ -43,6 +43,7 @@ public: void BounceAllClients(); bool IsUserAttached() const { return !m_vClients.empty(); } + bool IsUserOnline() const; void ClientConnected(CClient *pClient); void ClientDisconnected(CClient *pClient); diff --git a/modules/buffextras.cpp b/modules/buffextras.cpp index 75b113c5..1fa316e5 100644 --- a/modules/buffextras.cpp +++ b/modules/buffextras.cpp @@ -18,7 +18,7 @@ public: void AddBuffer(CChan& Channel, const CString& sMessage) { // If they have keep buffer disabled, only add messages if no client is connected - if (!Channel.KeepBuffer() && m_pUser->IsUserAttached()) + if (!Channel.KeepBuffer() && m_pUser->IsUserOnline()) return; CString s = ":" + GetModNick() + "!" + GetModName() + "@znc.in PRIVMSG " diff --git a/src/IRCNetwork.cpp b/src/IRCNetwork.cpp index 18c72c5f..ade7b921 100644 --- a/src/IRCNetwork.cpp +++ b/src/IRCNetwork.cpp @@ -325,6 +325,18 @@ void CIRCNetwork::BounceAllClients() { m_vClients.clear(); } +bool CIRCNetwork::IsUserOnline() const { + vector::const_iterator it; + for (it = m_vClients.begin(); it != m_vClients.end(); ++it) { + CClient *pClient = *it; + if (!pClient->IsAway()) { + return true; + } + } + + return false; +} + void CIRCNetwork::ClientConnected(CClient *pClient) { if (!m_pUser->MultiClients()) { BounceAllClients(); diff --git a/src/IRCSock.cpp b/src/IRCSock.cpp index ae09a973..c7ed06dd 100644 --- a/src/IRCSock.cpp +++ b/src/IRCSock.cpp @@ -652,7 +652,7 @@ void CIRCSock::ReadLine(const CString& sData) { // :blub!dummy@rox-8DBEFE92 WALLOPS :this is a test CString sMsg = sRest.Token(0, true).TrimPrefix_n(); - if (!m_pNetwork->IsUserAttached()) { + if (!m_pNetwork->IsUserOnline()) { m_pNetwork->AddQueryBuffer(":" + Nick.GetNickMask() + " WALLOPS ", ":" + m_pNetwork->GetUser()->AddTimestamp(sMsg), false); } } else if (sCmd.Equals("CAP")) { @@ -758,7 +758,7 @@ bool CIRCSock::OnPrivCTCP(CNick& Nick, CString& sMessage) { if (sMessage.TrimPrefix("ACTION ")) { NETWORKMODULECALL(OnPrivAction(Nick, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); - if (!m_pNetwork->IsUserAttached()) { + if (!m_pNetwork->IsUserOnline()) { // If the user is detached, add to the buffer m_pNetwork->AddQueryBuffer(":" + Nick.GetNickMask() + " PRIVMSG ", " :\001ACTION " + m_pNetwork->GetUser()->AddTimestamp(sMessage) + "\001"); } @@ -813,7 +813,7 @@ bool CIRCSock::OnGeneralCTCP(CNick& Nick, CString& sMessage) { bool CIRCSock::OnPrivNotice(CNick& Nick, CString& sMessage) { NETWORKMODULECALL(OnPrivNotice(Nick, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); - if (!m_pNetwork->IsUserAttached()) { + if (!m_pNetwork->IsUserOnline()) { // If the user is detached, add to the buffer m_pNetwork->AddQueryBuffer(":" + Nick.GetNickMask() + " NOTICE ", " :" + m_pNetwork->GetUser()->AddTimestamp(sMessage)); } @@ -824,7 +824,7 @@ bool CIRCSock::OnPrivNotice(CNick& Nick, CString& sMessage) { bool CIRCSock::OnPrivMsg(CNick& Nick, CString& sMessage) { NETWORKMODULECALL(OnPrivMsg(Nick, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); - if (!m_pNetwork->IsUserAttached()) { + if (!m_pNetwork->IsUserOnline()) { // If the user is detached, add to the buffer m_pNetwork->AddQueryBuffer(":" + Nick.GetNickMask() + " PRIVMSG ", " :" + m_pNetwork->GetUser()->AddTimestamp(sMessage)); } @@ -840,7 +840,7 @@ bool CIRCSock::OnChanCTCP(CNick& Nick, const CString& sChan, CString& sMessage) // Record a /me if (sMessage.TrimPrefix("ACTION ")) { NETWORKMODULECALL(OnChanAction(Nick, *pChan, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); - if (pChan->KeepBuffer() || !m_pNetwork->IsUserAttached() || pChan->IsDetached()) { + if (pChan->KeepBuffer() || !m_pNetwork->IsUserOnline() || pChan->IsDetached()) { pChan->AddBuffer(":" + Nick.GetNickMask() + " PRIVMSG " + sChan + " :\001ACTION " + m_pNetwork->GetUser()->AddTimestamp(sMessage) + "\001"); } sMessage = "ACTION " + sMessage; @@ -858,7 +858,7 @@ bool CIRCSock::OnChanNotice(CNick& Nick, const CString& sChan, CString& sMessage if (pChan) { NETWORKMODULECALL(OnChanNotice(Nick, *pChan, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); - if (pChan->KeepBuffer() || !m_pNetwork->IsUserAttached() || pChan->IsDetached()) { + if (pChan->KeepBuffer() || !m_pNetwork->IsUserOnline() || pChan->IsDetached()) { pChan->AddBuffer(":" + Nick.GetNickMask() + " NOTICE " + sChan + " :" + m_pNetwork->GetUser()->AddTimestamp(sMessage)); } } @@ -871,7 +871,7 @@ bool CIRCSock::OnChanMsg(CNick& Nick, const CString& sChan, CString& sMessage) { if (pChan) { NETWORKMODULECALL(OnChanMsg(Nick, *pChan, sMessage), m_pNetwork->GetUser(), m_pNetwork, NULL, return true); - if (pChan->KeepBuffer() || !m_pNetwork->IsUserAttached() || pChan->IsDetached()) { + if (pChan->KeepBuffer() || !m_pNetwork->IsUserOnline() || pChan->IsDetached()) { pChan->AddBuffer(":" + Nick.GetNickMask() + " PRIVMSG " + sChan + " :" + m_pNetwork->GetUser()->AddTimestamp(sMessage)); } }