]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_alias.cpp
auto-set +s when +n is set (as +n requires +s) - allow +n to be 'set twice' allowing...
[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 "commands.h"
23 #include "inspircd.h"
24 #include <vector>
25
26 /* $ModDesc: Provides aliases of commands. */
27
28 class Alias : public classbase
29 {
30  public:
31         irc::string text;
32         std::string replace_with;
33         std::string requires;
34         bool uline;
35 };
36
37 class ModuleAlias : public Module
38 {
39  private:
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(InspIRCd* Me)
68                 : Module::Module(Me)
69         {
70                 
71                 MyConf = new ConfigReader(ServerInstance);
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                 /* If the command is valid, we dont want to know,
95                  * and if theyre not registered yet, we dont want
96                  * to know either
97                  */
98                 if ((validated) || (user->registered != REG_ALL))
99                         return 0;
100                 
101                 for (unsigned int i = 0; i < Aliases.size(); i++)
102                 {
103                         if (Aliases[i].text == c)
104                         {
105                                 if (Aliases[i].requires != "")
106                                 {
107                                         u = ServerInstance->FindNick(Aliases[i].requires);
108                                         if (!u)
109                                         {
110                                                 user->WriteServ("401 "+std::string(user->nick)+" "+Aliases[i].requires+" :is currently unavailable. Please try again later.");
111                                                 return 1;
112                                         }
113                                 }
114                                 if ((u != NULL) && (Aliases[i].requires != "") && (Aliases[i].uline))
115                                 {
116                                         if (!ServerInstance->ULine(u->server))
117                                         {
118                                                 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!"); 
119                                                 user->WriteServ("401 "+std::string(user->nick)+" "+Aliases[i].requires+" :is an imposter! Please inform an IRC operator as soon as possible.");
120                                                 return 1;
121                                         }
122                                 }
123                                         std::string n = "";
124                                 for (int j = 0; j < pcnt; j++)
125                                 {
126                                         if (j)
127                                                 n = n + " ";
128                                         n = n + parameters[j];
129                                 }
130                                 /* Final param now in n as one string */
131                                 std::stringstream stuff(Aliases[i].replace_with);
132                                         std::string cmd = "";
133                                 std::string target = "";
134                                 stuff >> cmd;
135                                 stuff >> target;
136                                         const char* para[2];
137                                 para[0] = target.c_str();
138                                 para[1] = n.c_str();
139                                         ServerInstance->CallCommandHandler(cmd,para,2,user);
140                                 return 1;
141                         }
142                 }
143                 return 0;
144         }
145  
146         virtual void OnRehash(const std::string &parameter)
147         {
148                 DELETE(MyConf);
149                 MyConf = new ConfigReader(ServerInstance);
150         
151                 ReadAliases();
152         }
153 };
154
155
156 class ModuleAliasFactory : public ModuleFactory
157 {
158  public:
159         ModuleAliasFactory()
160         {
161         }
162
163         ~ModuleAliasFactory()
164         {
165         }
166
167                 virtual Module * CreateModule(InspIRCd* Me)
168         {
169                 return new ModuleAlias(Me);
170         }
171 };
172
173
174 extern "C" void * init_module( void )
175 {
176         return new ModuleAliasFactory;
177 }
178