]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_alias.cpp
CamelCaseRocksSoMuchICamelCasedAllTheMethodsOfClassInspIRCdSoThatItAllLooksNeat.
[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 "commands.h"
24 #include "inspircd.h"
25 #include <vector>
26
27 /* $ModDesc: Provides aliases of commands. */
28
29
30
31 class Alias : public classbase
32 {
33  public:
34         irc::string text;
35         std::string replace_with;
36         std::string requires;
37         bool uline;
38 };
39
40 class ModuleAlias : public Module
41 {
42  private:
43         ConfigReader *MyConf;
44         std::vector<Alias> Aliases;
45
46         virtual void ReadAliases()
47         {
48                 Aliases.clear();
49         
50                 for (int i = 0; i < MyConf->Enumerate("alias"); i++)
51                 {
52                         Alias a;
53                         std::string txt;
54                         txt = MyConf->ReadValue("alias", "text", i);
55                         a.text = txt.c_str();
56                         a.replace_with = MyConf->ReadValue("alias", "replace", i);
57                         a.requires = MyConf->ReadValue("alias", "requires", i);
58                 
59                         a.uline =       ((MyConf->ReadValue("alias", "uline", i) == "yes") ||
60                                         (MyConf->ReadValue("alias", "uline", i) == "1") ||
61                                                 (MyConf->ReadValue("alias", "uline", i) == "true"));
62                                         
63                         Aliases.push_back(a);
64                 }
65
66         }
67
68  public:
69         
70         ModuleAlias(InspIRCd* Me)
71                 : Module::Module(Me)
72         {
73                 
74                 MyConf = new ConfigReader(ServerInstance);
75                 ReadAliases();
76         }
77
78         void Implements(char* List)
79         {
80                 List[I_OnPreCommand] = List[I_OnRehash] = 1;
81         }
82
83         virtual ~ModuleAlias()
84         {
85                 DELETE(MyConf);
86         }
87
88         virtual Version GetVersion()
89         {
90                 return Version(1,0,0,1,VF_VENDOR);
91         }
92
93         virtual int OnPreCommand(const std::string &command, const char** parameters, int pcnt, userrec *user, bool validated)
94         {
95                 userrec *u = NULL;
96                 irc::string c = command.c_str();
97                 /* If the command is valid, we dont want to know,
98                  * and if theyre not registered yet, we dont want
99                  * to know either
100                  */
101                 if ((validated) || (user->registered != REG_ALL))
102                         return 0;
103                 
104                 for (unsigned int i = 0; i < Aliases.size(); i++)
105                 {
106                         if (Aliases[i].text == c)
107                         {
108                                 if (Aliases[i].requires != "")
109                                 {
110                                         u = ServerInstance->FindNick(Aliases[i].requires);
111                                         if (!u)
112                                         {
113                                                 user->WriteServ("401 "+std::string(user->nick)+" "+Aliases[i].requires+" :is currently unavailable. Please try again later.");
114                                                 return 1;
115                                         }
116                                 }
117                                 if ((u != NULL) && (Aliases[i].requires != "") && (Aliases[i].uline))
118                                 {
119                                         if (!ServerInstance->ULine(u->server))
120                                         {
121                                                 ServerInstance->WriteOpers("*** 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!"); 
122                                                 user->WriteServ("401 "+std::string(user->nick)+" "+Aliases[i].requires+" :is an imposter! Please inform an IRC operator as soon as possible.");
123                                                 return 1;
124                                         }
125                                 }
126                                         std::string n = "";
127                                 for (int j = 0; j < pcnt; j++)
128                                 {
129                                         if (j)
130                                                 n = n + " ";
131                                         n = n + parameters[j];
132                                 }
133                                 /* Final param now in n as one string */
134                                 std::stringstream stuff(Aliases[i].replace_with);
135                                         std::string cmd = "";
136                                 std::string target = "";
137                                 stuff >> cmd;
138                                 stuff >> target;
139                                         const char* para[2];
140                                 para[0] = target.c_str();
141                                 para[1] = n.c_str();
142                                         ServerInstance->CallCommandHandler(cmd,para,2,user);
143                                 return 1;
144                         }
145                 }
146                 return 0;
147         }
148  
149         virtual void OnRehash(const std::string &parameter)
150         {
151                 DELETE(MyConf);
152                 MyConf = new ConfigReader(ServerInstance);
153         
154                 ReadAliases();
155         }
156 };
157
158
159 class ModuleAliasFactory : public ModuleFactory
160 {
161  public:
162         ModuleAliasFactory()
163         {
164         }
165
166         ~ModuleAliasFactory()
167         {
168         }
169
170                 virtual Module * CreateModule(InspIRCd* Me)
171         {
172                 return new ModuleAlias(Me);
173         }
174 };
175
176
177 extern "C" void * init_module( void )
178 {
179         return new ModuleAliasFactory;
180 }
181