diff options
author | Adam <Adam@anope.org> | 2015-01-26 13:16:25 -0500 |
---|---|---|
committer | Adam <Adam@anope.org> | 2015-01-26 13:16:25 -0500 |
commit | d324e9152012500c7a811d7adda6ad2c6fbcd26f (patch) | |
tree | 9b90495917b5c0d6aa2e8046850b31ff69c585fe /modules/commands/cs_mode.cpp | |
parent | 9ac1b4ba014ba3c95dfe1c9149b705e49929dab9 (diff) |
Fix negatively locking param modes in default mlock
Diffstat (limited to 'modules/commands/cs_mode.cpp')
-rw-r--r-- | modules/commands/cs_mode.cpp | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/modules/commands/cs_mode.cpp b/modules/commands/cs_mode.cpp index d5c356fa4..8a30f102c 100644 --- a/modules/commands/cs_mode.cpp +++ b/modules/commands/cs_mode.cpp @@ -958,16 +958,40 @@ class CSMode : public Module for (unsigned i = 0; i < mlock.length(); ++i) { if (mlock[i] == '+') + { add = true; - else if (mlock[i] == '-') + continue; + } + + if (mlock[i] == '-') + { add = false; - else + continue; + } + + ChannelMode *cm = ModeManager::FindChannelModeByChar(mlock[i]); + if (!cm) + continue; + + Anope::string param; + if (cm->type == MODE_PARAM) + { + ChannelModeParam *cmp = anope_dynamic_static_cast<ChannelModeParam *>(cm); + if (add || !cmp->minus_no_arg) + { + sep.GetToken(param); + if (param.empty() || !cmp->IsValid(param)) + continue; + } + } + else if (cm->type != MODE_REGULAR) { - ChannelMode *cm = ModeManager::FindChannelModeByChar(mlock[i]); - Anope::string param; - if (cm && (cm->type == MODE_REGULAR || sep.GetToken(param))) - ml->SetMLock(cm, add, param); + sep.GetToken(param); + if (param.empty()) + continue; } + + ml->SetMLock(cm, add, param); } } ml->Check(); |