summaryrefslogtreecommitdiff
path: root/src/channels.cpp
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2014-03-20 10:53:27 -0400
committerAdam <Adam@anope.org>2014-03-20 10:53:27 -0400
commita259244297eeb8b8e30b3ee38d05fbe8875c4f7b (patch)
treec6dad08a6ae644fd81daaca80c5efb36198f0d6f /src/channels.cpp
parentc1da009de302ba1ecbb42f5d7f009959955f4de7 (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.cpp26
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