]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_helpop.cpp
Convert more by-values to const references, optimise ConfigReader a bit
[user/henk/code/inspircd.git] / src / modules / m_helpop.cpp
1 /*   +------------------------------------+
2  *   | Inspire Internet Relay Chat Daemon |
3  *   +------------------------------------+
4  *
5  *  InspIRCd is copyright (C) 2002-2006 ChatSpike-Dev.
6  *   E-mail:
7  *<brain@chatspike.net>
8  *        <Craig@chatspike.net>
9  * 
10  * Written by Craig Edwards, Craig McLure, and others.
11  * This program is free but copyrighted software; see
12  *the file COPYING for details.
13  *
14  * ---------------------------------------------------
15  */
16
17 using namespace std;
18
19 #include "users.h"
20 #include "channels.h"
21 #include "modules.h"
22 #include "helperfuncs.h"
23
24 // Global Vars
25 static ConfigReader *helpop;
26 static Server *Srv;
27
28 void handle_helpop(char**, int, userrec*);
29 bool do_helpop(char**, int, userrec*);
30 void sendtohelpop(userrec*, int, char**);
31
32 /* $ModDesc: /helpop Command, Works like Unreal helpop */
33
34 class cmd_helpop : public command_t
35 {
36  public:
37          cmd_helpop () : command_t("HELPOP",0,0)
38          {
39                  this->source = "m_helpop.so";
40          }
41
42         void Handle (char **parameters, int pcnt, userrec *user)
43         {
44                 char a[MAXBUF];
45                 std::string output = " ";
46
47                 if (!helpop)
48                         return;
49
50                 if (pcnt < 1)
51                 {
52                         do_helpop(NULL,pcnt,user);
53                         return;
54                 }
55
56                 if (parameters[0][0] == '!')
57                 {
58                         // Force send to all +h users
59                         sendtohelpop(user, pcnt, parameters);
60                 }
61                 else if (parameters[0][0] == '?')
62                 {
63                         // Force to the helpop system with no forward if not found.
64                         if (do_helpop(parameters, pcnt, user) == false)
65                         {
66                                 // Not handled by the Database, Tell the user, and bail.
67                                 for (int i = 1; output != ""; i++)
68                                 {
69                                         snprintf(a,MAXBUF,"line%d",i);
70                                         output = helpop->ReadValue("nohelp", std::string(a), 0);
71         
72                                         if(output != "")
73                                         {
74                                                 Srv->SendTo(NULL,user,"290 "+std::string(user->nick)+" :"+output);
75                                         }
76                                 }
77                         }
78                 }
79                 else
80                 {
81                         // Check with the helpop database, if not found send to +h
82                         if (do_helpop(parameters, pcnt, user) == false)
83                         {
84                                 // Not handled by the Database, Tell the user, and forward.
85                                 for (int i = 1; output != ""; i++)
86                                 {
87                                         snprintf(a,MAXBUF,"line%d",i);
88                                         /* "nohelpo" for opers "nohelp" for users */
89                                         output = helpop->ReadValue("nohelpo", std::string(a), 0);
90                                         if (output != "")
91                                         {
92                                                 Srv->SendTo(NULL,user,"290 "+std::string(user->nick)+" :"+output);
93                                         }
94                                 }
95                                 // Forward.
96                                 sendtohelpop(user, pcnt, parameters);
97                         }
98                 }
99         }
100 };
101
102
103 bool do_helpop(char **parameters, int pcnt, userrec *src)
104 {
105         char *search;
106         std::string output = " "; // a fix bought to you by brain :p
107         char a[MAXBUF];
108         char lower[MAXBUF];
109         int nlines = 0;
110
111         if (!parameters)
112         {
113                 search = "start";
114         }
115         else
116         {
117                 search = parameters[0];
118         }
119
120         if (search[0] == '?')
121         {
122                 search++;
123         }
124
125         strlower(search);
126
127         for (int i = 1; output != ""; i++)
128         {
129                 snprintf(a,MAXBUF,"line%d",i);
130                 output = helpop->ReadValue(search, a, 0);
131                 if (output != "")
132                 {
133                         Srv->SendTo(NULL,src,"290 "+std::string(src->nick)+" :"+output);
134                         nlines++;
135                 }
136         }
137         return (nlines>0);
138 }
139
140
141
142 void sendtohelpop(userrec *src, int pcnt, char **params)
143 {
144         char* first = params[0];
145         if (*first == '!')
146         {
147                 first++;
148         }
149
150         std::string line = "*** HELPOPS - From "+std::string(src->nick)+": "+std::string(first)+" ";
151         for (int i = 1; i < pcnt; i++)
152         {
153                 line = line + std::string(params[i]) + " ";
154         }
155         Srv->SendToModeMask("oh",WM_AND,line);
156 }
157
158 class HelpopException : public ModuleException
159 {
160  private:
161         std::string err;
162  public:
163         HelpopException(std::string message) : err(message) { }
164         virtual char* GetReason() { return (char*)err.c_str(); }
165 };
166
167 class ModuleHelpop : public Module
168 {
169         private:
170                 ConfigReader *conf;
171                 std::string  h_file;
172                 cmd_helpop* mycommand;
173
174         public:
175                 ModuleHelpop(Server* Me)
176                         : Module::Module(Me)
177                 {
178                         Srv  = Me;
179
180                         ReadConfig();
181                         if (!Srv->AddExtendedMode('h',MT_CLIENT,true,0,0))
182                         {
183                                 Srv->Log(DEFAULT,"Unable to claim the +h usermode.");
184                                 return;
185                         }
186
187                         mycommand = new cmd_helpop();
188                         Srv->AddCommand(mycommand);
189                 }
190
191                 virtual void ReadConfig()
192                 {
193                         conf = new ConfigReader;
194                         h_file = conf->ReadValue("helpop", "file", 0);
195
196                         if (h_file == "")
197                         {
198                                 helpop = NULL;
199                                 HelpopException e("Missing helpop file");
200                                 throw(e);
201                         }
202
203                         helpop = new ConfigReader(h_file);
204                         if ((helpop->ReadValue("nohelp",  "line1", 0) == "") ||
205                                 (helpop->ReadValue("nohelpo", "line1", 0) == "") ||
206                                 (helpop->ReadValue("start",   "line1", 0) == ""))
207                         {
208                                 HelpopException e("m_helpop: Helpop file is missing important entries. Please check the example conf.");
209                                 throw(e);
210                         }
211                 }
212
213                 void Implements(char* List)
214                 {
215                         List[I_OnRehash] = List[I_OnExtendedMode] = List[I_OnWhois] = 1;
216                 }
217
218                 virtual void OnRehash(std::string parameter)
219                 {
220                         delete conf;
221                         if (helpop)
222                                 delete helpop;
223
224                         ReadConfig();
225                 }
226
227                 virtual int OnExtendedMode(userrec* user, void* target, char modechar, int type, bool mode_on, string_list &params)
228                 {
229                         if ((modechar == 'h') && (type == MT_CLIENT))
230                         {
231                                 return 1;
232                         }
233                         return 0;
234                 }
235
236                 virtual void OnWhois(userrec* src, userrec* dst)
237                 {
238                         if (strchr(dst->modes,'h'))
239                         {
240                                 Srv->SendTo(NULL,src,"310 "+std::string(src->nick)+" "+std::string(dst->nick)+" :is available for help.");
241                         }
242                 }
243
244                 virtual ~ModuleHelpop()
245                 {
246                         delete conf;
247                         delete helpop;
248                 }
249         
250                 virtual Version GetVersion()
251                 {
252                         return Version(1,0,0,1,VF_STATIC|VF_VENDOR);
253                 }
254 };
255
256 class ModuleHelpopFactory : public ModuleFactory
257 {
258  public:
259         ModuleHelpopFactory()
260         {
261         }
262         
263         ~ModuleHelpopFactory()
264         {
265         }
266         
267         virtual Module * CreateModule(Server* Me)
268         {
269                 return new ModuleHelpop(Me);
270         }
271         
272 };
273
274 extern "C" void * init_module( void )
275 {
276         return new ModuleHelpopFactory;
277 }