mirror of
https://github.com/znc/znc.git
synced 2026-08-03 07:23:19 +02:00
Merge commit 'refs/pull/705/head' of github.com:znc/znc
This commit is contained in:
+2
-2
@@ -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
@@ -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
@@ -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) {
|
||||
|
||||
@@ -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
@@ -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
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user