]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_alias.cpp
Added m_nokicks and chanmode +Q
[user/henk/code/inspircd.git] / src / modules / m_alias.cpp
1 #include "users.h"
2 #include "channels.h"
3 #include "modules.h"
4 #include <vector>
5
6 /* $ModDesc: Changes the ident of connecting bottler clients to 'bottler' */
7
8 class Alias
9 {
10  public:
11         std::string text;
12         std::string replace_with;
13         std::string requires;
14         bool uline;
15 };
16
17 class ModuleAlias : public Module
18 {
19  private:
20          
21          Server *Srv;
22          ConfigReader *MyConf;
23          std::vector<Alias> Aliases;
24  public:
25  
26         virtual void ReadAliases()
27         {
28                 Aliases.clear();
29                 
30                 for (int i = 0; i < MyConf->Enumerate("alias"); i++)
31                 {
32                         Alias a;
33                         a.text = MyConf->ReadValue("alias", "text", i);
34                         a.replace_with = MyConf->ReadValue("alias", "replace", i);
35                         a.requires = MyConf->ReadValue("alias", "requires", i);
36                         
37                         a.uline =       ((MyConf->ReadValue("alias", "uline", i) == "yes") ||
38                                         (MyConf->ReadValue("alias", "uline", i) == "1") ||
39                                         (MyConf->ReadValue("alias", "uline", i) == "true"));
40                                         
41                         Aliases.push_back(a);
42                 }
43         
44         }
45         
46         ModuleAlias()
47         {
48                 Srv = new Server;
49                 MyConf = new ConfigReader;
50
51                 ReadAliases();
52         }
53         
54         virtual ~ModuleAlias()
55         {
56                 delete Srv;
57                 delete MyConf;
58         }
59         
60         virtual Version GetVersion()
61         {
62                 return Version(1,0,0,0);
63         }
64
65
66         virtual void OnServerRaw(std::string &raw, bool inbound, userrec* user)
67         {
68                 if (inbound)
69                 {
70                         char data[MAXBUF];
71                         strncpy(data,raw.c_str(),MAXBUF);
72                         char* dptr = data;
73                         
74                         for (int i = 0; i < Aliases.size(); i++)
75                         {
76                                 if (!strncasecmp(Aliases[i].text.c_str(),data,Aliases[i].text.length()))
77                                 {
78                                         userrec* u = NULL;
79                                         
80                                         if (Aliases[i].requires != "")
81                                         {
82                                                 u = Srv->FindNick(Aliases[i].requires);
83                                         }
84                                         
85                                         if ((Aliases[i].requires != "") && (!u))
86                                         {
87                                                 Srv->SendServ(user->fd,"401 "+std::string(user->nick)+" "+Aliases[i].requires+" :is currently unavailable. Please try again later.");
88                                                 raw = "PONG :"+Srv->GetServerName();
89                                                 return;
90                                         }
91                                         if (Aliases[i].uline)
92                                         {
93                                                 if (!Srv->IsUlined(u->server))
94                                                 {
95                                                         Srv->SendOpers("*** NOTICE -- Service "+Aliases[i].requires+" required by alias "+Aliases[i].text+" is not on a u-lined server, possibly underhanded antics detected!"); 
96                                                         Srv->SendServ(user->fd,"401 "+std::string(user->nick)+" "+Aliases[i].requires+" :is an imposter! Please inform an IRC operator as soon as possible.");
97                                                         raw = "PONG :"+Srv->GetServerName();
98                                                         return;
99                                                 }
100                                         }
101                                         
102                                         dptr += Aliases[i].text.length();
103                                         if (strlen(dptr))
104                                         {
105                                                 raw = Aliases[i].replace_with + std::string(dptr);
106                                         }
107                                         else
108                                         {
109                                                 raw = Aliases[i].replace_with;
110                                         }
111                                         return;
112                                 }
113                         }
114                 }
115         }
116   
117         virtual void OnRehash()
118         {
119                 delete MyConf;
120                 MyConf = new ConfigReader;
121                 
122                 ReadAliases();
123         }
124 };
125
126
127 class ModuleAliasFactory : public ModuleFactory
128 {
129  public:
130         ModuleAliasFactory()
131         {
132         }
133         
134         ~ModuleAliasFactory()
135         {
136         }
137         
138         virtual Module * CreateModule()
139         {
140                 return new ModuleAlias;
141         }
142         
143 };
144
145
146 extern "C" void * init_module( void )
147 {
148         return new ModuleAliasFactory;
149 }
150