]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules.cpp
Fix a broken distro constraint in the m_ssl_gnutls PackageInfo.
[user/henk/code/inspircd.git] / src / modules.cpp
index 18f2dc4d1248dc6a59396a429e8bec71ecd4be17..5c5e5c5c03c9c67e371a6a49954d05ed1d06ec8f 100644 (file)
@@ -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<std::string, Module*>::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<reference<ExtensionItem> > 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<std::string, ServiceProvider*>::iterator i = DataProviders.begin(); i != DataProviders.end(); )
        {
                std::multimap<std::string, ServiceProvider*>::iterator curr = i++;