]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_conn_umodes.cpp
f9118a384482bdbb95416db7cf07d751d8a263d8
[user/henk/code/inspircd.git] / src / modules / m_conn_umodes.cpp
1 /*       +------------------------------------+\r *       | Inspire Internet Relay Chat Daemon |\r *       +------------------------------------+\r *\r *  InspIRCd: (C) 2002-2007 InspIRCd Development Team\r * See: http://www.inspircd.org/wiki/index.php/Credits\r *\r * This program is free but copyrighted software; see\r *            the file COPYING for details.\r *\r * ---------------------------------------------------\r */\r\r#include "inspircd.h"\r#include "users.h"\r#include "channels.h"\r#include "modules.h"\r#include "wildcard.h"\r\r/* $ModDesc: Sets (and unsets) modes on users when they connect */\r\rclass ModuleModesOnConnect : public Module\r{\r private:\r\r     ConfigReader *Conf;\r\r public:\r  ModuleModesOnConnect(InspIRCd* Me)\r             : Module(Me)\r   {\r              \r               Conf = new ConfigReader(ServerInstance);\r       }\r\r     void Implements(char* List)\r    {\r              List[I_OnPostConnect] = List[I_OnRehash] = 1;\r  }\r\r     virtual void OnRehash(userrec* user, const std::string &parameter)\r     {\r              DELETE(Conf);\r          Conf = new ConfigReader(ServerInstance);\r       }\r      \r       virtual ~ModuleModesOnConnect()\r        {\r              DELETE(Conf);\r  }\r      \r       virtual Version GetVersion()\r   {\r              return Version(1,1,0,1,VF_VENDOR,API_VERSION);\r }\r      \r       virtual void OnPostConnect(userrec* user)\r      {\r              if (!IS_LOCAL(user))\r                   return;\r\r               for (int j = 0; j < Conf->Enumerate("connect"); j++)\r           {\r                      std::string hostn = Conf->ReadValue("connect","allow",j);\r                      if ((match(user->GetIPString(),hostn.c_str(),true)) || (match(user->host,hostn.c_str())))\r                      {\r                              std::string ThisModes = Conf->ReadValue("connect","modes",j);\r                          if (!ThisModes.empty())\r                                {\r                                      std::string buf;\r                                       stringstream ss(ThisModes);\r\r                                   vector<string> tokens;\r\r                                        // split ThisUserModes into modes and mode params\r                                      while (ss >> buf)\r                                              tokens.push_back(buf);\r\r                                        int size = tokens.size() + 1;\r                                  const char** modes = new const char*[size];\r                                    modes[0] = user->nick;\r                                 modes[1] = tokens[0].c_str();\r\r                                 if (tokens.size() > 1)\r                                 {\r                                              // process mode params\r                                         int i = 2;\r                                             for (unsigned int k = 1; k < tokens.size(); k++)\r                                               {\r                                                      modes[i] = tokens[k].c_str();\r                                                  i++;\r                                           }\r                                      }\r\r                                     ServerInstance->Parser->CallHandler("MODE", modes, size, user);\r                                        delete [] modes;\r                               }\r                              break;\r                 }\r              }\r      }\r};\r\rMODULE_INIT(ModuleModesOnConnect)\r