diff options
author | Adam <Adam@anope.org> | 2014-03-20 10:53:27 -0400 |
---|---|---|
committer | Adam <Adam@anope.org> | 2014-03-20 10:53:27 -0400 |
commit | a259244297eeb8b8e30b3ee38d05fbe8875c4f7b (patch) | |
tree | c6dad08a6ae644fd81daaca80c5efb36198f0d6f /src/channels.cpp | |
parent | c1da009de302ba1ecbb42f5d7f009959955f4de7 (diff) |
Make bouncymodes harder to trigger by only bumping server modcount when something changes
Diffstat (limited to 'src/channels.cpp')
-rw-r--r-- | src/channels.cpp | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/src/channels.cpp b/src/channels.cpp index decc3c77f..37d04c44e 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -578,17 +578,6 @@ void Channel::SetModes(BotInfo *bi, bool enforce_mlock, const char *cmodes, ...) void Channel::SetModesInternal(MessageSource &source, const Anope::string &mode, time_t ts, bool enforce_mlock) { - if (source.GetServer() && source.GetServer()->IsSynced()) - { - if (Anope::CurTime != this->server_modetime) - { - this->server_modecount = 0; - this->server_modetime = Anope::CurTime; - } - - ++this->server_modecount; - } - if (!ts) ; else if (ts > this->creation_time) @@ -615,6 +604,7 @@ void Channel::SetModesInternal(MessageSource &source, const Anope::string &mode, Anope::string modestring; Anope::string paramstring; int add = -1; + bool changed = false; for (unsigned int i = 0, end = m.length(); i < end && this_reference; ++i) { ChannelMode *cm; @@ -643,6 +633,8 @@ void Channel::SetModesInternal(MessageSource &source, const Anope::string &mode, if (cm->type == MODE_REGULAR) { + /* something changed if we are adding a mode we dont have, or removing one we have */ + changed |= !!add != this->HasMode(cm->name); if (add) this->SetModeInternal(source, cm, "", false); else @@ -668,6 +660,7 @@ void Channel::SetModesInternal(MessageSource &source, const Anope::string &mode, else paramstring += " " + token; + changed |= !!add != this->HasMode(cm->name, token); /* CheckModes below doesn't check secureops (+ the module event) */ if (add) this->SetModeInternal(source, cm, token, enforce_mlock); @@ -681,6 +674,17 @@ void Channel::SetModesInternal(MessageSource &source, const Anope::string &mode, if (!this_reference) return; + if (changed && source.GetServer() && source.GetServer()->IsSynced()) + { + if (Anope::CurTime != this->server_modetime) + { + this->server_modecount = 0; + this->server_modetime = Anope::CurTime; + } + + ++this->server_modecount; + } + if (setter) Log(setter, this, "mode") << modestring << paramstring; else |