diff --git a/include/znc/User.h b/include/znc/User.h index af5f76a4..de7b7a5b 100644 --- a/include/znc/User.h +++ b/include/znc/User.h @@ -127,7 +127,10 @@ public: void SetQuitMsg(const CString& s); bool AddCTCPReply(const CString& sCTCP, const CString& sReply); bool DelCTCPReply(const CString& sCTCP); + /** @deprecated Use SetChanBufferSize() or SetQueryBufferSize() instead. */ bool SetBufferCount(unsigned int u, bool bForce = false); + bool SetChanBufferSize(unsigned int u, bool bForce = false); + bool SetQueryBufferSize(unsigned int u, bool bForce = false); void SetAutoClearChanBuffer(bool b); void SetAutoClearQueryBuffer(bool b); @@ -174,7 +177,10 @@ public: CString GetQuitMsg() const; const MCString& GetCTCPReplies() const; + /** @deprecated Use GetChanBufferSize() or GetQueryBufferSize() instead. */ unsigned int GetBufferCount() const; + unsigned int GetChanBufferSize() const; + unsigned int GetQueryBufferSize() const; bool AutoClearChanBuffer() const; bool AutoClearQueryBuffer() const; bool IsBeingDeleted() const { return m_bBeingDeleted; } @@ -228,7 +234,8 @@ protected: std::vector m_vIRCNetworks; std::vector m_vClients; std::set m_ssAllowedHosts; - unsigned int m_uBufferCount; + unsigned int m_uChanBufferSize; + unsigned int m_uQueryBufferSize; unsigned long long m_uBytesRead; unsigned long long m_uBytesWritten; unsigned int m_uMaxJoinTries; diff --git a/modules/controlpanel.cpp b/modules/controlpanel.cpp index 864fb89c..44a0665b 100644 --- a/modules/controlpanel.cpp +++ b/modules/controlpanel.cpp @@ -85,7 +85,8 @@ class CAdminMod : public CModule { {"DenySetBindHost", boolean}, {"DefaultChanModes", str}, {"QuitMsg", str}, - {"BufferCount", integer}, + {"ChanBufferSize", integer}, + {"QueryBufferSize", integer}, {"AutoClearChanBuffer", boolean}, {"AutoClearQueryBuffer",boolean}, {"Password", str}, @@ -212,6 +213,10 @@ class CAdminMod : public CModule { PutModule("QuitMsg = " + pUser->GetQuitMsg()); else if (sVar == "buffercount") PutModule("BufferCount = " + CString(pUser->GetBufferCount())); + else if (sVar == "chanbuffersize") + PutModule("ChanBufferSize = " + CString(pUser->GetChanBufferSize())); + else if (sVar == "querybuffersize") + PutModule("QueryBufferSize = " + CString(pUser->GetQueryBufferSize())); else if (sVar == "keepbuffer") PutModule("KeepBuffer = " + CString(!pUser->AutoClearChanBuffer())); // XXX compatibility crap, added in 0.207 else if (sVar == "autoclearchanbuffer") @@ -340,11 +345,21 @@ class CAdminMod : public CModule { pUser->SetQuitMsg(sValue); PutModule("QuitMsg = " + sValue); } - else if (sVar == "buffercount") { + else if (sVar == "chanbuffersize" || sVar == "buffercount") { unsigned int i = sValue.ToUInt(); // Admins don't have to honour the buffer limit - if (pUser->SetBufferCount(i, GetUser()->IsAdmin())) { - PutModule("BufferCount = " + sValue); + if (pUser->SetChanBufferSize(i, GetUser()->IsAdmin())) { + PutModule("ChanBufferSize = " + sValue); + } else { + PutModule("Setting failed, limit is " + + CString(CZNC::Get().GetMaxBufferSize())); + } + } + else if (sVar == "querybuffersize") { + unsigned int i = sValue.ToUInt(); + // Admins don't have to honour the buffer limit + if (pUser->SetQueryBufferSize(i, GetUser()->IsAdmin())) { + PutModule("QueryBufferSize = " + sValue); } else { PutModule("Setting failed, limit is " + CString(CZNC::Get().GetMaxBufferSize())); diff --git a/modules/data/webadmin/tmpl/add_edit_user.tmpl b/modules/data/webadmin/tmpl/add_edit_user.tmpl index b5e203f9..2c6561a4 100644 --- a/modules/data/webadmin/tmpl/add_edit_user.tmpl +++ b/modules/data/webadmin/tmpl/add_edit_user.tmpl @@ -228,19 +228,38 @@
-

Default Settings

+

Channels

-
Channel Modes:
+
Default Modes:

Empty = use standard value
Buffer Size:
- + +
Empty = use standard value +
+
+
+
+ +
+

Queries

+
+
+
+
Max Buffers:
+ +
+
+
Buffer Size:
+
Empty = use standard value
@@ -304,11 +323,6 @@ disabled="disabled" />
-
-
Max Query Buffers:
- -
CTCP Replies:
diff --git a/modules/webadmin.cpp b/modules/webadmin.cpp index e765cb6e..8bd3043f 100644 --- a/modules/webadmin.cpp +++ b/modules/webadmin.cpp @@ -261,12 +261,20 @@ public: pNewUser->SetDCCBindHost(pUser->GetDCCBindHost()); } - sArg = WebSock.GetParam("bufsize"); if (!sArg.empty()) pNewUser->SetBufferCount(sArg.ToUInt(), spSession->IsAdmin()); + sArg = WebSock.GetParam("chanbufsize"); if (!sArg.empty()) { // First apply the old limit in case the new one is too high if (pUser) - pNewUser->SetBufferCount(pUser->GetBufferCount(), true); - pNewUser->SetBufferCount(sArg.ToUInt(), spSession->IsAdmin()); + pNewUser->SetChanBufferSize(pUser->GetChanBufferSize(), true); + pNewUser->SetChanBufferSize(sArg.ToUInt(), spSession->IsAdmin()); + } + + sArg = WebSock.GetParam("querybufsize"); + if (!sArg.empty()) { + // First apply the old limit in case the new one is too high + if (pUser) + pNewUser->SetQueryBufferSize(pUser->GetQueryBufferSize(), true); + pNewUser->SetQueryBufferSize(sArg.ToUInt(), spSession->IsAdmin()); } pNewUser->SetSkinName(WebSock.GetParam("skin")); @@ -1211,7 +1219,8 @@ public: Tmpl["RealName"] = pUser->GetRealName(); Tmpl["QuitMsg"] = pUser->GetQuitMsg(); Tmpl["DefaultChanModes"] = pUser->GetDefaultChanModes(); - Tmpl["BufferCount"] = CString(pUser->GetBufferCount()); + Tmpl["ChanBufferSize"] = CString(pUser->GetChanBufferSize()); + Tmpl["QueryBufferSize"] = CString(pUser->GetQueryBufferSize()); Tmpl["TimestampFormat"] = pUser->GetTimestampFormat(); Tmpl["Timezone"] = pUser->GetTimezone(); Tmpl["JoinTries"] = CString(pUser->JoinTries()); diff --git a/src/Chan.cpp b/src/Chan.cpp index d73f54e1..1c5a3809 100644 --- a/src/Chan.cpp +++ b/src/Chan.cpp @@ -53,7 +53,7 @@ CChan::CChan(const CString& sName, CIRCNetwork* pNetwork, bool bInConfig, CConfi } m_Nick.SetNetwork(m_pNetwork); - m_Buffer.SetLineCount(m_pNetwork->GetUser()->GetBufferCount(), true); + m_Buffer.SetLineCount(m_pNetwork->GetUser()->GetChanBufferSize(), true); if (pConfig) { CString sValue; diff --git a/src/Query.cpp b/src/Query.cpp index 8e141ba4..8cb536a3 100644 --- a/src/Query.cpp +++ b/src/Query.cpp @@ -21,8 +21,7 @@ using std::vector; CQuery::CQuery(const CString& sName, CIRCNetwork* pNetwork) : m_sName(sName), m_pNetwork(pNetwork), m_Buffer() { - // Bandaid for users who upgrade from <=1.4 and have 0 in "default channel buffer size" setting. - SetBufferCount(std::max(100u, m_pNetwork->GetUser()->GetBufferCount()), true); + SetBufferCount(m_pNetwork->GetUser()->GetQueryBufferSize(), true); } CQuery::~CQuery() { diff --git a/src/User.cpp b/src/User.cpp index 932ac4eb..b1e2b9d9 100644 --- a/src/User.cpp +++ b/src/User.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -85,7 +86,8 @@ CUser::CUser(const CString& sUserName) m_vIRCNetworks(), m_vClients(), m_ssAllowedHosts(), - m_uBufferCount(50), + m_uChanBufferSize(50), + m_uQueryBufferSize(50), m_uBytesRead(0), m_uBytesWritten(0), m_uMaxJoinTries(10), @@ -211,6 +213,10 @@ bool CUser::ParseConfig(CConfig* pConfig, CString& sError) { } if (pConfig->FindStringEntry("buffer", sValue)) SetBufferCount(sValue.ToUInt(), true); + if (pConfig->FindStringEntry("chanbuffersize", sValue)) + SetChanBufferSize(sValue.ToUInt(), true); + if (pConfig->FindStringEntry("querybuffersize", sValue)) + SetQueryBufferSize(sValue.ToUInt(), true); if (pConfig->FindStringEntry("awaysuffix", sValue)) { CUtils::PrintMessage("WARNING: AwaySuffix has been deprecated, instead try -> LoadModule = awaynick %nick%_" + sValue); } @@ -693,7 +699,8 @@ bool CUser::Clone(const CUser& User, CString& sErrorRet, bool bCloneNetworks) { SetQuitMsg(User.GetQuitMsg()); SetSkinName(User.GetSkinName()); SetDefaultChanModes(User.GetDefaultChanModes()); - SetBufferCount(User.GetBufferCount(), true); + SetChanBufferSize(User.GetChanBufferSize(), true); + SetQueryBufferSize(User.GetQueryBufferSize(), true); SetJoinTries(User.JoinTries()); SetMaxNetworks(User.MaxNetworks()); SetMaxQueryBuffers(User.MaxQueryBuffers()); @@ -879,7 +886,8 @@ CConfig CUser::ToConfig() const { config.AddKeyValuePair("StatusPrefix", GetStatusPrefix()); config.AddKeyValuePair("Skin", GetSkinName()); config.AddKeyValuePair("ChanModes", GetDefaultChanModes()); - config.AddKeyValuePair("Buffer", CString(GetBufferCount())); + config.AddKeyValuePair("ChanBufferSize", CString(GetChanBufferSize())); + config.AddKeyValuePair("QueryBufferSize", CString(GetQueryBufferSize())); config.AddKeyValuePair("AutoClearChanBuffer", CString(AutoClearChanBuffer())); config.AddKeyValuePair("AutoClearQueryBuffer", CString(AutoClearQueryBuffer())); config.AddKeyValuePair("MultiClients", CString(MultiClients())); @@ -1162,6 +1170,10 @@ void CUser::SetAutoClearChanBuffer(bool b) { void CUser::SetAutoClearQueryBuffer(bool b) { m_bAutoClearQueryBuffer = b; } bool CUser::SetBufferCount(unsigned int u, bool bForce) { + return SetChanBufferSize(u, bForce); +} + +bool CUser::SetChanBufferSize(unsigned int u, bool bForce) { if (!bForce && u > CZNC::Get().GetMaxBufferSize()) return false; for (CIRCNetwork* pNetwork : m_vIRCNetworks) { @@ -1169,7 +1181,19 @@ bool CUser::SetBufferCount(unsigned int u, bool bForce) { pChan->InheritBufferCount(u, bForce); } } - m_uBufferCount = u; + m_uChanBufferSize = u; + return true; +} + +bool CUser::SetQueryBufferSize(unsigned int u, bool bForce) { + if (!bForce && u > CZNC::Get().GetMaxBufferSize()) + return false; + for (CIRCNetwork* pNetwork : m_vIRCNetworks) { + for (CQuery* pQuery : pNetwork->GetQueries()) { + pQuery->SetBufferCount(u, bForce); + } + } + m_uQueryBufferSize = u; return true; } @@ -1239,7 +1263,9 @@ bool CUser::HasSpaceForNewNetwork() const { return GetNetworks().size() < MaxNet CString CUser::GetQuitMsg() const { return (!m_sQuitMsg.Trim_n().empty()) ? m_sQuitMsg : CZNC::GetTag(false); } const MCString& CUser::GetCTCPReplies() const { return m_mssCTCPReplies; } -unsigned int CUser::GetBufferCount() const { return m_uBufferCount; } +unsigned int CUser::GetBufferCount() const { return GetChanBufferSize(); } +unsigned int CUser::GetChanBufferSize() const { return m_uChanBufferSize; } +unsigned int CUser::GetQueryBufferSize() const { return m_uQueryBufferSize; } bool CUser::AutoClearChanBuffer() const { return m_bAutoClearChanBuffer; } bool CUser::AutoClearQueryBuffer() const { return m_bAutoClearQueryBuffer; } //CString CUser::GetSkinName() const { return (!m_sSkinName.empty()) ? m_sSkinName : CZNC::Get().GetSkinName(); }