]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/configreader.cpp
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@9201 e03df62e-2008...
[user/henk/code/inspircd.git] / src / configreader.cpp
index 2093c82c8e313366c820347560cabbf46e8eb7c3..cba015ec9b6ee6c3fdf77de8518977ecacd0f578 100644 (file)
@@ -63,32 +63,12 @@ void ServerConfig::ClearStack()
        include_stack.clear();
 }
 
-Module* ServerConfig::GetIOHook(int port)
-{
-       std::map<int,Module*>::iterator x = IOHookModule.find(port);
-       return (x != IOHookModule.end() ? x->second : NULL);
-}
-
 Module* ServerConfig::GetIOHook(BufferedSocket* is)
 {
        std::map<BufferedSocket*,Module*>::iterator x = SocketIOHookModule.find(is);
        return (x != SocketIOHookModule.end() ? x->second : NULL);
 }
 
-bool ServerConfig::AddIOHook(int port, Module* iomod)
-{
-       if (!GetIOHook(port))
-       {
-               IOHookModule[port] = iomod;
-               return true;
-       }
-       else
-       {
-               throw ModuleException("Port already hooked by another module");
-               return false;
-       }
-}
-
 bool ServerConfig::AddIOHook(Module* iomod, BufferedSocket* is)
 {
        if (!GetIOHook(is))
@@ -104,17 +84,6 @@ bool ServerConfig::AddIOHook(Module* iomod, BufferedSocket* is)
        }
 }
 
-bool ServerConfig::DelIOHook(int port)
-{
-       std::map<int,Module*>::iterator x = IOHookModule.find(port);
-       if (x != IOHookModule.end())
-       {
-               IOHookModule.erase(x);
-               return true;
-       }
-       return false;
-}
-
 bool ServerConfig::DelIOHook(BufferedSocket* is)
 {
        std::map<BufferedSocket*,Module*>::iterator x = SocketIOHookModule.find(is);
@@ -925,9 +894,9 @@ void ServerConfig::Read(bool bail, User* user)
                                InitTypes, DoType, DoneClassesAndTypes},
 
                {"class",
-                               {"name",        "commands",     NULL},
-                               {"",            "",             NULL},
-                               {DT_NOSPACES,   DT_CHARPTR},
+                               {"name",        "commands",     "usermodes",    "chanmodes",    NULL},
+                               {"",            "",             "",             "",             NULL},
+                               {DT_NOSPACES,   DT_CHARPTR,     DT_CHARPTR,     DT_CHARPTR},
                                InitClasses, DoClass, DoneClassesAndTypes},
        
                {NULL,
@@ -2105,8 +2074,12 @@ bool InitClasses(ServerConfig* conf, const char*)
        {
                for (operclass_t::iterator n = conf->operclass.begin(); n != conf->operclass.end(); n++)
                {
-                       if (n->second)
-                               delete[] n->second;
+                       if (n->second.commandlist)
+                               delete[] n->second.commandlist;
+                       if (n->second.cmodelist)
+                               delete[] n->second.cmodelist;
+                       if (n->second.umodelist)
+                               delete[] n->second.umodelist;
                }
        }
 
@@ -2129,12 +2102,31 @@ bool DoType(ServerConfig* conf, const char*, char**, ValueList &values, int*)
 /*
  * XXX should this be in a class? -- w00t
  */
-bool DoClass(ServerConfig* conf, const char*, char**, ValueList &values, int*)
+bool DoClass(ServerConfig* conf, const char* tag, char**, ValueList &values, int*)
 {
        const char* ClassName = values[0].GetString();
        const char* CommandList = values[1].GetString();
+       const char* UModeList = values[2].GetString();
+       const char* CModeList = values[3].GetString();
+
+       for (const char* c = UModeList; *c; ++c)
+       {
+               if ((*c < 'A' || *c > 'z') && *c != '*')
+               {
+                       throw CoreException("Character " + std::string(1, *c) + " is not a valid mode in <class:usermodes>");
+               }
+       }
+       for (const char* c = CModeList; *c; ++c)
+       {
+               if ((*c < 'A' || *c > 'z') && *c != '*')
+               {
+                       throw CoreException("Character " + std::string(1, *c) + " is not a valid mode in <class:chanmodes>");
+               }
+       }
 
-       conf->operclass[ClassName] = strnewdup(CommandList);
+       conf->operclass[ClassName].commandlist = strnewdup(CommandList);
+       conf->operclass[ClassName].umodelist = strnewdup(UModeList);
+       conf->operclass[ClassName].cmodelist = strnewdup(CModeList);
        return true;
 }