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