diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/account.cpp | 14 | ||||
-rw-r--r-- | src/channels.cpp | 3 |
2 files changed, 15 insertions, 2 deletions
diff --git a/src/account.cpp b/src/account.cpp index e58ee1646..89c9c7909 100644 --- a/src/account.cpp +++ b/src/account.cpp @@ -73,8 +73,20 @@ void IdentifyRequest::ModuleUnload(Module *m) IdentifyRequest *ir = *it; ++it; - ir->Release(m); + ir->holds.erase(m); + if (ir->holds.empty() && ir->dispatched) + { + if (!ir->success) + ir->OnFail(); + delete ir; + continue; + } + if (ir->owner == m) + { + if (!ir->success) + ir->OnFail(); delete ir; + } } } diff --git a/src/channels.cpp b/src/channels.cpp index 5a578b300..18a85ab49 100644 --- a/src/channels.cpp +++ b/src/channels.cpp @@ -858,7 +858,8 @@ void Channel::SetCorrectModes(User *user, bool give_modes) given = true; } } - else if (take_modes && !has_priv && !u_access.HasPriv(cm->name + "ME")) + /* modes that have no privileges assigned shouldn't be removed (like operprefix, ojoin) */ + else if (take_modes && !has_priv && ci->GetLevel(cm->name + "ME") != ACCESS_INVALID && !u_access.HasPriv(cm->name + "ME")) { /* Only remove modes if they are > voice */ if (cm->name == "VOICE") |