]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * This contains Q9's "built in" commands and CTCP handlers | |
3 | */ | |
4 | ||
5 | #include "chanserv.h" | |
6 | #include "../core/schedule.h" | |
7 | #include "../lib/irc_string.h" | |
8 | #include "../dbapi/dbapi.h" | |
9 | ||
10 | #include <string.h> | |
11 | #include <stdio.h> | |
12 | ||
13 | int cs_dorehash(void *source, int cargc, char **cargv) { | |
14 | nick *sender=source; | |
15 | Command *cmdlist[200]; | |
16 | int i,n; | |
17 | ||
18 | /* Reload the response text first */ | |
19 | loadmessages(); | |
20 | ||
21 | /* Now the commands */ | |
22 | n=getcommandlist(cscommands, cmdlist, 200); | |
23 | ||
24 | for(i=0;i<n;i++) | |
25 | loadcommandsummary(cmdlist[i]); | |
26 | ||
27 | chanservstdmessage(sender, QM_DONE); | |
28 | ||
29 | return CMD_OK; | |
30 | } | |
31 | ||
32 | int cs_doquit(void *source, int cargc, char **cargv) { | |
33 | char *reason="Leaving"; | |
34 | nick *sender=(nick *)source; | |
35 | ||
36 | if (cargc>0) { | |
37 | reason=cargv[0]; | |
38 | } | |
39 | ||
40 | chanservstdmessage(sender, QM_DONE); | |
41 | ||
42 | deregisterlocaluser(chanservnick, reason); | |
43 | scheduleoneshot(time(NULL)+1,&chanservreguser,NULL); | |
44 | ||
45 | return CMD_OK; | |
46 | } | |
47 | ||
48 | int cs_dosetquitreason(void *source, int cargc, char **cargv) { | |
49 | nick *sender=(nick *)source; | |
50 | ||
51 | if (cargc<0) { | |
52 | chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "setquitreason"); | |
53 | return CMD_ERROR; | |
54 | } | |
55 | ||
56 | if (cs_quitreason) | |
57 | freesstring(cs_quitreason); | |
58 | ||
59 | cs_quitreason=getsstring(cargv[0], 250); | |
60 | ||
61 | chanservstdmessage(sender, QM_DONE); | |
62 | ||
63 | return CMD_OK; | |
64 | } | |
65 | ||
66 | int cs_dorename(void *source, int cargc, char **cargv) { | |
67 | char newnick[NICKLEN+1]; | |
68 | nick *sender=source; | |
69 | ||
70 | if (cargc<1) { | |
71 | chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "rename"); | |
72 | return CMD_ERROR; | |
73 | } | |
74 | ||
75 | strncpy(newnick,cargv[0],NICKLEN); | |
76 | newnick[NICKLEN]='\0'; | |
77 | ||
78 | renamelocaluser(chanservnick, newnick); | |
79 | chanservstdmessage(sender, QM_DONE); | |
80 | ||
81 | return CMD_OK; | |
82 | } | |
83 | ||
84 | int cs_doshowcommands(void *source, int cargc, char **cargv) { | |
85 | nick *sender=source; | |
86 | reguser *rup; | |
87 | Command *cmdlist[200]; | |
88 | int i,n; | |
89 | int lang; | |
90 | char *message; | |
91 | cmdsummary *summary; | |
92 | char cmdbuf[50]; | |
93 | char *ct; | |
94 | unsigned int dumpcount=0; | |
95 | ||
96 | n=getcommandlist(cscommands, cmdlist, 200); | |
97 | rup=getreguserfromnick(sender); | |
98 | ||
99 | if (!rup) | |
100 | lang=0; | |
101 | else | |
102 | lang=rup->languageid; | |
103 | ||
104 | chanservstdmessage(sender, QM_COMMANDLIST); | |
105 | ||
106 | if (cargc>0 && rup && UIsDev(rup) && !ircd_strcmp(cargv[0], "-v")) { | |
107 | dumpcount=1; | |
108 | } | |
109 | ||
110 | for (i=0;i<n;i++) { | |
111 | /* Generate the appropriate strings for the command name (including | |
112 | * prefixes for privileged users) and the summary text. | |
113 | * | |
114 | * We do this before we're sure we will print the command to make things | |
115 | * easier when we are doing -v */ | |
116 | summary=(cmdsummary *)cmdlist[i]->ext; | |
117 | ||
118 | if (rup && UHasStaffPriv(rup)) { | |
119 | if (cmdlist[i]->level & QCMD_DEV) { | |
120 | sprintf(cmdbuf,"+d %s",cmdlist[i]->command->content); | |
121 | } else if(cmdlist[i]->level & QCMD_ADMIN) { | |
122 | sprintf(cmdbuf,"+a %s",cmdlist[i]->command->content); | |
123 | } else if(cmdlist[i]->level & QCMD_OPER) { | |
124 | sprintf(cmdbuf,"+o %s",cmdlist[i]->command->content); | |
125 | } else if(cmdlist[i]->level & QCMD_HELPER) { | |
126 | sprintf(cmdbuf,"+h %s",cmdlist[i]->command->content); | |
127 | } else if(cmdlist[i]->level & QCMD_STAFF) { | |
128 | sprintf(cmdbuf,"+q %s",cmdlist[i]->command->content); | |
129 | } else { | |
130 | sprintf(cmdbuf," %s",cmdlist[i]->command->content); | |
131 | } | |
132 | ct=cmdbuf; | |
133 | } else { | |
134 | ct=cmdlist[i]->command->content; | |
135 | } | |
136 | ||
137 | if (summary->bylang[lang]) { | |
138 | message=summary->bylang[lang]->content; | |
139 | } else if (summary->bylang[0]) { | |
140 | message=summary->bylang[0]->content; | |
141 | } else { | |
142 | message=summary->def->content; | |
143 | } | |
144 | ||
145 | if (dumpcount) { | |
146 | chanservsendmessage(sender,"%-20s %u", cmdbuf, cmdlist[i]->calls); | |
147 | continue; | |
148 | } | |
149 | ||
150 | if (cargc>0 && !match2strings(cargv[0],cmdlist[i]->command->content)) | |
151 | continue; | |
152 | ||
153 | /* Don't list aliases */ | |
154 | if (cmdlist[i]->level & QCMD_ALIAS) | |
155 | continue; | |
156 | ||
157 | /* Check that this user can use this command.. */ | |
158 | if ((cmdlist[i]->level & QCMD_AUTHED) && !rup) | |
159 | continue; | |
160 | ||
161 | if ((cmdlist[i]->level & QCMD_NOTAUTHED) && rup) | |
162 | continue; | |
163 | ||
164 | if ((cmdlist[i]->level & QCMD_STAFF) && | |
165 | (!rup || !UHasStaffPriv(rup))) | |
166 | continue; | |
167 | ||
168 | if ((cmdlist[i]->level & QCMD_HELPER) && | |
169 | (!rup || !UHasHelperPriv(rup))) | |
170 | continue; | |
171 | ||
172 | if ((cmdlist[i]->level & QCMD_OPER) && | |
173 | (!rup || !UHasOperPriv(rup) || !IsOper(sender))) | |
174 | continue; | |
175 | ||
176 | if ((cmdlist[i]->level & QCMD_ADMIN) && | |
177 | (!rup || !UHasAdminPriv(rup) || !IsOper(sender))) | |
178 | continue; | |
179 | ||
180 | if ((cmdlist[i]->level & QCMD_DEV) && | |
181 | (!rup || !UIsDev(rup) || !IsOper(sender))) | |
182 | continue; | |
183 | ||
184 | /* Commands flagged QCMD_ACHIEVEMENTS: | |
185 | * Always invalid before 01/04/2010. | |
186 | * Valid after 02/04/2010 only if you have the flag set */ | |
187 | if (cmdlist[i]->level & QCMD_ACHIEVEMENTS) { | |
188 | if (time(NULL) < ACHIEVEMENTS_START) | |
189 | continue; | |
190 | ||
191 | if ((time(NULL) > ACHIEVEMENTS_END) && | |
192 | !UIsAchievements(rup)) | |
193 | continue; | |
194 | } | |
195 | ||
196 | /* Commands flagged QCMD_TITLES: | |
197 | * Only valid on 01/04/2010. */ | |
198 | if ((cmdlist[i]->level & QCMD_TITLES) && | |
199 | ((time(NULL) < ACHIEVEMENTS_START) || | |
200 | (time(NULL) > ACHIEVEMENTS_END))) | |
201 | continue; | |
202 | ||
203 | /* We passed all the checks, send the message */ | |
204 | chanservsendmessage(sender, "%-20s %s",ct, message); | |
205 | } | |
206 | ||
207 | chanservstdmessage(sender, QM_ENDOFLIST); | |
208 | ||
209 | return CMD_OK; | |
210 | } | |
211 | ||
212 | int cs_sendhelp(nick *sender, char *thecmd, int oneline) { | |
213 | Command *cmd; | |
214 | cmdsummary *sum; | |
215 | reguser *rup; | |
216 | ||
217 | if (!(cmd=findcommandintree(cscommands, thecmd, 1))) { | |
218 | chanservstdmessage(sender, QM_UNKNOWNCMD, thecmd); | |
219 | return CMD_ERROR; | |
220 | } | |
221 | ||
222 | /* Disable database help for now - splidge | |
223 | csdb_dohelp(sender, cmd); */ | |
224 | ||
225 | rup=getreguserfromnick(sender); | |
226 | ||
227 | /* Don't showhelp for privileged users to others.. */ | |
228 | if (((cmd->level & QCMD_STAFF) && (!rup || !UHasStaffPriv(rup))) || | |
229 | ((cmd->level & QCMD_HELPER) && (!rup || !UHasHelperPriv(rup))) || | |
230 | ((cmd->level & QCMD_OPER) && (!rup || !UHasOperPriv(rup))) || | |
231 | ((cmd->level & QCMD_ADMIN) && (!rup || !UHasAdminPriv(rup))) || | |
232 | ((cmd->level & QCMD_DEV) && (!rup || !UIsDev(rup))) || | |
233 | ((cmd->level & (QCMD_TITLES | QCMD_ACHIEVEMENTS)) && (time(NULL) < ACHIEVEMENTS_START))) { | |
234 | chanservstdmessage(sender, QM_UNKNOWNCMD, thecmd); | |
235 | return CMD_OK; | |
236 | } | |
237 | ||
238 | sum=cmd->ext; | |
239 | ||
240 | if (sum->defhelp && *(sum->defhelp)) { | |
241 | if (oneline) { | |
242 | chanservsendmessageoneline(sender, "%s", sum->defhelp); | |
243 | } else { | |
244 | chanservsendmessage(sender, "%s", sum->defhelp); | |
245 | } | |
246 | } else { | |
247 | if (!oneline) | |
248 | chanservstdmessage(sender, QM_NOHELP, cmd->command->content); | |
249 | } | |
250 | ||
251 | return CMD_OK; | |
252 | } | |
253 | ||
254 | ||
255 | int cs_dohelp(void *source, int cargc, char **cargv) { | |
256 | nick *sender=source; | |
257 | ||
258 | if (cargc==0) | |
259 | return cs_doshowcommands(source,cargc,cargv); | |
260 | ||
261 | return cs_sendhelp(sender, cargv[0], 0); | |
262 | } | |
263 | ||
264 | ||
265 | int cs_doctcpping(void *source, int cargc, char **cargv) { | |
266 | char *nullbuf="\001"; | |
267 | ||
268 | sendnoticetouser(chanservnick, source, "%cPING %s", | |
269 | 1, cargc?cargv[0]:nullbuf); | |
270 | ||
271 | return CMD_OK; | |
272 | } | |
273 | ||
274 | int cs_doctcpversion(void *source, int cargc, char **cargv) { | |
275 | sendnoticetouser(chanservnick, source, "\01VERSION Q9 version %s (Compiled on " __DATE__ ") (C) 2002-8 David Mansell (splidge) and others.\01", QVERSION); | |
276 | sendnoticetouser(chanservnick, source, "\01VERSION Built on newserv. (C) 2002-8 David Mansell (splidge) and others.\01"); | |
277 | ||
278 | return CMD_OK; | |
279 | } | |
280 | ||
281 | int cs_doversion(void *source, int cargc, char **cargv) { | |
282 | chanservsendmessage((nick *)source, "Q9 version %s (Compiled on " __DATE__ ") (C) 2002-8 David Mansell (splidge) and others.", QVERSION); | |
283 | chanservsendmessage((nick *)source, "Built on newserv. (C) 2002-8 David Mansell (splidge) and others."); | |
284 | return CMD_OK; | |
285 | } | |
286 | ||
287 | int cs_doctcpgender(void *source, int cargc, char **cargv) { | |
288 | sendnoticetouser(chanservnick, source, "\1GENDER Anyone who has a bitch mode has to be female ;)\1"); | |
289 | ||
290 | return CMD_OK; | |
291 | } | |
292 | ||
293 | void csdb_dohelp_real(DBConn *, void *); | |
294 | ||
295 | struct helpinfo { | |
296 | unsigned int numeric; | |
297 | sstring *commandname; | |
298 | Command *cmd; | |
299 | }; | |
300 | ||
301 | /* Help stuff */ | |
302 | void csdb_dohelp(nick *np, Command *cmd) { | |
303 | struct helpinfo *hip; | |
304 | ||
305 | hip=(struct helpinfo *)malloc(sizeof(struct helpinfo)); | |
306 | ||
307 | hip->numeric=np->numeric; | |
308 | hip->commandname=getsstring(cmd->command->content, cmd->command->length); | |
309 | hip->cmd=cmd; | |
310 | ||
311 | q9asyncquery(csdb_dohelp_real, (void *)hip, | |
312 | "SELECT languageID, fullinfo from chanserv.help where lower(command)=lower('%s')",cmd->command->content); | |
313 | } | |
314 | ||
315 | void csdb_dohelp_real(DBConn *dbconn, void *arg) { | |
316 | struct helpinfo *hip=arg; | |
317 | nick *np=getnickbynumeric(hip->numeric); | |
318 | reguser *rup; | |
319 | char *result; | |
320 | DBResult *pgres; | |
321 | int j,lang=0; | |
322 | ||
323 | if(!dbconn) { | |
324 | freesstring(hip->commandname); | |
325 | free(hip); | |
326 | return; | |
327 | } | |
328 | ||
329 | pgres=dbgetresult(dbconn); | |
330 | ||
331 | if (!dbquerysuccessful(pgres)) { | |
332 | Error("chanserv",ERR_ERROR,"Error loading help text."); | |
333 | freesstring(hip->commandname); | |
334 | free(hip); | |
335 | return; | |
336 | } | |
337 | ||
338 | if (dbnumfields(pgres)!=2) { | |
339 | Error("chanserv",ERR_ERROR,"Help text format error."); | |
340 | dbclear(pgres); | |
341 | freesstring(hip->commandname); | |
342 | free(hip); | |
343 | return; | |
344 | } | |
345 | ||
346 | if (!np) { | |
347 | dbclear(pgres); | |
348 | freesstring(hip->commandname); | |
349 | free(hip); | |
350 | return; | |
351 | } | |
352 | ||
353 | if ((rup=getreguserfromnick(np))) | |
354 | lang=rup->languageid; | |
355 | ||
356 | result=NULL; | |
357 | ||
358 | while(dbfetchrow(pgres)) { | |
359 | j=strtoul(dbgetvalue(pgres,0),NULL,10); | |
360 | if ((j==0 && result==NULL) || (j==lang)) { | |
361 | result=dbgetvalue(pgres,1); | |
362 | if(strlen(result)==0) | |
363 | result=NULL; | |
364 | } | |
365 | } | |
366 | ||
367 | if (result) { | |
368 | chanservsendmessage(np, "%s", result); | |
369 | } else { | |
370 | cmdsummary *sum=hip->cmd->ext; | |
371 | if (sum->defhelp && *(sum->defhelp)) { | |
372 | chanservsendmessage(np, "%s", sum->defhelp); | |
373 | } else { | |
374 | chanservstdmessage(np, QM_NOHELP, hip->commandname->content); | |
375 | } | |
376 | } | |
377 | ||
378 | freesstring(hip->commandname); | |
379 | free(hip); | |
380 | dbclear(pgres); | |
381 | } |