]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_helpop.cpp
Added m_nokicks and chanmode +Q
[user/henk/code/inspircd.git] / src / modules / m_helpop.cpp
1 #include "users.h"
2 #include "channels.h"
3 #include "modules.h"
4
5 // Global Vars
6 ConfigReader *helpop;
7 Server *Srv;
8
9 void handle_helpop(char**, int, userrec*);
10 bool do_helpop(char**, int, userrec*);
11 void sendtohelpop(userrec*, int, char**);
12
13
14 /* $ModDesc: /helpop Command, Works like Unreal helpop */
15
16 void handle_helpop(char **parameters, int pcnt, userrec *user)
17 {
18         char a[MAXBUF];
19         std::string output = " ";
20
21         if (pcnt < 1) {
22                 do_helpop(NULL,pcnt,user);
23                 return;
24         }
25
26         // FIX by brain: make the string lowercase, ConfigReader is
27         // case sensitive
28         char* lower = parameters[0];
29         for (int t = 0; t < strlen(lower); t++)
30                 lower[t] = tolower(lower[t]);
31
32         if (parameters[0][0] == '!')
33         {
34                 // Force send to all +h users
35                 sendtohelpop(user, pcnt, parameters);
36         } else if (parameters[0][0] == '?') {
37                 // Force to the helpop system with no forward if not found.
38                 if (do_helpop(parameters, pcnt, user) == false) {
39                         // Not handled by the Database, Tell the user, and forward.
40                         for (int i = 1; output != ""; i++)
41                         {
42                                 snprintf(a,MAXBUF,"line%d",i);
43                                 output = helpop->ReadValue("nohelp", std::string(a), 0);
44                                 if(output != "") {
45                                         Srv->SendTo(NULL,user,"290 "+std::string(user->nick)+" :"+output);
46                                 }
47                         }
48                 }
49         } else if (strchr(user->modes,'o')) {
50                 // Its an oper whos not using ?, send to all +h
51                 sendtohelpop(user, pcnt, parameters);
52         } else {
53                 // Check with the helpop database, if not found send to +h
54                 if (do_helpop(parameters, pcnt, user) == false) {
55                         // Not handled by the Database, Tell the user, and forward.
56                         for (int i = 1; output != ""; i++)
57                         {
58                                 snprintf(a,MAXBUF,"line%d",i);
59                                 output = helpop->ReadValue("nohelpo", std::string(a), 0);
60                                 if (output != "") {                     
61                                         Srv->SendTo(NULL,user,"290 "+std::string(user->nick)+" :"+output);
62                                 }
63                         }
64                         // Forward.
65                         sendtohelpop(user, pcnt, parameters);
66                 }
67         }
68 }
69
70 bool do_helpop(char **parameters, int pcnt, userrec *src)
71 {
72         char *search;
73         std::string output = " "; // a fix bought to you by brain :p
74         char a[MAXBUF];
75
76         if (!parameters) {
77                 search = "start";
78         }
79         else {
80                 search = parameters[0];
81         }
82
83         if (search[0] == '?') {
84                 search++;
85         }
86
87         int nlines = 0;
88         for (int i = 1; output != ""; i++)
89         {
90                 snprintf(a,MAXBUF,"line%d",i);
91                 output = helpop->ReadValue(search, a, 0);
92                 if (output != "") {
93                         Srv->SendTo(NULL,src,"290 "+std::string(src->nick)+" :"+output);
94                         nlines++;
95                 }
96         }
97         return (nlines>0);
98 }
99
100
101
102 void sendtohelpop(userrec *src, int pcnt, char **params)
103 {
104         char* first = params[0];
105         if (first[0] == '!') { first++; }
106         std::string line = "*** HELPOPS - From "+std::string(src->nick)+": "+std::string(first)+" ";
107         for (int i = 1; i < pcnt; i++)
108         {
109                 line = line + std::string(params[i]) + " ";
110         }
111         Srv->SendToModeMask("oh",WM_AND,line);
112 }
113
114 class ModuleHelpop : public Module
115 {
116  private:
117         ConfigReader *conf;
118         std::string  h_file;
119
120  public:
121         ModuleHelpop()
122         {
123                 Srv  = new Server;
124                 conf = new ConfigReader;
125
126                 h_file = conf->ReadValue("helpop", "file", 0);
127
128                 if (h_file == "") {
129                         printf("m_helpop: Helpop file not Specified.");
130                         exit(0);
131                 }
132
133                 helpop = new ConfigReader(h_file);
134                 if (!helpop->Verify())
135                 {
136                         printf("m_helpop: Invalid Helpop File. Please Ensure it exists and is error free.");
137                         exit(0);
138                 }
139
140                 /*if ((helpop->ReadValue("nohelp",  "line1", 0) == "") || 
141                     (helpop->ReadValue("nohelpo", "line1", 0) == "") ||
142                     (helpop->ReadValue("start",   "line1", 0) == ""))
143                 {
144                         printf("m_helpop: Helpop file is missing important entries. Please check the example conf.");
145                         exit(0);
146                 }*/
147
148                 if (!Srv->AddExtendedMode('h',MT_CLIENT,true,0,0))
149                 {
150                         Srv->Log(DEFAULT,"Unable to claim the +h usermode.");
151                         printf("m_helpop: Unable to claim the +h usermode!");
152                         exit(0);
153                 }
154
155                 // Loads of comments, untill supported properly.
156                 Srv->AddCommand("HELPOP",handle_helpop,0,0);
157
158         }
159
160         virtual int OnExtendedMode(userrec* user, void* target, char modechar, int type, bool mode_on, string_list &params)
161         {
162                 if ((modechar == 'h') && (type == MT_CLIENT))
163                 {
164                         return 1;
165                 }
166                 return 0;
167         }
168
169         virtual void OnWhois(userrec* src, userrec* dst)
170         {
171                 if (strchr(dst->modes,'h'))
172                 {
173                         Srv->SendTo(NULL,src,"310 "+std::string(src->nick)+" "+std::string(dst->nick)+" :is available for help.");
174                 }
175         }
176
177         virtual void OnOper(userrec* user)
178         {
179                 char* modes[2];                 // only two parameters
180                 modes[0] = user->nick;          // first parameter is the nick
181                 modes[1] = "+h";                // second parameter is the mode
182                 Srv->SendMode(modes,2,user);    // send these, forming the command "MODE <nick> +h"
183         }
184         
185         virtual ~ModuleHelpop()
186         {
187                 delete Srv;
188                 delete conf;
189                 delete helpop;
190         }
191         
192         virtual Version GetVersion()
193         {
194                 return Version(0,0,0,1);
195         }
196 };
197
198 class ModuleHelpopFactory : public ModuleFactory
199 {
200  public:
201         ModuleHelpopFactory()
202         {
203         }
204         
205         ~ModuleHelpopFactory()
206         {
207         }
208         
209         virtual Module * CreateModule()
210         {
211                 return new ModuleHelpop;
212         }
213         
214 };
215
216 extern "C" void * init_module( void )
217 {
218         return new ModuleHelpopFactory;
219 }