Merge pull request #681 from jpnurmi/setuservars

Fix #680 - make channels follow user-level settings when appropriate
This commit is contained in:
Alexey Sokolov
2014-09-29 23:46:38 +01:00
6 changed files with 72 additions and 17 deletions
+25 -9
View File
@@ -37,8 +37,10 @@ CChan::CChan(const CString& sName, CIRCNetwork* pNetwork, bool bInConfig, CConfi
m_Nick.SetNetwork(m_pNetwork);
m_bDetached = false;
m_bDisabled = false;
SetBufferCount(m_pNetwork->GetUser()->GetBufferCount(), true);
SetAutoClearChanBuffer(m_pNetwork->GetUser()->AutoClearChanBuffer());
m_bHasBufferCountSet = false;
m_bHasAutoClearChanBufferSet = false;
m_Buffer.SetLineCount(m_pNetwork->GetUser()->GetBufferCount(), true);
m_bAutoClearChanBuffer = m_pNetwork->GetUser()->AutoClearChanBuffer();
Reset();
if (pConfig) {
@@ -80,11 +82,10 @@ void CChan::Reset() {
CConfig CChan::ToConfig() {
CConfig config;
CUser *pUser = m_pNetwork->GetUser();
if (pUser->GetBufferCount() != GetBufferCount())
if (m_bHasBufferCountSet)
config.AddKeyValuePair("Buffer", CString(GetBufferCount()));
if (pUser->AutoClearChanBuffer() != AutoClearChanBuffer())
if (m_bHasAutoClearChanBufferSet)
config.AddKeyValuePair("AutoClearChanBuffer", CString(AutoClearChanBuffer()));
if (IsDetached())
config.AddKeyValuePair("Detached", "true");
@@ -232,6 +233,7 @@ void CChan::SetModes(const CString& sModes) {
}
void CChan::SetAutoClearChanBuffer(bool b) {
m_bHasAutoClearChanBufferSet = true;
m_bAutoClearChanBuffer = b;
if (m_bAutoClearChanBuffer && !IsDetached() && m_pNetwork->IsUserOnline()) {
@@ -239,6 +241,16 @@ void CChan::SetAutoClearChanBuffer(bool b) {
}
}
void CChan::InheritAutoClearChanBuffer(bool b) {
if (!m_bHasAutoClearChanBufferSet) {
m_bAutoClearChanBuffer = b;
if (m_bAutoClearChanBuffer && !IsDetached() && m_pNetwork->IsUserOnline()) {
ClearBuffer();
}
}
}
void CChan::OnWho(const CString& sNick, const CString& sIdent, const CString& sHost) {
CNick* pNick = FindNick(sNick);
@@ -352,17 +364,21 @@ void CChan::ModeChange(const CString& sModes, const CNick* pOpNick) {
}
CString CChan::GetOptions() const {
CString sRet;
VCString vsRet;
if (IsDetached()) {
sRet += (sRet.empty()) ? "Detached" : ", Detached";
vsRet.push_back("Detached");
}
if (AutoClearChanBuffer()) {
sRet += (sRet.empty()) ? "AutoClearChanBuffer" : ", AutoClearChanBuffer";
if (HasAutoClearChanBufferSet()) {
vsRet.push_back("AutoClearChanBuffer");
} else {
vsRet.push_back("AutoClearChanBuffer (default)");
}
}
return sRet;
return CString(", ").Join(vsRet.begin(), vsRet.end());
}
CString CChan::GetModeArg(unsigned char uMode) const {
+3 -1
View File
@@ -459,6 +459,7 @@ void CClient::UserCommand(CString& sLine) {
Table.AddColumn("Status");
Table.AddColumn("Conf");
Table.AddColumn("Buf");
Table.AddColumn("Clear");
Table.AddColumn("Modes");
Table.AddColumn("Users");
@@ -477,7 +478,8 @@ void CClient::UserCommand(CString& sLine) {
Table.SetCell("Name", pChan->GetPermStr() + pChan->GetName());
Table.SetCell("Status", ((vChans[a]->IsOn()) ? ((vChans[a]->IsDetached()) ? "Detached" : "Joined") : ((vChans[a]->IsDisabled()) ? "Disabled" : "Trying")));
Table.SetCell("Conf", CString((pChan->InConfig()) ? "yes" : ""));
Table.SetCell("Buf", CString((pChan->AutoClearChanBuffer()) ? "*" : "") + CString(pChan->GetBufferCount()));
Table.SetCell("Buf", CString((pChan->HasBufferCountSet()) ? "*" : "") + CString(pChan->GetBufferCount()));
Table.SetCell("Clear", CString((pChan->HasAutoClearChanBufferSet()) ? "*" : "") + CString((pChan->AutoClearChanBuffer()) ? "yes" : ""));
Table.SetCell("Modes", pChan->GetModeString());
Table.SetCell("Users", CString(pChan->GetNickCount()));
+14 -1
View File
@@ -19,6 +19,7 @@
#include <znc/FileUtils.h>
#include <znc/IRCNetwork.h>
#include <znc/IRCSock.h>
#include <znc/Chan.h>
#include <math.h>
using std::vector;
@@ -1116,12 +1117,24 @@ void CUser::SetDenySetBindHost(bool b) { m_bDenySetBindHost = b; }
void CUser::SetDefaultChanModes(const CString& s) { m_sDefaultChanModes = s; }
void CUser::SetClientEncoding(const CString& s) { m_sClientEncoding = s; }
void CUser::SetQuitMsg(const CString& s) { m_sQuitMsg = s; }
void CUser::SetAutoClearChanBuffer(bool b) { m_bAutoClearChanBuffer = b; }
void CUser::SetAutoClearChanBuffer(bool b) {
for (CIRCNetwork* pNetwork : m_vIRCNetworks) {
for (CChan* pChan : pNetwork->GetChans()) {
pChan->InheritAutoClearChanBuffer(b);
}
}
m_bAutoClearChanBuffer = b;
}
void CUser::SetAutoClearQueryBuffer(bool b) { m_bAutoClearQueryBuffer = b; }
bool CUser::SetBufferCount(unsigned int u, bool bForce) {
if (!bForce && u > CZNC::Get().GetMaxBufferSize())
return false;
for (CIRCNetwork* pNetwork : m_vIRCNetworks) {
for (CChan* pChan : pNetwork->GetChans()) {
pChan->InheritBufferCount(u, bForce);
}
}
m_uBufferCount = u;
return true;
}