diff options
Diffstat (limited to 'src/channels.cpp')
-rw-r--r-- | src/channels.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/channels.cpp b/src/channels.cpp index a9ad68b93..86c261029 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -111,7 +111,8 @@ void Channel::CheckModes() return; } - FOREACH_MOD(OnCheckModes, (this)); + Reference<Channel> ref = this; + FOREACH_MOD(OnCheckModes, (ref)); } bool Channel::CheckDelete() @@ -371,6 +372,15 @@ void Channel::RemoveModeInternal(MessageSource &setter, ChannelMode *cm, const A FOREACH_RESULT(OnChannelModeUnset, MOD_RESULT, (this, setter, cm, param)); + if (cm->name == "PERM") + { + if (this->CheckDelete()) + { + delete this; + return; + } + } + /* Check for mlock */ if (!enforce_mlock || MOD_RESULT == EVENT_STOP) return; @@ -505,9 +515,11 @@ void Channel::SetModes(BotInfo *bi, bool enforce_mlock, const char *cmodes, ...) vsnprintf(buf, BUFSIZE - 1, cmodes, args); va_end(args); + Reference<Channel> this_reference(this); + spacesepstream sep(buf); sep.GetToken(modebuf); - for (unsigned i = 0, end = modebuf.length(); i < end; ++i) + for (unsigned i = 0, end = modebuf.length(); this_reference && i < end; ++i) { ChannelMode *cm; |