]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_operlevels.cpp
Added m_operlevels, prevents opers designated as above other opers from being killed
[user/henk/code/inspircd.git] / src / modules / m_operlevels.cpp
1 #include "users.h"
2 #include "channels.h"
3 #include "modules.h"
4 #include <string>
5
6 /* $ModDesc: Gives each oper type a 'level', cannot kill opers 'above' your level. */
7
8 Server *Srv;
9
10 class ModuleOperLevels : public Module
11 {
12
13         private:
14
15                 ConfigReader* conf;
16
17         public:
18
19                 ModuleOperLevels()
20                 {
21
22                         Srv = new Server;
23                         conf = new ConfigReader;
24                 }
25
26                 virtual ~ModuleOperLevels()
27                 {
28                         delete Srv;
29                         delete conf;
30                 }
31
32                 virtual void OnRehash()
33                 {
34                         delete conf;
35                         conf = new ConfigReader;
36                 }
37
38                 virtual Version GetVersion()
39                 {
40                         return Version(1,0,0,0);
41                 }
42
43                 virtual int OnKill(userrec* source, userrec* dest, std::string reason)
44                 {
45                         long dest_level = 0,source_level = 0;
46                         // oper killing an oper?
47                         if (strchr(dest->modes,'o'))
48                         {
49                                 for (int j =0; j < conf->Enumerate("type"); j++)
50                                 {
51                                         std::string typen = conf->ReadValue("type","name",j);
52                                         if (!strcmp(typen.c_str(),dest->oper))
53                                         {
54                                                 dest_level = conf->ReadInteger("type","level",j,true);
55                                                 break;
56                                         }
57                                 }
58                                 for (int k =0; k < conf->Enumerate("type"); k++)
59                                 {
60                                         std::string typen = conf->ReadValue("type","name",k);
61                                         if (!strcmp(typen.c_str(),source->oper))
62                                         {
63                                                 source_level = conf->ReadInteger("type","level",k,true);
64                                                 break;
65                                         }
66                                 }
67                                 if (dest_level > source_level)
68                                 {
69                                         WriteOpers("Oper %s (level %d) attempted to /kill a higher oper: %s (level %d): Reason: %s",source->nick,source_level,dest->nick,dest_level,reason.c_str());
70                                         WriteServ(dest->fd,"NOTICE %s :Oper %s attempted to /kill you!",dest->nick,source->nick);
71                                         WriteServ(source->fd,"481 %s :Permission Denied- Oper %s is a higher level than you",source->nick,dest->nick);
72                                         return 1;
73                                 }
74                                 return 0;
75                         }
76                 }
77
78 };
79
80 class ModuleOperLevelsFactory : public ModuleFactory
81 {
82  public:
83         ModuleOperLevelsFactory()
84         {
85         }
86
87         ~ModuleOperLevelsFactory()
88         {
89         }
90
91         virtual Module * CreateModule()
92         {
93                 return new ModuleOperLevels;
94         }
95
96 };
97
98 extern "C" void * init_module( void )
99 {
100         return new ModuleOperLevelsFactory;
101 }
102