From f27109f1b41f16865427c801c0826cc7ee11bd74 Mon Sep 17 00:00:00 2001 From: ManiacTwister Date: Fri, 6 Feb 2015 20:14:36 +0100 Subject: [PATCH] Implemented StripControls for channel messages and notices --- include/znc/Chan.h | 6 +++++ include/znc/IRCNetwork.h | 4 +++ modules/controlpanel.cpp | 20 +++++++++++++- .../data/webadmin/tmpl/add_edit_network.tmpl | 10 +++++++ modules/webadmin.cpp | 16 ++++++++++++ src/Chan.cpp | 26 +++++++++++++++++++ src/IRCNetwork.cpp | 13 ++++++++++ src/IRCSock.cpp | 15 +++++++++++ 8 files changed, 109 insertions(+), 1 deletion(-) diff --git a/include/znc/Chan.h b/include/znc/Chan.h index 2ccf673d..3c5a957d 100644 --- a/include/znc/Chan.h +++ b/include/znc/Chan.h @@ -117,6 +117,8 @@ public: void SetDefaultModes(const CString& s) { m_sDefaultModes = s; } void SetAutoClearChanBuffer(bool b); void InheritAutoClearChanBuffer(bool b); + void SetStripControls(bool b); + void InheritStripControls(bool b); void SetDetached(bool b = true) { m_bDetached = b; } void SetInConfig(bool b); void SetCreationDate(unsigned long u) { m_ulCreationDate = u; } @@ -144,12 +146,14 @@ public: size_t GetNickCount() const { return m_msNicks.size(); } bool AutoClearChanBuffer() const { return m_bAutoClearChanBuffer; } bool IsDetached() const { return m_bDetached; } + bool StripControls() const { return m_bStripControls; } bool InConfig() const { return m_bInConfig; } unsigned long GetCreationDate() const { return m_ulCreationDate; } bool IsDisabled() const { return m_bDisabled; } unsigned int GetJoinTries() const { return m_uJoinTries; } bool HasBufferCountSet() const { return m_bHasBufferCountSet; } bool HasAutoClearChanBufferSet() const { return m_bHasAutoClearChanBufferSet; } + bool HasStripControlsSet() const { return m_bHasStripControlsSet; } // !Getters private: protected: @@ -160,6 +164,8 @@ protected: bool m_bDisabled; bool m_bHasBufferCountSet; bool m_bHasAutoClearChanBufferSet; + bool m_bStripControls; + bool m_bHasStripControlsSet; CString m_sName; CString m_sKey; CString m_sTopic; diff --git a/include/znc/IRCNetwork.h b/include/znc/IRCNetwork.h index 4dd9ef94..42e49dc1 100644 --- a/include/znc/IRCNetwork.h +++ b/include/znc/IRCNetwork.h @@ -128,6 +128,9 @@ public: void SetIRCConnectEnabled(bool b); bool GetIRCConnectEnabled() const { return m_bIRCConnectEnabled; } + void SetStripControls(bool b); + bool StripControls() const { return m_bStripControls; } + CIRCSock* GetIRCSock() { return m_pIRCSock; } const CIRCSock* GetIRCSock() const { return m_pIRCSock; } const CString& GetIRCServer() const; @@ -219,6 +222,7 @@ protected: CString m_sChanPrefixes; bool m_bIRCConnectEnabled; + bool m_bStripControls; CString m_sIRCServer; std::vector m_vServers; size_t m_uServerIdx; ///< Index in m_vServers of our current server + 1 diff --git a/modules/controlpanel.cpp b/modules/controlpanel.cpp index 6e911fb3..6d181c80 100644 --- a/modules/controlpanel.cpp +++ b/modules/controlpanel.cpp @@ -121,6 +121,7 @@ class CAdminMod : public CModule { {"Encoding", str}, #endif {"QuitMsg", str}, + {"StripControls", boolean}, }; PrintVarsHelp(sVarFilter, nvars, ARRAY_SIZE(nvars), "The following variables are available when using the SetNetwork/GetNetwork commands:"); } @@ -132,7 +133,8 @@ class CAdminMod : public CModule { {"Buffer", integer}, {"InConfig", boolean}, {"AutoClearChanBuffer", boolean}, - {"Detached", boolean} + {"Detached", boolean}, + {"StripControls", boolean}, }; PrintVarsHelp(sVarFilter, cvars, ARRAY_SIZE(cvars), "The following variables are available when using the SetChan/GetChan commands:"); } @@ -484,6 +486,8 @@ class CAdminMod : public CModule { #endif } else if (sVar.Equals("quitmsg")) { PutModule("QuitMsg = " + pNetwork->GetQuitMsg()); + } else if (sVar.Equals("stripcontrols")) { + PutModule("StripControls = " + CString(pNetwork->StripControls())); } else { PutModule("Error: Unknown variable"); } @@ -578,6 +582,10 @@ class CAdminMod : public CModule { } else if (sVar.Equals("quitmsg")) { pNetwork->SetQuitMsg(sValue); PutModule("QuitMsg = " + pNetwork->GetQuitMsg()); + } else if (sVar == "stripcontrols") { + bool b = sValue.ToBool(); + pNetwork->SetStripControls(b); + PutModule("StripControls = " + CString(b)); } else { PutModule("Error: Unknown variable"); } @@ -700,6 +708,12 @@ class CAdminMod : public CModule { PutModule(pChan->GetName() + ": AutoClearChanBuffer = " + sValue); } else if (sVar == "detached") { PutModule(pChan->GetName() + ": Detached = " + CString(pChan->IsDetached())); + } else if (sVar == "stripcontrols") { + CString sValue(pChan->StripControls()); + if (!pChan->HasStripControlsSet()) { + sValue += " (default)"; + } + PutModule(pChan->GetName() + ": StripControls = " + sValue); } else if (sVar == "key") { PutModule(pChan->GetName() + ": Key = " + pChan->GetKey()); } else { @@ -772,6 +786,10 @@ class CAdminMod : public CModule { pChan->AttachUser(); } PutModule(pChan->GetName() + ": Detached = " + CString(b)); + } else if (sVar == "stripcontrols") { + bool b = sValue.ToBool(); + pChan->SetStripControls(b); + PutModule(pChan->GetName() + ": StripControls = " + CString(b)); } else if (sVar == "key") { pChan->SetKey(sValue); PutModule(pChan->GetName() + ": Key = " + sValue); diff --git a/modules/data/webadmin/tmpl/add_edit_network.tmpl b/modules/data/webadmin/tmpl/add_edit_network.tmpl index 9d7eded8..8bfe8abc 100644 --- a/modules/data/webadmin/tmpl/add_edit_network.tmpl +++ b/modules/data/webadmin/tmpl/add_edit_network.tmpl @@ -129,6 +129,16 @@ +
+
Strip Controls:
+
+ checked="checked" /> + +
+
+
diff --git a/modules/webadmin.cpp b/modules/webadmin.cpp index d4cf6d75..aa5f5ea1 100644 --- a/modules/webadmin.cpp +++ b/modules/webadmin.cpp @@ -666,6 +666,11 @@ public: o4["DisplayName"] = "Disabled"; if (pChan && pChan->IsDisabled()) { o4["Checked"] = "true"; } + CTemplate& o5 = Tmpl.AddRow("OptionLoop"); + o5["Name"] = "stripcontrols"; + o5["DisplayName"] = "Strip Controls"; + if (pChan && pChan->StripControls()) { o5["Checked"] = "true"; } + FOR_EACH_MODULE(i, pNetwork) { CTemplate& mod = Tmpl.AddRow("EmbeddedModuleLoop"); mod.insert(Tmpl.begin(), Tmpl.end()); @@ -729,6 +734,11 @@ public: else pChan->Enable(); + bool bStripControls = WebSock.GetParam("stripcontrols").ToBool(); + if (pChan->StripControls() != bStripControls) { + pChan->SetStripControls(bStripControls); + } + CTemplate TmplMod; TmplMod["User"] = pUser->GetUserName(); TmplMod["ChanName"] = pChan->GetName(); @@ -835,6 +845,7 @@ public: Tmpl["QuitMsg"] = pNetwork->GetQuitMsg(); + Tmpl["StripControls"] = CString(pNetwork->StripControls()); Tmpl["FloodProtection"] = CString(CIRCSock::IsFloodProtected(pNetwork->GetFloodRate())); Tmpl["FloodRate"] = CString(pNetwork->GetFloodRate()); Tmpl["FloodBurst"] = CString(pNetwork->GetFloodBurst()); @@ -996,6 +1007,11 @@ public: pNetwork->SetJoinDelay(WebSock.GetParam("joindelay").ToUShort()); + bool bStripControls = WebSock.GetParam("stripcontrols").ToBool(); + if (pNetwork->StripControls() != bStripControls) { + pNetwork->SetStripControls(bStripControls); + } + #ifdef HAVE_ICU CString sEncodingUtf = WebSock.GetParam("encoding_utf"); if (sEncodingUtf == "legacy") { diff --git a/src/Chan.cpp b/src/Chan.cpp index 08cb76a5..a35afe38 100644 --- a/src/Chan.cpp +++ b/src/Chan.cpp @@ -38,8 +38,10 @@ CChan::CChan(const CString& sName, CIRCNetwork* pNetwork, bool bInConfig, CConfi m_Nick.SetNetwork(m_pNetwork); m_bDetached = false; m_bDisabled = false; + m_bStripControls = false; m_bHasBufferCountSet = false; m_bHasAutoClearChanBufferSet = false; + m_bHasStripControlsSet = false; m_Buffer.SetLineCount(m_pNetwork->GetUser()->GetBufferCount(), true); m_bAutoClearChanBuffer = m_pNetwork->GetUser()->AutoClearChanBuffer(); Reset(); @@ -57,6 +59,8 @@ CChan::CChan(const CString& sName, CIRCNetwork* pNetwork, bool bInConfig, CConfi if (pConfig->FindStringEntry("disabled", sValue)) if (sValue.ToBool()) Disable(); + if (pConfig->FindStringEntry("stripcontrols", sValue)) + SetStripControls(sValue.ToBool()); if (pConfig->FindStringEntry("autocycle", sValue)) if (sValue.Equals("true")) CUtils::PrintError("WARNING: AutoCycle has been removed, instead try -> LoadModule = autocycle " + sName); @@ -95,6 +99,8 @@ CConfig CChan::ToConfig() const { config.AddKeyValuePair("Detached", "true"); if (IsDisabled()) config.AddKeyValuePair("Disabled", "true"); + if (m_bHasStripControlsSet) + config.AddKeyValuePair("StripControls", CString(StripControls())); if (!GetKey().empty()) config.AddKeyValuePair("Key", GetKey()); if (!GetDefaultModes().empty()) @@ -107,6 +113,7 @@ void CChan::Clone(CChan& chan) { // We assume that m_sName and m_pNetwork are equal SetBufferCount(chan.GetBufferCount(), true); SetAutoClearChanBuffer(chan.AutoClearChanBuffer()); + SetStripControls(chan.StripControls()); SetKey(chan.GetKey()); SetDefaultModes(chan.GetDefaultModes()); @@ -251,6 +258,17 @@ void CChan::InheritAutoClearChanBuffer(bool b) { } } +void CChan::SetStripControls(bool b) { + m_bHasStripControlsSet = true; + m_bStripControls = b; +} + +void CChan::InheritStripControls(bool b) { + if (!m_bHasStripControlsSet) { + m_bStripControls = b; + } +} + void CChan::OnWho(const CString& sNick, const CString& sIdent, const CString& sHost) { CNick* pNick = FindNick(sNick); @@ -385,6 +403,14 @@ CString CChan::GetOptions() const { } } + if (StripControls()) { + if (HasStripControlsSet()) { + vsRet.push_back("StripControls"); + } else { + vsRet.push_back("StripControls (default)"); + } + } + return CString(", ").Join(vsRet.begin(), vsRet.end()); } diff --git a/src/IRCNetwork.cpp b/src/IRCNetwork.cpp index d97e10b5..372e8a30 100644 --- a/src/IRCNetwork.cpp +++ b/src/IRCNetwork.cpp @@ -127,6 +127,8 @@ CIRCNetwork::CIRCNetwork(CUser *pUser, const CString& sName) { m_uJoinDelay = 0; + SetStripControls(false); + m_RawBuffer.SetLineCount(100, true); // This should be more than enough raws, especially since we are buffering the MOTD separately m_MotdBuffer.SetLineCount(200, true); // This should be more than enough motd lines m_NoticeBuffer.SetLineCount(250, true); @@ -176,6 +178,7 @@ void CIRCNetwork::Clone(const CIRCNetwork& Network, bool bCloneName) { SetBindHost(Network.GetBindHost()); SetEncoding(Network.GetEncoding()); SetQuitMsg(Network.GetQuitMsg()); + SetStripControls(Network.StripControls()); m_ssTrustedFingerprints = Network.m_ssTrustedFingerprints; // Servers @@ -352,6 +355,7 @@ bool CIRCNetwork::ParseConfig(CConfig *pConfig, CString& sError, bool bUpgrade) size_t numStringOptions = sizeof(StringOptions) / sizeof(StringOptions[0]); TOption BoolOptions[] = { { "ircconnectenabled", &CIRCNetwork::SetIRCConnectEnabled }, + { "stripcontrols", &CIRCNetwork::SetStripControls }, }; size_t numBoolOptions = sizeof(BoolOptions) / sizeof(BoolOptions[0]); TOption DoubleOptions[] = { @@ -510,6 +514,7 @@ CConfig CIRCNetwork::ToConfig() const { config.AddKeyValuePair("FloodBurst", CString(GetFloodBurst())); config.AddKeyValuePair("JoinDelay", CString(GetJoinDelay())); config.AddKeyValuePair("Encoding", m_sEncoding); + config.AddKeyValuePair("StripControls", CString(StripControls())); if (!m_sQuitMsg.empty()) { config.AddKeyValuePair("QuitMsg", m_sQuitMsg); @@ -1280,6 +1285,14 @@ void CIRCNetwork::CheckIRCConnect() { CZNC::Get().AddNetworkToQueue(this); } +void CIRCNetwork::SetStripControls(bool b) { + for (CChan* pChan : GetChans()) { + pChan->InheritStripControls(b); + } + + m_bStripControls = b; +} + bool CIRCNetwork::PutIRC(const CString& sLine) { CIRCSock* pIRCSock = GetIRCSock(); diff --git a/src/IRCSock.cpp b/src/IRCSock.cpp index c6209088..7af0bb0d 100644 --- a/src/IRCSock.cpp +++ b/src/IRCSock.cpp @@ -698,6 +698,11 @@ void CIRCSock::ReadLine(const CString& sData) { return; } } else { + CChan* pChan = m_pNetwork->FindChan(sTarget); + if (pChan && pChan->StripControls()) { + sMsg.StripControls(); + } + if (OnChanNotice(Nick, sTarget, sMsg)) { return; } @@ -746,6 +751,11 @@ void CIRCSock::ReadLine(const CString& sData) { return; } } else { + CChan* pChan = m_pNetwork->FindChan(sTarget); + if (pChan && pChan->StripControls()) { + sMsg.StripControls(); + } + if (OnChanCTCP(Nick, sTarget, sMsg)) { return; } @@ -759,6 +769,11 @@ void CIRCSock::ReadLine(const CString& sData) { return; } } else { + CChan* pChan = m_pNetwork->FindChan(sTarget); + if (pChan && pChan->StripControls()) { + sMsg.StripControls(); + } + if (OnChanMsg(Nick, sTarget, sMsg)) { return; }