diff options
author | Adam <Adam@anope.org> | 2013-09-03 19:58:40 -0400 |
---|---|---|
committer | Adam <Adam@anope.org> | 2013-09-03 19:58:40 -0400 |
commit | b005089f2f713271d5db2be681dab49191ed5e4e (patch) | |
tree | e803b29fbb5a98144cc8a30ebd08e7f1de6391a8 /src/channels.cpp | |
parent | 1b42e266426fd9aee439d024d787c7ba4a421c63 (diff) |
Dont allow multiple list modes with the same param on the mode list at once
Diffstat (limited to 'src/channels.cpp')
-rw-r--r-- | src/channels.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/channels.cpp b/src/channels.cpp index 8e3a0be0a..91c902206 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -194,7 +194,7 @@ size_t Channel::HasMode(const Anope::string &mname, const Anope::string ¶m) return modes.count(mname); std::pair<Channel::ModeList::iterator, Channel::ModeList::iterator> its = this->GetModeList(mname); for (; its.first != its.second; ++its.first) - if (its.first->second == param) + if (its.first->second.equals_ci(param)) return 1; return 0; } @@ -279,6 +279,9 @@ void Channel::SetModeInternal(MessageSource &setter, ChannelMode *cm, const Anop if (cm->type != MODE_LIST) this->modes.erase(cm->name); + else if (this->HasMode(cm->name, param)) + return; + this->modes.insert(std::make_pair(cm->name, param)); if (param.empty() && cm->type != MODE_REGULAR) @@ -342,11 +345,11 @@ void Channel::RemoveModeInternal(MessageSource &setter, ChannelMode *cm, const A return; } - if (cm->type == MODE_LIST && !param.empty()) + if (cm->type == MODE_LIST) { std::pair<Channel::ModeList::iterator, Channel::ModeList::iterator> its = this->GetModeList(cm->name); for (; its.first != its.second; ++its.first) - if (Anope::Match(param, its.first->second)) + if (param.equals_ci(its.first->second)) { this->modes.erase(its.first); break; |