]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_alias.cpp
Updates, should be able to safely unload client modules with queries in progress...
[user/henk/code/inspircd.git] / src / modules / m_alias.cpp
1 /*   +------------------------------------+
2  *   | Inspire Internet Relay Chat Daemon |
3  *   +------------------------------------+
4  *
5  *  InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
6  *   E-mail:
7  *      <brain@chatspike.net>
8  *      <Craig@chatspike.net>
9  * 
10  * Written by Craig Edwards, Craig McLure, and others.
11  * This program is free but copyrighted software; see
12  *the file COPYING for details.
13  *
14  * ---------------------------------------------------
15  */
16
17 using namespace std;
18
19 #include "users.h"
20 #include "channels.h"
21 #include "modules.h"
22 #include "helperfuncs.h"
23 #include <vector>
24
25 /* $ModDesc: Provides aliases of commands. */
26
27 class Alias : public classbase
28 {
29         public:
30                 irc::string text;
31                 std::string replace_with;
32                 std::string requires;
33                 bool uline;
34 };
35
36 class ModuleAlias : public Module
37 {
38         private:
39                 Server *Srv;
40                 ConfigReader *MyConf;
41                 std::vector<Alias> Aliases;
42
43                 virtual void ReadAliases()
44                 {
45                         Aliases.clear();
46                 
47                         for (int i = 0; i < MyConf->Enumerate("alias"); i++)
48                         {
49                                 Alias a;
50                                 std::string txt;
51                                 txt = MyConf->ReadValue("alias", "text", i);
52                                 a.text = txt.c_str();
53                                 a.replace_with = MyConf->ReadValue("alias", "replace", i);
54                                 a.requires = MyConf->ReadValue("alias", "requires", i);
55                         
56                                 a.uline =       ((MyConf->ReadValue("alias", "uline", i) == "yes") ||
57                                                 (MyConf->ReadValue("alias", "uline", i) == "1") ||
58                                                 (MyConf->ReadValue("alias", "uline", i) == "true"));
59                                         
60                                 Aliases.push_back(a);
61                         }
62         
63                 }
64
65         public:
66         
67                 ModuleAlias(Server* Me)
68                         : Module::Module(Me)
69                 {
70                         Srv = Me;
71                         MyConf = new ConfigReader;
72                         ReadAliases();
73                 }
74
75                 void Implements(char* List)
76                 {
77                         List[I_OnPreCommand] = List[I_OnRehash] = 1;
78                 }
79         
80                 virtual ~ModuleAlias()
81                 {
82                         DELETE(MyConf);
83                 }
84         
85                 virtual Version GetVersion()
86                 {
87                         return Version(1,0,0,1,VF_VENDOR);
88                 }
89
90                 virtual int OnPreCommand(const std::string &command, const char** parameters, int pcnt, userrec *user, bool validated)
91                 {
92                         userrec *u = NULL;
93                         irc::string c = command.c_str();
94
95                         /* If the command is valid, we dont want to know,
96                          * and if theyre not registered yet, we dont want
97                          * to know either
98                          */
99                         if ((validated) || (user->registered != 7))
100                                 return 0;
101                         
102                         for (unsigned int i = 0; i < Aliases.size(); i++)
103                         {
104                                 if (Aliases[i].text == c)
105                                 {
106                                         if (Aliases[i].requires != "")
107                                         {
108                                                 u = Srv->FindNick(Aliases[i].requires);
109                                                 if (!u)
110                                                 {
111                                                         Srv->SendServ(user->fd,"401 "+std::string(user->nick)+" "+Aliases[i].requires+" :is currently unavailable. Please try again later.");
112                                                         return 1;
113                                                 }
114                                         }
115                                         if ((u != NULL) && (Aliases[i].requires != "") && (Aliases[i].uline))
116                                         {
117                                                 if (!Srv->IsUlined(u->server))
118                                                 {
119                                                         Srv->SendOpers("*** NOTICE -- Service "+Aliases[i].requires+" required by alias "+std::string(Aliases[i].text.c_str())+" is not on a u-lined server, possibly underhanded antics detected!"); 
120                                                         Srv->SendServ(user->fd,"401 "+std::string(user->nick)+" "+Aliases[i].requires+" :is an imposter! Please inform an IRC operator as soon as possible.");
121                                                         return 1;
122                                                 }
123                                         }
124
125                                         std::string n = "";
126                                         for (int j = 0; j < pcnt; j++)
127                                         {
128                                                 if (j)
129                                                         n = n + " ";
130                                                 n = n + parameters[j];
131                                         }
132                                         /* Final param now in n as one string */
133                                         std::stringstream stuff(Aliases[i].replace_with);
134
135                                         std::string cmd = "";
136                                         std::string target = "";
137                                         stuff >> cmd;
138                                         stuff >> target;
139
140                                         const char* para[2];
141                                         para[0] = target.c_str();
142                                         para[1] = n.c_str();
143
144                                         Srv->CallCommandHandler(cmd,para,2,user);
145                                         return 1;
146                                 }
147                         }
148                         return 0;
149                 }
150   
151                 virtual void OnRehash(const std::string &parameter)
152                 {
153                         DELETE(MyConf);
154                         MyConf = new ConfigReader;
155                 
156                         ReadAliases();
157                 }
158 };
159
160
161 class ModuleAliasFactory : public ModuleFactory
162 {
163         public:
164                 ModuleAliasFactory()
165                 {
166                 }
167         
168                 ~ModuleAliasFactory()
169                 {
170                 }
171         
172                 virtual Module * CreateModule(Server* Me)
173                 {
174                         return new ModuleAlias(Me);
175                 }
176 };
177
178
179 extern "C" void * init_module( void )
180 {
181         return new ModuleAliasFactory;
182 }
183