]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_helpop.cpp
966f645d390e570d3a339789fa5f09b6e11936b5
[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,1)
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         int nlines = 0;
109
110         if (!pcnt)
111         {
112                 search = "start";
113         }
114         else
115         {
116                 search = parameters[0];
117         }
118
119         if (search[0] == '?')
120         {
121                 search++;
122         }
123
124         strlower(search);
125
126         for (int i = 1; output != ""; i++)
127         {
128                 snprintf(a,MAXBUF,"line%d",i);
129                 output = helpop->ReadValue(search, a, 0);
130                 if (output != "")
131                 {
132                         Srv->SendTo(NULL,src,"290 "+std::string(src->nick)+" :"+output);
133                         nlines++;
134                 }
135         }
136         return (nlines>0);
137 }
138
139
140
141 void sendtohelpop(userrec *src, int pcnt, char **params)
142 {
143         char* first = params[0];
144         if (*first == '!')
145         {
146                 first++;
147         }
148
149         std::string line = "*** HELPOPS - From "+std::string(src->nick)+": "+std::string(first)+" ";
150         for (int i = 1; i < pcnt; i++)
151         {
152                 line = line + std::string(params[i]) + " ";
153         }
154         Srv->SendToModeMask("oh",WM_AND,line);
155 }
156
157 class HelpopException : public ModuleException
158 {
159  private:
160         std::string err;
161  public:
162         HelpopException(std::string message) : err(message) { }
163         virtual const char* GetReason() { return err.c_str(); }
164 };
165
166 class ModuleHelpop : public Module
167 {
168         private:
169                 ConfigReader *conf;
170                 std::string  h_file;
171                 cmd_helpop* mycommand;
172
173         public:
174                 ModuleHelpop(Server* Me)
175                         : Module::Module(Me)
176                 {
177                         Srv  = Me;
178
179                         ReadConfig();
180                         if (!Srv->AddExtendedMode('h',MT_CLIENT,true,0,0))
181                         {
182                                 Srv->Log(DEFAULT,"Unable to claim the +h usermode.");
183                                 return;
184                         }
185
186                         mycommand = new cmd_helpop();
187                         Srv->AddCommand(mycommand);
188                 }
189
190                 virtual void ReadConfig()
191                 {
192                         conf = new ConfigReader;
193                         h_file = conf->ReadValue("helpop", "file", 0);
194
195                         if (h_file == "")
196                         {
197                                 helpop = NULL;
198                                 HelpopException e("Missing helpop file");
199                                 throw(e);
200                         }
201
202                         helpop = new ConfigReader(h_file);
203                         if ((helpop->ReadValue("nohelp",  "line1", 0) == "") ||
204                                 (helpop->ReadValue("nohelpo", "line1", 0) == "") ||
205                                 (helpop->ReadValue("start",   "line1", 0) == ""))
206                         {
207                                 HelpopException e("m_helpop: Helpop file is missing important entries. Please check the example conf.");
208                                 throw(e);
209                         }
210                 }
211
212                 void Implements(char* List)
213                 {
214                         List[I_OnRehash] = List[I_OnExtendedMode] = List[I_OnWhois] = 1;
215                 }
216
217                 virtual void OnRehash(const std::string &parameter)
218                 {
219                         delete conf;
220                         if (helpop)
221                                 delete helpop;
222
223                         ReadConfig();
224                 }
225
226                 virtual int OnExtendedMode(userrec* user, void* target, char modechar, int type, bool mode_on, string_list &params)
227                 {
228                         if ((modechar == 'h') && (type == MT_CLIENT))
229                         {
230                                 return 1;
231                         }
232                         return 0;
233                 }
234
235                 virtual void OnWhois(userrec* src, userrec* dst)
236                 {
237                         if (strchr(dst->modes,'h'))
238                         {
239                                 Srv->SendTo(NULL,src,"310 "+std::string(src->nick)+" "+std::string(dst->nick)+" :is available for help.");
240                         }
241                 }
242
243                 virtual ~ModuleHelpop()
244                 {
245                         delete conf;
246                         delete helpop;
247                 }
248         
249                 virtual Version GetVersion()
250                 {
251                         return Version(1,0,0,1,VF_STATIC|VF_VENDOR);
252                 }
253 };
254
255 class ModuleHelpopFactory : public ModuleFactory
256 {
257  public:
258         ModuleHelpopFactory()
259         {
260         }
261         
262         ~ModuleHelpopFactory()
263         {
264         }
265         
266         virtual Module * CreateModule(Server* Me)
267         {
268                 return new ModuleHelpop(Me);
269         }
270         
271 };
272
273 extern "C" void * init_module( void )
274 {
275         return new ModuleHelpopFactory;
276 }