]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules.cpp
1c37dd0cb4dda0829652e3f5ab68749141e238f6
[user/henk/code/inspircd.git] / src / modules.cpp
1 /*
2
3
4 */
5
6
7
8 #include <typeinfo>
9 #include <iostream>
10 #include "globals.h"
11 #include "modules.h"
12 #include "ctables.h"
13 #include "inspircd_io.h"
14 #include "wildcard.h"
15 #include "mode.h"
16 #include "message.h"
17
18 // class type for holding an extended mode character - internal to core
19
20 class ExtMode : public classbase
21 {
22 public:
23         char modechar;
24         int type;
25         int params_when_on;
26         int params_when_off;
27         bool needsoper;
28         ExtMode(char mc, int ty, bool oper, int p_on, int p_off) : modechar(mc), type(ty), needsoper(oper), params_when_on(p_on), params_when_off(p_off) { };
29 };                                     
30
31 typedef std::vector<ExtMode> ExtModeList;
32 typedef ExtModeList::iterator ExtModeListIter;
33
34 ExtModeList EMode;
35
36 // returns true if an extended mode character is in use
37 bool ModeDefined(char modechar, int type)
38 {
39         log(DEBUG,"Size of extmodes vector is %d",EMode.size());
40         for (ExtModeListIter i = EMode.begin(); i < EMode.end(); i++)
41         {
42                 log(DEBUG,"i->modechar==%c, modechar=%c, i->type=%d, type=%d",i->modechar,modechar,i->type,type);
43                 if ((i->modechar == modechar) && (i->type == type))
44                 {
45                         return true;
46                 }
47         }
48         return false;
49 }
50
51 bool ModeDefinedOper(char modechar, int type)
52 {
53         log(DEBUG,"Size of extmodes vector is %d",EMode.size());
54         for (ExtModeListIter i = EMode.begin(); i < EMode.end(); i++)
55         {
56                 log(DEBUG,"i->modechar==%c, modechar=%c, i->type=%d, type=%d",i->modechar,modechar,i->type,type);
57                 if ((i->modechar == modechar) && (i->type == type) && (i->needsoper == true))
58                 {
59                         return true;
60                 }
61         }
62         return false;
63 }
64
65 // returns number of parameters for a custom mode when it is switched on
66 int ModeDefinedOn(char modechar, int type)
67 {
68         for (ExtModeListIter i = EMode.begin(); i < EMode.end(); i++)
69         {
70                 if ((i->modechar == modechar) && (i->type == type))
71                 {
72                         return i->params_when_on;
73                 }
74         }
75         return 0;
76 }
77
78 // returns number of parameters for a custom mode when it is switched on
79 int ModeDefinedOff(char modechar, int type)
80 {
81         for (ExtModeListIter i = EMode.begin(); i < EMode.end(); i++)
82         {
83                 if ((i->modechar == modechar) && (i->type == type))
84                 {
85                         return i->params_when_off;
86                 }
87         }
88         return 0;
89 }
90
91 // returns true if an extended mode character is in use
92 bool DoAddExtendedMode(char modechar, int type, bool requires_oper, int params_on, int params_off)
93 {
94         if (ModeDefined(modechar,type)) {
95                 return false;
96         }
97         EMode.push_back(ExtMode(modechar,type,requires_oper,params_on,params_off));
98         return true;
99 }
100
101
102 // version is a simple class for holding a modules version number
103
104 Version::Version(int major, int minor, int revision, int build) : Major(major), Minor(minor), Revision(revision), Build(build) { };
105
106 // admin is a simple class for holding a server's administrative info
107
108 Admin::Admin(std::string name, std::string email, std::string nick) : Name(name), Email(email), Nick(nick) { };
109
110 Module::Module() { }
111 Module::~Module() { }
112 void Module::OnUserConnect(userrec* user) { }
113 void Module::OnUserQuit(userrec* user) { }
114 void Module::OnUserJoin(userrec* user, chanrec* channel) { }
115 void Module::OnUserPart(userrec* user, chanrec* channel) { }
116 void Module::OnPacketTransmit(char *p) { }
117 void Module::OnPacketReceive(char *p) { }
118 void Module::OnRehash() { }
119 void Module::OnServerRaw(std::string &raw, bool inbound) { }
120 int Module::OnUserPreJoin(userrec* user, chanrec* chan, const char* cname) { return 0; }
121 bool Module::OnExtendedMode(userrec* user, void* target, char modechar, int type, bool mode_on, string_list &params) { return false; }
122 Version Module::GetVersion() { return Version(1,0,0,0); }
123 void Module::OnOper(userrec* user) { };
124 void Module::OnInfo(userrec* user) { };
125 void Module::OnWhois(userrec* source, userrec* dest) { };
126 int Module::OnUserPreMessage(userrec* user,void* dest,int target_type, std::string text) { return 0; };
127 int Module::OnUserPreNotice(userrec* user,void* dest,int target_type, std::string text) { return 0; };
128 int Module::OnUserPreNick(userrec* user, std::string newnick) { return 0; };
129
130 // server is a wrapper class that provides methods to all of the C-style
131 // exports in the core
132 //
133
134 Server::Server()
135 {
136 }
137
138 Server::~Server()
139 {
140 }
141
142 void Server::SendOpers(std::string s)
143 {
144         WriteOpers("%s",s.c_str());
145 }
146
147 bool Server::MatchText(std::string sliteral, std::string spattern)
148 {
149         char literal[MAXBUF],pattern[MAXBUF];
150         strncpy(literal,sliteral.c_str(),MAXBUF);
151         strncpy(pattern,spattern.c_str(),MAXBUF);
152         return match(literal,pattern);
153 }
154
155 void Server::SendToModeMask(std::string modes, int flags, std::string text)
156 {
157         WriteMode(modes.c_str(),flags,"%s",text.c_str());
158 }
159
160 chanrec* Server::JoinUserToChannel(userrec* user, std::string cname, std::string key)
161 {
162         return add_channel(user,cname.c_str(),key.c_str(),true);
163 }
164
165 chanrec* Server::PartUserFromChannel(userrec* user, std::string cname, std::string reason)
166 {
167         return del_channel(user,cname.c_str(),reason.c_str(),false);
168 }
169
170 void Server::ChangeUserNick(userrec* user, std::string nickname)
171 {
172         force_nickchange(user,nickname.c_str());
173 }
174
175 void Server::QuitUser(userrec* user, std::string reason)
176 {
177         send_network_quit(user->nick,reason.c_str());
178         kill_link(user,reason.c_str());
179 }
180
181 void Server::CallCommandHandler(std::string commandname, char** parameters, int pcnt, userrec* user)
182 {
183         call_handler(commandname.c_str(),parameters,pcnt,user);
184 }
185
186 void Server::Log(int level, std::string s)
187 {
188         log(level,"%s",s.c_str());
189 }
190
191 void Server::AddCommand(char* cmd, handlerfunc f, char flags, int minparams)
192 {
193         createcommand(cmd,f,flags,minparams);
194 }
195
196 void Server::SendMode(char **parameters, int pcnt, userrec *user)
197 {
198         server_mode(parameters,pcnt,user);
199 }
200
201 void Server::Send(int Socket, std::string s)
202 {
203         Write(Socket,"%s",s.c_str());
204 }
205
206 void Server::SendServ(int Socket, std::string s)
207 {
208         WriteServ(Socket,"%s",s.c_str());
209 }
210
211 void Server::SendFrom(int Socket, userrec* User, std::string s)
212 {
213         WriteFrom(Socket,User,"%s",s.c_str());
214 }
215
216 void Server::SendTo(userrec* Source, userrec* Dest, std::string s)
217 {
218         if (!Source)
219         {
220                 // if source is NULL, then the message originates from the local server
221                 Write(Dest->fd,":%s %s",this->GetServerName().c_str(),s.c_str());
222         }
223         else
224         {
225                 // otherwise it comes from the user specified
226                 WriteTo(Source,Dest,"%s",s.c_str());
227         }
228 }
229
230 void Server::SendChannel(userrec* User, chanrec* Channel, std::string s,bool IncludeSender)
231 {
232         if (IncludeSender)
233         {
234                 WriteChannel(Channel,User,"%s",s.c_str());
235         }
236         else
237         {
238                 ChanExceptSender(Channel,User,"%s",s.c_str());
239         }
240 }
241
242 bool Server::CommonChannels(userrec* u1, userrec* u2)
243 {
244         return (common_channels(u1,u2) != 0);
245 }
246
247 void Server::SendCommon(userrec* User, std::string text,bool IncludeSender)
248 {
249         if (IncludeSender)
250         {
251                 WriteCommon(User,"%s",text.c_str());
252         }
253         else
254         {
255                 WriteCommonExcept(User,"%s",text.c_str());
256         }
257 }
258
259 void Server::SendWallops(userrec* User, std::string text)
260 {
261         WriteWallOps(User,false,"%s",text.c_str());
262 }
263
264 void Server::ChangeHost(userrec* user, std::string host)
265 {
266         ChangeDisplayedHost(user,host.c_str());
267 }
268
269 void Server::ChangeGECOS(userrec* user, std::string gecos)
270 {
271         ChangeName(user,gecos.c_str());
272 }
273
274 bool Server::IsNick(std::string nick)
275 {
276         return (isnick(nick.c_str()) != 0);
277 }
278
279 userrec* Server::FindNick(std::string nick)
280 {
281         return Find(nick);
282 }
283
284 chanrec* Server::FindChannel(std::string channel)
285 {
286         return FindChan(channel.c_str());
287 }
288
289 std::string Server::ChanMode(userrec* User, chanrec* Chan)
290 {
291         return cmode(User,Chan);
292 }
293
294 std::string Server::GetServerName()
295 {
296         return getservername();
297 }
298
299 std::string Server::GetNetworkName()
300 {
301         return getnetworkname();
302 }
303
304 Admin Server::GetAdmin()
305 {
306         return Admin(getadminname(),getadminemail(),getadminnick());
307 }
308
309
310
311 bool Server::AddExtendedMode(char modechar, int type, bool requires_oper, int params_when_on, int params_when_off)
312 {
313         if (type == MT_SERVER)
314         {
315                 log(DEBUG,"*** API ERROR *** Modes of type MT_SERVER are reserved for future expansion");
316                 return false;
317         }
318         if (((params_when_on>0) || (params_when_off>0)) && (type == MT_CLIENT))
319         {
320                 log(DEBUG,"*** API ERROR *** Parameters on MT_CLIENT modes are not supported");
321                 return false;
322         }
323         if ((params_when_on>1) || (params_when_off>1))
324         {
325                 log(DEBUG,"*** API ERROR *** More than one parameter for an MT_CHANNEL mode is not yet supported");
326                 return false;
327         }
328         return DoAddExtendedMode(modechar,type,requires_oper,params_when_on,params_when_off);
329 }
330
331 int Server::CountUsers(chanrec* c)
332 {
333         return usercount(c);
334 }
335
336
337 ConfigReader::ConfigReader()
338 {
339         this->cache = new std::stringstream(std::stringstream::in | std::stringstream::out);
340         this->error = LoadConf(CONFIG_FILE,this->cache);
341 }
342
343
344 ConfigReader::~ConfigReader()
345 {
346         if (this->cache)
347                 delete this->cache;
348 }
349
350
351 ConfigReader::ConfigReader(std::string filename)
352 {
353         this->cache = new std::stringstream(std::stringstream::in | std::stringstream::out);
354         this->error = LoadConf(filename.c_str(),this->cache);
355 };
356
357 std::string ConfigReader::ReadValue(std::string tag, std::string name, int index)
358 {
359         char val[MAXBUF];
360         char t[MAXBUF];
361         char n[MAXBUF];
362         strncpy(t,tag.c_str(),MAXBUF);
363         strncpy(n,name.c_str(),MAXBUF);
364         ReadConf(cache,t,n,index,val);
365         return std::string(val);
366 }
367
368
369 int ConfigReader::Enumerate(std::string tag)
370 {
371         return EnumConf(cache,tag.c_str());
372 }
373
374 int ConfigReader::EnumerateValues(std::string tag, int index)
375 {
376         return EnumValues(cache, tag.c_str(), index);
377 }
378
379 bool ConfigReader::Verify()
380 {
381         return this->error;
382 }
383
384
385 FileReader::FileReader(std::string filename)
386 {
387         file_cache c;
388         readfile(c,filename.c_str());
389         this->fc = c;
390 }
391
392 FileReader::FileReader()
393 {
394 }
395
396 void FileReader::LoadFile(std::string filename)
397 {
398         file_cache c;
399         readfile(c,filename.c_str());
400         this->fc = c;
401 }
402
403
404 FileReader::~FileReader()
405 {
406 }
407
408 bool FileReader::Exists()
409 {
410         if (fc.size() == 0)
411         {
412                 return(false);
413         }
414         else
415         {
416                 return(true);
417         }
418 }
419
420 std::string FileReader::GetLine(int x)
421 {
422         if ((x<0) || (x>fc.size()))
423                 return "";
424         return fc[x];
425 }
426
427 int FileReader::FileSize()
428 {
429         return fc.size();
430 }
431
432
433 std::vector<Module*> modules(255);
434 std::vector<ircd_module*> factory(255);
435
436 int MODCOUNT  = -1;
437
438