]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_override.cpp
Added oper-override module
[user/henk/code/inspircd.git] / src / modules / m_override.cpp
1 #include <stdio.h>
2
3 #include "users.h"
4 #include "channels.h"
5 #include "modules.h"
6
7 /* $ModDesc: Provides channel modes +a and +q */
8
9 char dummyvalue[] = "on";
10
11 class ModuleOverride : public Module
12 {
13         Server *Srv;
14         bool NoisyOverride;
15         ConfigReader *Conf;
16         
17  public:
18  
19         ModuleOverride()
20         {
21         
22                 // here we initialise our module. Use new to create new instances of the required
23                 // classes.
24                 
25                 Srv = new Server;
26                 Conf = new ConfigReader;
27                 
28                 // read our config options (main config file)
29                 NoisyOverride = Conf->ReadFlag("override","noisy",0);
30         }
31         
32         virtual void OnRehash()
33         {
34                 // on a rehash we delete our classes for good measure and create them again.
35                 delete Conf;
36                 Conf = new ConfigReader;
37                 // re-read our config options on a rehash
38                 NoisyOverride = Conf->ReadFlag("override","noisy",0);
39         }
40         
41         virtual int OnAccessCheck(userrec* source,userrec* dest,chanrec* channel,int access_type)
42         {
43                 if (strchr(source->modes,'o'))
44                 {
45                         if ((Srv->ChanMode(source,channel) != "%") && (Srv->ChanMode(source,channel) != "@"))
46                         {
47                                 switch (access_type)
48                                 {
49                                         case AC_KICK:
50                                                 Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Kicked "+std::string(dest->nick)+" on "+std::string(channel->name));
51                                         break;
52                                         case AC_DEOP:
53                                                 Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Deopped "+std::string(dest->nick)+" on "+std::string(channel->name));
54                                         break;
55                                         case AC_OP:
56                                                 Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Opped "+std::string(dest->nick)+" on "+std::string(channel->name));
57                                         break;
58                                         case AC_VOICE:
59                                                 Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Voiced "+std::string(dest->nick)+" on "+std::string(channel->name));
60                                         break;
61                                         case AC_DEVOICE:
62                                                 Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Devoiced "+std::string(dest->nick)+" on "+std::string(channel->name));
63                                         break;
64                                         case AC_HALFOP:
65                                                 Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Halfopped "+std::string(dest->nick)+" on "+std::string(channel->name));
66                                         break;
67                                         case AC_DEHALFOP:
68                                                 Srv->SendOpers("*** NOTICE: "+std::string(source->nick)+" Override-Dehalfopped "+std::string(dest->nick)+" on "+std::string(channel->name));
69                                         break;
70                                 }
71                         }
72                         return ACR_ALLOW;
73                 }
74
75                 return ACR_DEFAULT;
76         }
77         
78         virtual int OnUserPreJoin(userrec* user, chanrec* chan, const char* cname)
79         {
80                 if (strchr(user->modes,'o'))
81                 {
82                         if (chan)
83                         {
84                                 if ((chan->inviteonly) || (chan->key[0]) || (chan->limit >= Srv->CountUsers(chan)))
85                                 {
86                                         if (NoisyOverride)
87                                         {
88                                                 if (!user->IsInvited(chan->name))
89                                                 {
90                                                         WriteChannelWithServ((char*)Srv->GetServerName().c_str(),chan,user,"NOTICE %s :%s invited himself into the channel",cname,user->nick);
91                                                 }
92                                         }
93                                         Srv->SendOpers("*** "+std::string(user->nick)+" used operoverride to bypass +i, +k or +l on "+std::string(cname));
94                                 }
95                                 return -1;
96                         }
97                 }
98                 return 0;
99         }
100         
101         virtual ~ModuleOverride()
102         {
103                 delete Conf;
104                 delete Srv;
105         }
106         
107         virtual Version GetVersion()
108         {
109                 return Version(1,0,0,0);
110         }
111 };
112
113
114 class ModuleOverrideFactory : public ModuleFactory
115 {
116  public:
117         ModuleOverrideFactory()
118         {
119         }
120         
121         ~ModuleOverrideFactory()
122         {
123         }
124         
125         virtual Module * CreateModule()
126         {
127                 return new ModuleOverride;
128         }
129         
130 };
131
132
133 extern "C" void * init_module( void )
134 {
135         return new ModuleOverrideFactory;
136 }
137