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