]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_operjoin.cpp
TRE regex provider (the same engine used by Unreal 3.2)
[user/henk/code/inspircd.git] / src / modules / m_operjoin.cpp
index d764c76d784c37cd0a27cc8ff58bfb319ee48237..549194ef7a9afd118081459eeb9e888ac74ed130 100644 (file)
@@ -19,7 +19,9 @@ class ModuleOperjoin : public Module
 {
        private:
                std::string operChan;
-               std::vector<std::string> operChans;             
+               std::vector<std::string> operChans;
+               std::map<std::string, std::vector<std::string> > operTypeChans; // Channels specific to an oper type.
+               bool override;
 
                int tokenize(const std::string &str, std::vector<std::string> &tokens)
                {
@@ -54,10 +56,23 @@ class ModuleOperjoin : public Module
                        ConfigReader* conf = new ConfigReader(ServerInstance);
 
                        operChan = conf->ReadValue("operjoin", "channel", 0);
+                       override = conf->ReadFlag("operjoin", "override", "0", 0);
                        operChans.clear();
                        if (!operChan.empty())
                                tokenize(operChan,operChans);
 
+                       std::map<std::string, std::vector<std::string> >().swap(operTypeChans);
+
+                       int olines = conf->Enumerate("type");
+                       for (int index = 0; index < olines; ++index)
+                       {
+                               std::string chanList = conf->ReadValue("type", "autojoin", index);
+                               if (!chanList.empty())
+                               {
+                                       tokenize(chanList, operTypeChans[conf->ReadValue("type", "name", index)]);
+                               }
+                       }
+
                        delete conf;
                }
 
@@ -67,7 +82,7 @@ class ModuleOperjoin : public Module
 
                virtual Version GetVersion()
                {
-                       return Version(1,1,0,1,VF_VENDOR,API_VERSION);
+                       return Version("$Id$", VF_VENDOR, API_VERSION);
                }
 
                virtual void OnPostOper(User* user, const std::string &opertype, const std::string &opername)
@@ -76,8 +91,22 @@ class ModuleOperjoin : public Module
                                return;
 
                        for(std::vector<std::string>::iterator it = operChans.begin(); it != operChans.end(); it++)
-                               if (ServerInstance->IsChannel(it->c_str()))
-                                       Channel::JoinUser(ServerInstance, user, it->c_str(), false, "", false, ServerInstance->Time());
+                               if (ServerInstance->IsChannel(it->c_str(), ServerInstance->Config->Limits.ChanMax))
+                                       Channel::JoinUser(ServerInstance, user, it->c_str(), override, "", false, ServerInstance->Time());
+
+                       std::map<std::string, std::vector<std::string> >::iterator i = operTypeChans.find(user->oper);
+
+                       if (i != operTypeChans.end())
+                       {
+                               const std::vector<std::string>& list = i->second;
+                               for (std::vector<std::string>::const_iterator it = list.begin(); it != list.end(); ++it)
+                               {
+                                       if (ServerInstance->IsChannel(it->c_str(), ServerInstance->Config->Limits.ChanMax))
+                                       {
+                                               Channel::JoinUser(ServerInstance, user, it->c_str(), override, "", false, ServerInstance->Time());
+                                       }
+                               }
+                       }
                }
 
 };