X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules.cpp;h=5c5e5c5c03c9c67e371a6a49954d05ed1d06ec8f;hb=9de9231380d42955a13f07d7843897c77af704e4;hp=18f2dc4d1248dc6a59396a429e8bec71ecd4be17;hpb=725c954efbdaca99701412e640a1a762b36a5f48;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules.cpp b/src/modules.cpp index 18f2dc4d1..5c5e5c5c0 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -342,6 +342,18 @@ bool ModuleManager::CanUnload(Module* mod) return true; } +void ModuleManager::UnregisterModes(Module* mod, ModeType modetype) +{ + const ModeParser::ModeHandlerMap& modes = ServerInstance->Modes.GetModes(modetype); + for (ModeParser::ModeHandlerMap::const_iterator i = modes.begin(); i != modes.end(); ) + { + ModeHandler* const mh = i->second; + ++i; + if (mh->creator == mod) + this->DelService(*mh); + } +} + void ModuleManager::DoSafeUnload(Module* mod) { // First, notify all modules that a module is about to be unloaded, so in case @@ -351,6 +363,10 @@ void ModuleManager::DoSafeUnload(Module* mod) std::map::iterator modfind = Modules.find(mod->ModuleSourceFile); + // Unregister modes before extensions because modes may require their extension to show the mode being unset + UnregisterModes(mod, MODETYPE_USER); + UnregisterModes(mod, MODETYPE_CHANNEL); + std::vector > items; ServerInstance->Extensions.BeginUnregister(modfind->second, items); /* Give the module a chance to tidy out all its metadata */ @@ -376,24 +392,6 @@ void ModuleManager::DoSafeUnload(Module* mod) user->doUnhookExtensions(items); } - const ModeParser::ModeHandlerMap& usermodes = ServerInstance->Modes->GetModes(MODETYPE_USER); - for (ModeParser::ModeHandlerMap::const_iterator i = usermodes.begin(); i != usermodes.end(); ) - { - ModeHandler* mh = i->second; - ++i; - if (mh->creator == mod) - this->DelService(*mh); - } - - const ModeParser::ModeHandlerMap& chanmodes = ServerInstance->Modes->GetModes(MODETYPE_CHANNEL); - for (ModeParser::ModeHandlerMap::const_iterator i = chanmodes.begin(); i != chanmodes.end(); ) - { - ModeHandler* mh = i->second; - ++i; - if (mh->creator == mod) - this->DelService(*mh); - } - for(std::multimap::iterator i = DataProviders.begin(); i != DataProviders.end(); ) { std::multimap::iterator curr = i++;