]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules.cpp
Document OnUserInit properly and add OnUserPostInit.
[user/henk/code/inspircd.git] / src / modules.cpp
index c2233a893833ffedd16a40bc7f35636457892516..690ff0feb5b4548e648ed8e503ed8649961bbff8 100644 (file)
@@ -54,11 +54,17 @@ Version::Version(const std::string &desc, int flags, const std::string& linkdata
 
 // These declarations define the behavours of the base class Module (which does nothing at all)
 
-Module::Module() { }
+Module::Module()
+       : ModuleDLLManager(NULL)
+       , dying(false)
+{
+}
+
 CullResult Module::cull()
 {
        return classbase::cull();
 }
+
 Module::~Module()
 {
 }
@@ -96,6 +102,7 @@ void         Module::OnBackgroundTimer(time_t) { DetachEvent(I_OnBackgroundTimer); }
 ModResult      Module::OnPreCommand(std::string&, CommandBase::Params&, LocalUser*, bool) { DetachEvent(I_OnPreCommand); return MOD_RES_PASSTHRU; }
 void           Module::OnPostCommand(Command*, const CommandBase::Params&, LocalUser*, CmdResult, bool) { DetachEvent(I_OnPostCommand); }
 void           Module::OnUserInit(LocalUser*) { DetachEvent(I_OnUserInit); }
+void           Module::OnUserPostInit(LocalUser*) { DetachEvent(I_OnUserPostInit); }
 ModResult      Module::OnCheckReady(LocalUser*) { DetachEvent(I_OnCheckReady); return MOD_RES_PASSTHRU; }
 ModResult      Module::OnUserRegister(LocalUser*) { DetachEvent(I_OnUserRegister); return MOD_RES_PASSTHRU; }
 ModResult      Module::OnUserPreKick(User*, Membership*, const std::string&) { DetachEvent(I_OnUserPreKick); return MOD_RES_PASSTHRU; }
@@ -138,10 +145,6 @@ void               Module::OnServiceAdd(ServiceProvider&) { DetachEvent(I_OnServiceAdd); }
 void           Module::OnServiceDel(ServiceProvider&) { DetachEvent(I_OnServiceDel); }
 ModResult      Module::OnUserWrite(LocalUser*, ClientProtocol::Message&) { DetachEvent(I_OnUserWrite); return MOD_RES_PASSTHRU; }
 
-#ifdef INSPIRCD_ENABLE_TESTSUITE
-void           Module::OnRunTestSuite() { }
-#endif
-
 ServiceProvider::ServiceProvider(Module* Creator, const std::string& Name, ServiceType Type)
        : creator(Creator), name(Name), service(Type)
 {
@@ -465,6 +468,7 @@ void ModuleManager::LoadAll()
        std::map<std::string, ServiceList> servicemap;
        LoadCoreModules(servicemap);
 
+       // Step 1: load all of the modules.
        ConfigTagList tags = ServerInstance->Config->ConfTags("module");
        for (ConfigIter i = tags.first; i != tags.second; ++i)
        {
@@ -485,8 +489,7 @@ void ModuleManager::LoadAll()
                }
        }
 
-       ConfigStatus confstatus;
-
+       // Step 2: initialize the modules and register their services.
        for (ModuleMap::const_iterator i = Modules.begin(); i != Modules.end(); ++i)
        {
                Module* mod = i->second;
@@ -496,7 +499,6 @@ void ModuleManager::LoadAll()
                        AttachAll(mod);
                        AddServices(servicemap[i->first]);
                        mod->init();
-                       mod->ReadConfig(confstatus);
                }
                catch (CoreException& modexcept)
                {
@@ -508,6 +510,27 @@ void ModuleManager::LoadAll()
        }
 
        this->NewServices = NULL;
+       ConfigStatus confstatus;
+
+       // Step 3: Read the configuration for the modules. This must be done as part of
+       // its own step so that services provided by modules can be registered before
+       // the configuration is read.
+       for (ModuleMap::const_iterator i = Modules.begin(); i != Modules.end(); ++i)
+       {
+               Module* mod = i->second;
+               try
+               {
+                       ServerInstance->Logs->Log("MODULE", LOG_DEBUG, "Reading configuration for %s", i->first.c_str());
+                       mod->ReadConfig(confstatus);
+               }
+               catch (CoreException& modexcept)
+               {
+                       LastModuleError = "Unable to read the configuration for " + mod->ModuleSourceFile + ": " + modexcept.GetReason();
+                       ServerInstance->Logs->Log("MODULE", LOG_DEFAULT, LastModuleError);
+                       std::cout << std::endl << "[" << con_red << "*" << con_reset << "] " << LastModuleError << std::endl << std::endl;
+                       ServerInstance->Exit(EXIT_STATUS_CONFIG);
+               }
+       }
 
        if (!PrioritizeHooks())
                ServerInstance->Exit(EXIT_STATUS_MODULE);