diff --git a/IRCSock.cpp b/IRCSock.cpp index 6dbaa2ed..4eacdbc3 100644 --- a/IRCSock.cpp +++ b/IRCSock.cpp @@ -193,6 +193,12 @@ void CIRCSock::ReadLine(const CString& sData) { } break; } + case 305: + m_pUser->SetIRCAway(false); + break; + case 306: + m_pUser->SetIRCAway(true); + break; case 331: { // :irc.server.com 331 yournick #chan :No topic is set. CChan* pChan = m_pUser->FindChan(sLine.Token(3)); diff --git a/User.cpp b/User.cpp index f026669c..58870dc2 100644 --- a/User.cpp +++ b/User.cpp @@ -36,6 +36,7 @@ CUser::CUser(const CString& sUserName) { m_bUseClientIP = false; m_bDenyLoadMod = false; m_bAdmin= false; + m_bIRCAway = false; m_bDenySetVHost= false; m_sStatusPrefix = "*"; m_sChanPrefixes = ""; @@ -147,6 +148,7 @@ void CUser::IRCDisconnected() { } SetIRCServer(""); + m_bIRCAway = false; // Get the reconnect going CheckIRCConnect(); @@ -275,6 +277,12 @@ void CUser::UserConnected(CClient* pClient) { } } + if (m_bIRCAway) { + // If they want to know their away reason they'll have to whois + // themselves. At least we can tell them their away status... + pClient->PutClient(":irc.znc.in 306 " + GetIRCNick().GetNick() + " :You have been marked as being away"); + } + const vector& vChans = GetChans(); for (unsigned int a = 0; a < vChans.size(); a++) { if ((vChans[a]->IsOn()) && (!vChans[a]->IsDetached())) { diff --git a/User.h b/User.h index cc9dc769..59a4310e 100644 --- a/User.h +++ b/User.h @@ -170,6 +170,7 @@ public: void SetJoinTries(unsigned int i) { m_uMaxJoinTries = i; } void SetMaxJoins(unsigned int i) { m_uMaxJoins = i; } void SetIRCConnectEnabled(bool b) { m_bIRCConnectEnabled = b; } + void SetIRCAway(bool b) { m_bIRCAway = b; } // !Setters // Getters @@ -240,6 +241,7 @@ protected: CString m_sDefaultChanModes; CString m_sChanPrefixes; CNick m_IRCNick; + bool m_bIRCAway; CString m_sIRCServer; CString m_sQuitMsg; MCString m_mssCTCPReplies;