]> jfr.im git - irc/quakenet/newserv.git/blob - chanserv/chanservstdcmds.c
Move claimnick to +q.
[irc/quakenet/newserv.git] / chanserv / chanservstdcmds.c
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
95 n=getcommandlist(cscommands, cmdlist, 200);
96 rup=getreguserfromnick(sender);
97
98 if (!rup)
99 lang=0;
100 else
101 lang=rup->languageid;
102
103 chanservstdmessage(sender, QM_COMMANDLIST);
104
105 for (i=0;i<n;i++) {
106
107 if (cargc>0 && !match2strings(cargv[0],cmdlist[i]->command->content))
108 continue;
109
110 /* Don't list aliases */
111 if (cmdlist[i]->level & QCMD_ALIAS)
112 continue;
113
114 /* Check that this user can use this command.. */
115 if ((cmdlist[i]->level & QCMD_AUTHED) && !rup)
116 continue;
117
118 if ((cmdlist[i]->level & QCMD_NOTAUTHED) && rup)
119 continue;
120
121 if ((cmdlist[i]->level & QCMD_STAFF) &&
122 (!rup || !UHasStaffPriv(rup)))
123 continue;
124
125 if ((cmdlist[i]->level & QCMD_HELPER) &&
126 (!rup || !UHasHelperPriv(rup)))
127 continue;
128
129 if ((cmdlist[i]->level & QCMD_OPER) &&
130 (!rup || !UHasOperPriv(rup) || !IsOper(sender)))
131 continue;
132
133 if ((cmdlist[i]->level & QCMD_ADMIN) &&
134 (!rup || !UHasAdminPriv(rup) || !IsOper(sender)))
135 continue;
136
137 if ((cmdlist[i]->level & QCMD_DEV) &&
138 (!rup || !UIsDev(rup) || !IsOper(sender)))
139 continue;
140
141 summary=(cmdsummary *)cmdlist[i]->ext;
142
143 if (rup && UHasHelperPriv(rup)) {
144 if (cmdlist[i]->level & QCMD_DEV) {
145 sprintf(cmdbuf,"+d %s",cmdlist[i]->command->content);
146 } else if(cmdlist[i]->level & QCMD_ADMIN) {
147 sprintf(cmdbuf,"+a %s",cmdlist[i]->command->content);
148 } else if(cmdlist[i]->level & QCMD_OPER) {
149 sprintf(cmdbuf,"+o %s",cmdlist[i]->command->content);
150 } else if(cmdlist[i]->level & QCMD_HELPER) {
151 sprintf(cmdbuf,"+h %s",cmdlist[i]->command->content);
152 } else if(cmdlist[i]->level & QCMD_STAFF) {
153 sprintf(cmdbuf,"+q %s",cmdlist[i]->command->content);
154 } else {
155 sprintf(cmdbuf," %s",cmdlist[i]->command->content);
156 }
157 ct=cmdbuf;
158 } else {
159 ct=cmdlist[i]->command->content;
160 }
161
162 if (summary->bylang[lang]) {
163 message=summary->bylang[lang]->content;
164 } else if (summary->bylang[0]) {
165 message=summary->bylang[0]->content;
166 } else {
167 message=summary->def->content;
168 }
169
170 chanservsendmessage(sender, "%-20s %s",ct, message);
171 }
172
173 chanservstdmessage(sender, QM_ENDOFLIST);
174
175 return CMD_OK;
176 }
177
178 int cs_sendhelp(nick *sender, char *thecmd, int oneline) {
179 Command *cmd;
180 cmdsummary *sum;
181 reguser *rup;
182
183 if (!(cmd=findcommandintree(cscommands, thecmd, 1))) {
184 chanservstdmessage(sender, QM_UNKNOWNCMD, thecmd);
185 return CMD_ERROR;
186 }
187
188 /* Disable database help for now - splidge
189 csdb_dohelp(sender, cmd); */
190
191 rup=getreguserfromnick(sender);
192
193 /* Don't showhelp for privileged users to others.. */
194 if (((cmd->level & QCMD_HELPER) && (!rup || !UHasHelperPriv(rup))) ||
195 ((cmd->level & QCMD_OPER) && (!rup || !UHasOperPriv(rup))) ||
196 ((cmd->level & QCMD_ADMIN) && (!rup || !UHasAdminPriv(rup))) ||
197 ((cmd->level & QCMD_DEV) && (!rup || !UIsDev(rup)))) {
198 chanservstdmessage(sender, QM_NOHELP, cmd->command->content);
199 return CMD_OK;
200 }
201
202 sum=cmd->ext;
203
204 if (sum->defhelp && *(sum->defhelp)) {
205 if (oneline) {
206 chanservsendmessageoneline(sender, sum->defhelp);
207 } else {
208 chanservsendmessage(sender, sum->defhelp);
209 }
210 } else {
211 if (!oneline)
212 chanservstdmessage(sender, QM_NOHELP, cmd->command->content);
213 }
214
215 return CMD_OK;
216 }
217
218
219 int cs_dohelp(void *source, int cargc, char **cargv) {
220 nick *sender=source;
221
222 if (cargc==0)
223 return cs_doshowcommands(source,cargc,cargv);
224
225 return cs_sendhelp(sender, cargv[0], 0);
226 }
227
228
229 int cs_doctcpping(void *source, int cargc, char **cargv) {
230 char *nullbuf="\001";
231
232 sendnoticetouser(chanservnick, source, "%cPING %s",
233 1, cargc?cargv[0]:nullbuf);
234
235 return CMD_OK;
236 }
237
238 int cs_doctcpversion(void *source, int cargc, char **cargv) {
239 sendnoticetouser(chanservnick, source, "\01VERSION Q9 version %s (Compiled on " __DATE__ ") (C) 2002-8 David Mansell (splidge) and others.\01", QVERSION);
240 sendnoticetouser(chanservnick, source, "\01VERSION Built on newserv. (C) 2002-8 David Mansell (splidge) and others.\01");
241
242 return CMD_OK;
243 }
244
245 int cs_doversion(void *source, int cargc, char **cargv) {
246 chanservsendmessage((nick *)source, "Q9 version %s (Compiled on " __DATE__ ") (C) 2002-8 David Mansell (splidge) and others.", QVERSION);
247 chanservsendmessage((nick *)source, "Built on newserv. (C) 2002-8 David Mansell (splidge) and others.");
248 return CMD_OK;
249 }
250
251 int cs_doctcpgender(void *source, int cargc, char **cargv) {
252 sendnoticetouser(chanservnick, source, "\1GENDER Anyone who has a bitch mode has to be female ;)\1");
253
254 return CMD_OK;
255 }
256
257 void csdb_dohelp_real(DBConn *, void *);
258
259 struct helpinfo {
260 unsigned int numeric;
261 sstring *commandname;
262 Command *cmd;
263 };
264
265 /* Help stuff */
266 void csdb_dohelp(nick *np, Command *cmd) {
267 struct helpinfo *hip;
268
269 hip=(struct helpinfo *)malloc(sizeof(struct helpinfo));
270
271 hip->numeric=np->numeric;
272 hip->commandname=getsstring(cmd->command->content, cmd->command->length);
273 hip->cmd=cmd;
274
275 q9asyncquery(csdb_dohelp_real, (void *)hip,
276 "SELECT languageID, fullinfo from chanserv.help where lower(command)=lower('%s')",cmd->command->content);
277 }
278
279 void csdb_dohelp_real(DBConn *dbconn, void *arg) {
280 struct helpinfo *hip=arg;
281 nick *np=getnickbynumeric(hip->numeric);
282 reguser *rup;
283 char *result;
284 DBResult *pgres;
285 int j,lang=0;
286
287 if(!dbconn) {
288 freesstring(hip->commandname);
289 free(hip);
290 return;
291 }
292
293 pgres=dbgetresult(dbconn);
294
295 if (!dbquerysuccessful(pgres)) {
296 Error("chanserv",ERR_ERROR,"Error loading help text.");
297 freesstring(hip->commandname);
298 free(hip);
299 return;
300 }
301
302 if (dbnumfields(pgres)!=2) {
303 Error("chanserv",ERR_ERROR,"Help text format error.");
304 dbclear(pgres);
305 freesstring(hip->commandname);
306 free(hip);
307 return;
308 }
309
310 if (!np) {
311 dbclear(pgres);
312 freesstring(hip->commandname);
313 free(hip);
314 return;
315 }
316
317 if ((rup=getreguserfromnick(np)))
318 lang=rup->languageid;
319
320 result=NULL;
321
322 while(dbfetchrow(pgres)) {
323 j=strtoul(dbgetvalue(pgres,0),NULL,10);
324 if ((j==0 && result==NULL) || (j==lang)) {
325 result=dbgetvalue(pgres,1);
326 if(strlen(result)==0)
327 result=NULL;
328 }
329 }
330
331 if (result) {
332 chanservsendmessage(np, result);
333 } else {
334 cmdsummary *sum=hip->cmd->ext;
335 if (sum->defhelp && *(sum->defhelp)) {
336 chanservsendmessage(np, sum->defhelp);
337 } else {
338 chanservstdmessage(np, QM_NOHELP, hip->commandname->content);
339 }
340 }
341
342 freesstring(hip->commandname);
343 free(hip);
344 dbclear(pgres);
345 }