]> jfr.im git - irc/quakenet/newserv.git/blame - chanserv/chanservstdcmds.c
Bumped version to 1.00-RC3 and disabled some commands.
[irc/quakenet/newserv.git] / chanserv / chanservstdcmds.c
CommitLineData
c86edd1d
Q
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"
ee8cd7d0 8#include "../dbapi/dbapi.h"
c86edd1d
Q
9
10#include <string.h>
ee8cd7d0 11#include <stdio.h>
c86edd1d
Q
12
13int 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
32int 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
48int cs_dorename(void *source, int cargc, char **cargv) {
49 char newnick[NICKLEN+1];
50 nick *sender=source;
51
52 if (cargc<1) {
53 chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "rename");
54 return CMD_ERROR;
55 }
56
57 strncpy(newnick,cargv[0],NICKLEN);
58 newnick[NICKLEN]='\0';
59
60 renamelocaluser(chanservnick, newnick);
61 chanservstdmessage(sender, QM_DONE);
62
63 return CMD_OK;
64}
65
66int cs_doshowcommands(void *source, int cargc, char **cargv) {
67 nick *sender=source;
68 reguser *rup;
69 Command *cmdlist[200];
70 int i,n;
71 int lang;
72 char *message;
73 cmdsummary *summary;
50ec21f3 74 char cmdbuf[50];
75 char *ct;
c86edd1d
Q
76
77 n=getcommandlist(cscommands, cmdlist, 200);
78 rup=getreguserfromnick(sender);
79
80 if (!rup)
81 lang=0;
82 else
83 lang=rup->languageid;
84
85 chanservstdmessage(sender, QM_COMMANDLIST);
86
87 for (i=0;i<n;i++) {
43583524 88
c86edd1d
Q
89 if (cargc>0 && !match2strings(cargv[0],cmdlist[i]->command->content))
90 continue;
91
92 /* Don't list aliases */
93 if (cmdlist[i]->level & QCMD_ALIAS)
94 continue;
95
96 /* Check that this user can use this command.. */
97 if ((cmdlist[i]->level & QCMD_AUTHED) && !rup)
98 continue;
99
100 if ((cmdlist[i]->level & QCMD_NOTAUTHED) && rup)
101 continue;
102
103 if ((cmdlist[i]->level & QCMD_HELPER) &&
104 (!rup || !UHasHelperPriv(rup)))
105 continue;
106
107 if ((cmdlist[i]->level & QCMD_OPER) &&
108 (!rup || !UHasOperPriv(rup) || !IsOper(sender)))
109 continue;
110
111 if ((cmdlist[i]->level & QCMD_ADMIN) &&
112 (!rup || !UHasAdminPriv(rup) || !IsOper(sender)))
113 continue;
114
115 if ((cmdlist[i]->level & QCMD_DEV) &&
116 (!rup || !UIsDev(rup) || !IsOper(sender)))
117 continue;
118
119 summary=(cmdsummary *)cmdlist[i]->ext;
120
50ec21f3 121 if (rup && UHasHelperPriv(rup)) {
122 if (cmdlist[i]->level & QCMD_DEV) {
123 sprintf(cmdbuf,"+d %s",cmdlist[i]->command->content);
124 } else if(cmdlist[i]->level & QCMD_ADMIN) {
125 sprintf(cmdbuf,"+a %s",cmdlist[i]->command->content);
126 } else if(cmdlist[i]->level & QCMD_OPER) {
127 sprintf(cmdbuf,"+o %s",cmdlist[i]->command->content);
128 } else if(cmdlist[i]->level & QCMD_HELPER) {
129 sprintf(cmdbuf,"+h %s",cmdlist[i]->command->content);
130 } else {
131 sprintf(cmdbuf," %s",cmdlist[i]->command->content);
132 }
133 ct=cmdbuf;
43583524 134 } else {
50ec21f3 135 ct=cmdlist[i]->command->content;
43583524 136 }
137
c86edd1d
Q
138 if (summary->bylang[lang]) {
139 message=summary->bylang[lang]->content;
140 } else if (summary->bylang[0]) {
141 message=summary->bylang[0]->content;
142 } else {
143 message=summary->def->content;
144 }
145
50ec21f3 146 chanservsendmessage(sender, "%-20s %s",ct, message);
c86edd1d
Q
147 }
148
149 chanservstdmessage(sender, QM_ENDOFLIST);
150
151 return CMD_OK;
152}
153
dd258305 154int cs_sendhelp(nick *sender, char *thecmd, int oneline) {
c86edd1d 155 Command *cmd;
dd258305 156 cmdsummary *sum;
f2c13059 157 reguser *rup;
158
dd258305 159 if (!(cmd=findcommandintree(cscommands, thecmd, 1))) {
160 chanservstdmessage(sender, QM_UNKNOWNCMD, thecmd);
c86edd1d
Q
161 return CMD_ERROR;
162 }
dd258305 163
164/* Disable database help for now - splidge
165 csdb_dohelp(sender, cmd); */
f2c13059 166
167 rup=getreguserfromnick(sender);
168
169 /* Don't showhelp for privileged users to others.. */
170 if (((cmd->level & QCMD_HELPER) && (!rup || !UHasHelperPriv(rup))) ||
171 ((cmd->level & QCMD_OPER) && (!rup || !UHasOperPriv(rup))) ||
172 ((cmd->level & QCMD_ADMIN) && (!rup || !UHasAdminPriv(rup))) ||
173 ((cmd->level & QCMD_DEV) && (!rup || !UIsDev(rup)))) {
174 chanservstdmessage(sender, QM_NOHELP, cmd->command->content);
175 return CMD_OK;
176 }
dd258305 177
178 sum=cmd->ext;
c86edd1d 179
dd258305 180 if (sum->defhelp && *(sum->defhelp)) {
181 if (oneline) {
182 chanservsendmessageoneline(sender, sum->defhelp);
183 } else {
184 chanservsendmessage(sender, sum->defhelp);
185 }
186 } else {
187 if (!oneline)
188 chanservstdmessage(sender, QM_NOHELP, cmd->command->content);
189 }
4ad1cf7a
CP
190
191 return CMD_OK;
c86edd1d
Q
192}
193
194
dd258305 195int cs_dohelp(void *source, int cargc, char **cargv) {
196 nick *sender=source;
197
198 if (cargc==0)
199 return cs_doshowcommands(source,cargc,cargv);
200
201 return cs_sendhelp(sender, cargv[0], 0);
202}
203
204
c86edd1d
Q
205int cs_doctcpping(void *source, int cargc, char **cargv) {
206 char *nullbuf="\001";
207
208 sendnoticetouser(chanservnick, source, "%cPING %s",
209 1, cargc?cargv[0]:nullbuf);
210
211 return CMD_OK;
212}
213
214int cs_doctcpversion(void *source, int cargc, char **cargv) {
3e224d3f 215 sendnoticetouser(chanservnick, source, "\01VERSION Q9 version %s (Compiled on " __DATE__ ") (C) 2002-8 David Mansell (splidge) and others.\01", QVERSION);
216 sendnoticetouser(chanservnick, source, "\01VERSION Built on newserv. (C) 2002-8 David Mansell (splidge) and others.\01");
c86edd1d
Q
217
218 return CMD_OK;
219}
220
64f17f02 221int cs_doversion(void *source, int cargc, char **cargv) {
3e224d3f 222 chanservsendmessage((nick *)source, "Q9 version %s (Compiled on " __DATE__ ") (C) 2002-8 David Mansell (splidge) and others.", QVERSION);
223 chanservsendmessage((nick *)source, "Built on newserv. (C) 2002-8 David Mansell (splidge) and others.");
64f17f02
P
224 return CMD_OK;
225}
226
c86edd1d
Q
227int cs_doctcpgender(void *source, int cargc, char **cargv) {
228 sendnoticetouser(chanservnick, source, "\1GENDER Anyone who has a bitch mode has to be female ;)\1");
229
230 return CMD_OK;
231}
232
ee8cd7d0 233void csdb_dohelp_real(DBConn *, void *);
b263aa79 234
235struct helpinfo {
236 unsigned int numeric;
237 sstring *commandname;
1f0d7c8b 238 Command *cmd;
b263aa79 239};
240
241/* Help stuff */
242void csdb_dohelp(nick *np, Command *cmd) {
243 struct helpinfo *hip;
244
245 hip=(struct helpinfo *)malloc(sizeof(struct helpinfo));
246
247 hip->numeric=np->numeric;
248 hip->commandname=getsstring(cmd->command->content, cmd->command->length);
1f0d7c8b 249 hip->cmd=cmd;
b263aa79 250
b3565978 251 q9asyncquery(csdb_dohelp_real, (void *)hip,
522e2b8c 252 "SELECT languageID, fullinfo from chanserv.help where lower(command)=lower('%s')",cmd->command->content);
b263aa79 253}
254
ee8cd7d0 255void csdb_dohelp_real(DBConn *dbconn, void *arg) {
b263aa79 256 struct helpinfo *hip=arg;
257 nick *np=getnickbynumeric(hip->numeric);
258 reguser *rup;
259 char *result;
ee8cd7d0
CP
260 DBResult *pgres;
261 int j,lang=0;
b263aa79 262
b3565978
CP
263 if(!dbconn) {
264 freesstring(hip->commandname);
265 free(hip);
266 return;
267 }
268
ee8cd7d0 269 pgres=dbgetresult(dbconn);
b263aa79 270
ee8cd7d0 271 if (!dbquerysuccessful(pgres)) {
b263aa79 272 Error("chanserv",ERR_ERROR,"Error loading help text.");
c34af51f
CP
273 freesstring(hip->commandname);
274 free(hip);
b263aa79 275 return;
276 }
277
ee8cd7d0 278 if (dbnumfields(pgres)!=2) {
b263aa79 279 Error("chanserv",ERR_ERROR,"Help text format error.");
ee8cd7d0 280 dbclear(pgres);
c34af51f
CP
281 freesstring(hip->commandname);
282 free(hip);
b263aa79 283 return;
284 }
285
b263aa79 286 if (!np) {
ee8cd7d0 287 dbclear(pgres);
b263aa79 288 freesstring(hip->commandname);
289 free(hip);
290 return;
291 }
292
293 if ((rup=getreguserfromnick(np)))
294 lang=rup->languageid;
295
296 result=NULL;
297
ee8cd7d0
CP
298 while(dbfetchrow(pgres)) {
299 j=strtoul(dbgetvalue(pgres,0),NULL,10);
b263aa79 300 if ((j==0 && result==NULL) || (j==lang)) {
ee8cd7d0 301 result=dbgetvalue(pgres,1);
b263aa79 302 if(strlen(result)==0)
303 result=NULL;
304 }
305 }
306
1f0d7c8b 307 if (result) {
b263aa79 308 chanservsendmessage(np, result);
1f0d7c8b 309 } else {
310 cmdsummary *sum=hip->cmd->ext;
311 if (sum->defhelp && *(sum->defhelp)) {
312 chanservsendmessage(np, sum->defhelp);
313 } else {
314 chanservstdmessage(np, QM_NOHELP, hip->commandname->content);
315 }
316 }
b263aa79 317
318 freesstring(hip->commandname);
319 free(hip);
ee8cd7d0 320 dbclear(pgres);
b263aa79 321}