]> jfr.im git - irc/quakenet/newserv.git/blame - helpmod/helpmod.c
allow forcing of settime commands (for devs only)
[irc/quakenet/newserv.git] / helpmod / helpmod.c
CommitLineData
c86edd1d
Q
1#include <stdio.h>
2#include <string.h>
3#include <stdarg.h>
4#include <ctype.h>
5
6#include "helpmod_entries.h"
7#include "helpmod_user.h"
8#include "helpmod_alias.h"
9
10#include "../localuser/localuser.h"
11#include "../localuser/localuserchannel.h"
12#include "../control/control.h"
13#include "../channel/channel.h"
14#include "../nick/nick.h"
15#include "../core/config.h"
16#include "../core/schedule.h"
17
18#define HELPMOD_VERSION "1.05"
19
20helpmod_entry helpmod_base;
21helpmod_user helpmod_users;
22alias_tree aliases;
23nick *helpmodnick;
24char helpmod_db[128] = "helpmod/default";
25long helpmod_usage;
26
27void helpreply(nick *target, char *message, ... ) {
28 char buf[512];
29 va_list va;
30
31 if (helpmodnick==NULL) {
32 return;
33 }
34
35 va_start(va,message);
36 vsnprintf(buf,512,message,va);
37 va_end(va);
38
39 sendmessagetouser(helpmodnick,target,"%s",buf);
40}
41
42void helpmod_send_help(nick* target, helpmod_user hlp_user)
43{
44 int i;
45 helpmod_usage++;
46 for (i=0;i<hlp_user->state->text_lines;i++)
47 helpreply(target, "%s", hlp_user->state->text[i]->content);
48 for (i=0;i<hlp_user->state->option_count;i++)
49 helpreply(target, "%d) %s", i+1, hlp_user->state->options[i]->description->content);
50 if (!hlp_user->state->option_count)
51 {
52 helpreply(target, "This concludes the help for this topic, if you want to, you can restart the service with the 'help' command, or return to the previous entry by selecting 0");
53 }
54}
55
56void helpmod_cmd_help (nick* sender, char* arg)
57{
58 helpmod_user hlp_user = helpmod_get_user(sender->numeric);
59 int hlp_target;
60 int i;
61
62 if (!helpmod_base)
63 {
64 helpreply(sender, "The help service is not available at this time, please try again later");
65 return;
66 }
67
68 if (!arg)
69 {
70 hlp_user->state = helpmod_base;
71 helpmod_send_help(sender, hlp_user);
72 return;
73 }
74 else
75 if (!sscanf(arg, "%d", &hlp_target))
76 {
77 helpmod_entry tmp;
78 for(i=0;i<strlen(arg);i++)
79 if (isspace(arg[i]))
80 {
81 arg[i] = 0x00;
82 break;
83 }
84 tmp = helpmod_get_alias(arg);
85 if (!tmp)
86 helpreply(sender, "Invalid value. Either use 'help' to restart or give an integer as a valid selection");
87 else
88 {
89 hlp_user->state = tmp;
90 helpmod_send_help(sender, hlp_user);
91 }
92 return;
93 }
94
95 hlp_target--;
96 if (!helpmod_valid_selection(hlp_user->state, hlp_target))
97 {
98 if (!hlp_user->state->option_count)
99 helpreply(sender, "There are no more options to choose from, you can restart the service by giving the 'help' command or select 0 to return to previous entry");
100 else if (!hlp_user->state->parent)
101 helpreply(sender, "Bad selection, please enter your selection as an integer from %d to %d", 1, hlp_user->state->option_count);
102 else
103 helpreply(sender, "Bad selection, please enter your selection as an integer from %d to %d, selecting 0 will take you to the previous entry", 1, hlp_user->state->option_count);
104 return;
105 }
106
107 hlp_user->state = helpmod_make_selection(hlp_user->state, hlp_target);
108 helpmod_send_help(sender, hlp_user);
109
110 return;
111}
112
113void helpmod_cmd_stats (nick *sender)
114{
115 helpreply(sender, "Amount of users: %9ld", helpmod_user_count());
116 helpreply(sender, " entries: %9ld", helpmod_entry_count(helpmod_base));
117 helpreply(sender, " aliases: %9ld", helpmod_alias_count(aliases));
118 helpreply(sender, " service use: %9ld", helpmod_usage);
119 helpreply(sender, "Using database: %s", helpmod_db);
120 return;
121}
122
123void helpmod_cmd_load (void *sender, char* arg)
124{
125 FILE *tmp_file;
126 char buf[128] = "helpmod/default";
127
128 if (!arg)
129 helpreply(sender, "Warning: No config specified, using default");
130 else
131 {
132 if (strlen(arg) >= 100)
133 return;
134 else
135 sprintf(buf, "helpmod/%s", arg);
136 }
137
138 if (!(tmp_file = fopen(buf, "rt")))
139 {
140 helpreply(sender, "File %s not found", buf);
141 return;
142 }
143 else
144 fclose(tmp_file);
145
146 helpmod_clear_aliases(&aliases);
147 helpmod_clear_all_entries();
148 helpmod_init_entry(&helpmod_base);
149 helpmod_clear_users();
150 helpmod_load_entries(buf);
151 strcpy(helpmod_db, buf);
152 helpreply(sender, "New config loaded and system reset");
153}
154
155void helpmod_cmd_showcommands (nick *sender)
156{
157 helpreply(sender,"HelpMod %s Commands", HELPMOD_VERSION);
158 helpreply(sender,"help Primary command, gives automated help to lusers");
159 helpreply(sender,"stats Shows some service statistics");
160 helpreply(sender,"aliases Gives a simple list of aliases currently in use");
161 helpreply(sender,"load Loads a new help config");
162 return;
163}
164
165void helpmod_cmd_aliases (nick *sender)
166{
167 char buf[512];
168 int i = 0;
169 void helpmod_list_aliases(alias_tree node)
170 {
171 if (i > 256)
172 {
173 helpreply(sender, buf);
174 i = 0;
175 }
176 if (!node)
177 return;
178 sprintf(buf+i,"%.200s ",node->name->content);
179 i+=(1+strlen(node->name->content));
180 helpmod_list_aliases(node->left);
181 helpmod_list_aliases(node->right);
182 }
183 helpmod_list_aliases(aliases);
184 if (i)
185 helpreply(sender, buf);
186}
187
188void helpmodmessagehandler(nick *sender, int messagetype, void **args)
189{
190 char* first_arg;
191 char* second_arg = NULL;
192 nick *target;
193 int i, useless_var;
194
195 if (messagetype != LU_PRIVMSG)
196 return;
197
198 target = getnickbynick((char*)args[0]);
199 first_arg = args[1];
200
201 for (i=0;i<strlen(args[1]);i++)
202 if (((char*)args[1])[i] == ' ')
203 {
204 second_arg = args[1] + i + 1;
205 ((char*)args[1])[i] = 0x00;
206 break;
207 }
208 if (!strcmp(first_arg, "help"))
209 {
210 helpmod_cmd_help(target, second_arg);
211 return;
212 }
213 if (sscanf(first_arg, "%d", &useless_var))
214 {
215 helpmod_cmd_help(target, first_arg);
216 return;
217 }
218 if (!IsOper(target))
219 {
220 helpreply(target, "To access the help service, just type 'help'");
221 return;
222 }
223 if (!strcmp(first_arg, "stats"))
224 helpmod_cmd_stats(target);
225 else if (!strcmp(first_arg, "load"))
226 helpmod_cmd_load(target, second_arg);
227 else if (!strcmp(first_arg,"aliases"))
228 helpmod_cmd_aliases(target);
229 else if (!strcmp(first_arg, "showcommands"))
230 helpmod_cmd_showcommands(target);
231 else if (!strcmp(first_arg, "help"))
232 helpmod_cmd_help(target, first_arg);
233 else
234 helpreply(target, "Unknown command, see 'showcommands'");
235}
236
237void helpconnect(void) {
238 channel *cp;
239 /* helpmod offers no channel features, it's merely a decoration */
240 char *helpmod_chans[] = {"#twilightzone", "#help", "#feds", "#qnet.help"};
241 int i,helpmod_chan_count = 4;
242
243 helpmodnick=registerlocaluser("H",
244 "help",
245 "quakenet.org",
246 "NewServ HelpMod, /msg H help",
247 "H",
248 UMODE_DEAF|UMODE_OPER|UMODE_ACCOUNT,&helpmodmessagehandler);
249
250 helpmod_init_entry(&helpmod_base);
251 helpmod_init_users();
252 helpmod_load_entries(NULL);
253 /* join channels */
254 for (i=0;i < helpmod_chan_count;i++)
255 {
256 cp = findchannel(helpmod_chans[i]);
257 if (!cp)
258 localcreatechannel(helpmodnick, helpmod_chans[i]);
259 else
260 {
261 localjoinchannel(helpmodnick, cp);
262 localgetops(helpmodnick, cp);
263 }
264 }
265}
266
267
268void _init()
269{
270 helpmod_usage = 0;
271 helpmod_base = NULL;
272 aliases = NULL;
273 scheduleoneshot(time(NULL)+1,(ScheduleCallback)&helpconnect,NULL);
274 schedulerecurring(time(NULL)+1,0,300,(ScheduleCallback)&helpmod_clear_inactives,NULL);
275}
276
277void _fini()
278{
279 deregisterlocaluser(helpmodnick, "Module unloaded");
280 deleteallschedules((ScheduleCallback)&helpconnect);
281 helpmod_clear_aliases(&aliases);
282 helpmod_clear_all_entries();
283 helpmod_clear_users();
284}