Merge commit 'refs/pull/705/head' of github.com:znc/znc

This commit is contained in:
Alexey Sokolov
2014-10-26 11:44:35 +00:00
6 changed files with 53 additions and 58 deletions
+2 -2
View File
@@ -110,7 +110,7 @@ public:
// Setters
void SetModeKnown(bool b) { m_bModeKnown = b; }
void SetIsOn(bool b) { m_bIsOn = b; if (!b) { Reset(); } }
void SetKey(const CString& s) { m_sKey = s; }
void SetKey(const CString& s);
void SetTopic(const CString& s) { m_sTopic = s; }
void SetTopicOwner(const CString& s) { m_sTopicOwner = s; }
void SetTopicDate(unsigned long u) { m_ulTopicDate = u; }
@@ -118,7 +118,7 @@ public:
void SetAutoClearChanBuffer(bool b);
void InheritAutoClearChanBuffer(bool b);
void SetDetached(bool b = true) { m_bDetached = b; }
void SetInConfig(bool b) { m_bInConfig = b; }
void SetInConfig(bool b);
void SetCreationDate(unsigned long u) { m_ulCreationDate = u; }
void Disable() { m_bDisabled = true; }
void Enable();
+2 -1
View File
@@ -40,7 +40,8 @@ public:
enum ConfigState {
ECONFIG_NOTHING,
ECONFIG_NEED_REHASH,
ECONFIG_NEED_WRITE
ECONFIG_NEED_WRITE,
ECONFIG_NEED_VERBOSE_WRITE
};
void DeleteUsers();
+16 -50
View File
@@ -18,22 +18,18 @@
#include <znc/User.h>
#include <znc/IRCNetwork.h>
using std::vector;
class CChanSaverMod : public CModule {
public:
MODCONSTRUCTOR(CChanSaverMod) {
m_bWriteConf = false;
switch (GetType()) {
case CModInfo::GlobalModule:
LoadUsers();
break;
case CModInfo::UserModule:
LoadUser(*GetUser());
LoadUser(GetUser());
break;
case CModInfo::NetworkModule:
LoadNetwork(*GetNetwork());
LoadNetwork(GetNetwork());
break;
}
}
@@ -42,71 +38,41 @@ public:
}
void LoadUsers() {
std::map<CString, CUser *> vUsers = CZNC::Get().GetUserMap();
for (std::map<CString, CUser *>::iterator it = vUsers.begin(); it != vUsers.end(); ++it) {
LoadUser(*it->second);
const std::map<CString, CUser*>& vUsers = CZNC::Get().GetUserMap();
for (const auto& user : vUsers) {
LoadUser(user.second);
}
}
void LoadUser(CUser &user) {
vector<CIRCNetwork*> vNetworks = user.GetNetworks();
for (vector<CIRCNetwork*>::iterator it = vNetworks.begin(); it != vNetworks.end(); ++it) {
CIRCNetwork &network = **it;
LoadNetwork(network);
void LoadUser(CUser* pUser) {
const std::vector<CIRCNetwork*>& vNetworks = pUser->GetNetworks();
for (const CIRCNetwork* pNetwork : vNetworks) {
LoadNetwork(pNetwork);
}
}
void LoadNetwork(CIRCNetwork &network) {
const vector<CChan*>& vChans = network.GetChans();
for (vector<CChan*>::const_iterator it = vChans.begin(); it != vChans.end(); ++it) {
CChan &chan = **it;
void LoadNetwork(const CIRCNetwork* pNetwork) {
const std::vector<CChan*>& vChans = pNetwork->GetChans();
for (CChan* pChan : vChans) {
// If that channel isn't yet in the config,
// we'll have to add it...
if (!chan.InConfig()) {
chan.SetInConfig(true);
m_bWriteConf = true;
if (!pChan->InConfig()) {
pChan->SetInConfig(true);
}
}
}
virtual EModRet OnRaw(CString& sLine) {
if (m_bWriteConf) {
CZNC::Get().WriteConfig();
m_bWriteConf = false;
}
return CONTINUE;
}
virtual void OnMode2(const CNick* pOpNick, CChan& Channel, char uMode, const CString& sArg, bool bAdded, bool bNoChange) {
// This is called when we join (ZNC requests the channel modes
// on join) *and* when someone changes the channel keys.
// We ignore channel key "*" because of some broken nets.
if (uMode != 'k' || bNoChange || !bAdded || sArg == "*")
return;
Channel.SetKey(sArg);
m_bWriteConf = true;
}
virtual void OnJoin(const CNick& Nick, CChan& Channel) {
if (Nick.GetNick() == GetNetwork()->GetIRCNick().GetNick() && !Channel.InConfig()) {
if (!Channel.InConfig() && GetNetwork()->GetIRCNick().NickEquals(Nick.GetNick())) {
Channel.SetInConfig(true);
CZNC::Get().WriteConfig();
}
}
virtual void OnPart(const CNick& Nick, CChan& Channel, const CString& sMessage) {
if (Nick.GetNick() == GetNetwork()->GetIRCNick().GetNick() && Channel.InConfig()) {
if (Channel.InConfig() && GetNetwork()->GetIRCNick().NickEquals(Nick.GetNick())) {
Channel.SetInConfig(false);
CZNC::Get().WriteConfig();
}
}
private:
bool m_bWriteConf;
};
template<> void TModInfo<CChanSaverMod>(CModInfo& Info) {
+26
View File
@@ -19,6 +19,7 @@
#include <znc/User.h>
#include <znc/IRCNetwork.h>
#include <znc/Config.h>
#include <znc/znc.h>
using std::set;
using std::vector;
@@ -364,6 +365,13 @@ void CChan::ModeChange(const CString& sModes, const CNick* pOpNick) {
if (!bList) {
(bAdd) ? AddMode(uMode, sArg) : RemMode(uMode);
}
// This is called when we join (ZNC requests the channel modes
// on join) *and* when someone changes the channel keys.
// We ignore channel key "*" because of some broken nets.
if (uMode == 'k' && !bNoChange && bAdd && sArg != "*") {
SetKey(sArg);
}
}
}
}
@@ -623,3 +631,21 @@ void CChan::Enable() {
ResetJoinTries();
m_bDisabled = false;
}
void CChan::SetKey(const CString& s) {
if (m_sKey != s) {
m_sKey = s;
if (m_bInConfig) {
CZNC::Get().SetConfigState(CZNC::ECONFIG_NEED_WRITE);
}
}
}
void CChan::SetInConfig(bool b) {
if (m_bInConfig != b) {
m_bInConfig = b;
if (m_bInConfig) {
CZNC::Get().SetConfigState(CZNC::ECONFIG_NEED_WRITE);
}
}
}
+1 -1
View File
@@ -146,7 +146,7 @@ static void signalHandler(int sig) {
break;
case SIGUSR1:
CUtils::PrintMessage("Caught SIGUSR1");
CZNC::Get().SetConfigState(CZNC::ECONFIG_NEED_WRITE);
CZNC::Get().SetConfigState(CZNC::ECONFIG_NEED_VERBOSE_WRITE);
break;
default:
CUtils::PrintMessage("WTF? Signal handler called for a signal it doesn't know?");
+6 -4
View File
@@ -178,7 +178,8 @@ void CZNC::Loop() {
while (true) {
CString sError;
switch (GetConfigState()) {
ConfigState eState = GetConfigState();
switch (eState) {
case ECONFIG_NEED_REHASH:
SetConfigState(ECONFIG_NOTHING);
@@ -190,12 +191,13 @@ void CZNC::Loop() {
}
break;
case ECONFIG_NEED_WRITE:
case ECONFIG_NEED_VERBOSE_WRITE:
SetConfigState(ECONFIG_NOTHING);
if (WriteConfig()) {
Broadcast("Writing the config succeeded", true);
} else {
if (!WriteConfig()) {
Broadcast("Writing the config file failed", true);
} else if (eState == ECONFIG_NEED_VERBOSE_WRITE) {
Broadcast("Writing the config succeeded", true);
}
break;
case ECONFIG_NOTHING: