]> jfr.im git - irc/quakenet/newserv.git/blob - chanserv/chanservstdcmds.c
58fdcd99fec2c64fdd274c8a261a3b4546b9b0c3
[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 "../pqsql/pqsql.h"
9
10 #include <string.h>
11
12 int cs_dorehash(void *source, int cargc, char **cargv) {
13 nick *sender=source;
14 Command *cmdlist[200];
15 int i,n;
16
17 /* Reload the response text first */
18 loadmessages();
19
20 /* Now the commands */
21 n=getcommandlist(cscommands, cmdlist, 200);
22
23 for(i=0;i<n;i++)
24 loadcommandsummary(cmdlist[i]);
25
26 chanservstdmessage(sender, QM_DONE);
27
28 return CMD_OK;
29 }
30
31 int cs_doquit(void *source, int cargc, char **cargv) {
32 char *reason="Leaving";
33 nick *sender=(nick *)source;
34
35 if (cargc>0) {
36 reason=cargv[0];
37 }
38
39 chanservstdmessage(sender, QM_DONE);
40
41 deregisterlocaluser(chanservnick, reason);
42 scheduleoneshot(time(NULL)+1,&chanservreguser,NULL);
43
44 return CMD_OK;
45 }
46
47 int cs_dorename(void *source, int cargc, char **cargv) {
48 char newnick[NICKLEN+1];
49 nick *sender=source;
50
51 if (cargc<1) {
52 chanservstdmessage(sender, QM_NOTENOUGHPARAMS, "rename");
53 return CMD_ERROR;
54 }
55
56 strncpy(newnick,cargv[0],NICKLEN);
57 newnick[NICKLEN]='\0';
58
59 renamelocaluser(chanservnick, newnick);
60 chanservstdmessage(sender, QM_DONE);
61
62 return CMD_OK;
63 }
64
65 int cs_doshowcommands(void *source, int cargc, char **cargv) {
66 nick *sender=source;
67 reguser *rup;
68 Command *cmdlist[200];
69 int i,n;
70 int lang;
71 char *message;
72 cmdsummary *summary;
73
74 n=getcommandlist(cscommands, cmdlist, 200);
75 rup=getreguserfromnick(sender);
76
77 if (!rup)
78 lang=0;
79 else
80 lang=rup->languageid;
81
82 chanservstdmessage(sender, QM_COMMANDLIST);
83
84 for (i=0;i<n;i++) {
85 if (cargc>0 && !match2strings(cargv[0],cmdlist[i]->command->content))
86 continue;
87
88 /* Don't list aliases */
89 if (cmdlist[i]->level & QCMD_ALIAS)
90 continue;
91
92 /* Check that this user can use this command.. */
93 if ((cmdlist[i]->level & QCMD_AUTHED) && !rup)
94 continue;
95
96 if ((cmdlist[i]->level & QCMD_NOTAUTHED) && rup)
97 continue;
98
99 if ((cmdlist[i]->level & QCMD_HELPER) &&
100 (!rup || !UHasHelperPriv(rup)))
101 continue;
102
103 if ((cmdlist[i]->level & QCMD_OPER) &&
104 (!rup || !UHasOperPriv(rup) || !IsOper(sender)))
105 continue;
106
107 if ((cmdlist[i]->level & QCMD_ADMIN) &&
108 (!rup || !UHasAdminPriv(rup) || !IsOper(sender)))
109 continue;
110
111 if ((cmdlist[i]->level & QCMD_DEV) &&
112 (!rup || !UIsDev(rup) || !IsOper(sender)))
113 continue;
114
115 summary=(cmdsummary *)cmdlist[i]->ext;
116
117 if (summary->bylang[lang]) {
118 message=summary->bylang[lang]->content;
119 } else if (summary->bylang[0]) {
120 message=summary->bylang[0]->content;
121 } else {
122 message=summary->def->content;
123 }
124
125 chanservsendmessage(sender, "%-20s %s",cmdlist[i]->command->content, message);
126 }
127
128 chanservstdmessage(sender, QM_ENDOFLIST);
129
130 return CMD_OK;
131 }
132
133 int cs_sendhelp(nick *sender, char *thecmd, int oneline) {
134 Command *cmd;
135 cmdsummary *sum;
136 reguser *rup;
137
138 if (!(cmd=findcommandintree(cscommands, thecmd, 1))) {
139 chanservstdmessage(sender, QM_UNKNOWNCMD, thecmd);
140 return CMD_ERROR;
141 }
142
143 /* Disable database help for now - splidge
144 csdb_dohelp(sender, cmd); */
145
146 rup=getreguserfromnick(sender);
147
148 /* Don't showhelp for privileged users to others.. */
149 if (((cmd->level & QCMD_HELPER) && (!rup || !UHasHelperPriv(rup))) ||
150 ((cmd->level & QCMD_OPER) && (!rup || !UHasOperPriv(rup))) ||
151 ((cmd->level & QCMD_ADMIN) && (!rup || !UHasAdminPriv(rup))) ||
152 ((cmd->level & QCMD_DEV) && (!rup || !UIsDev(rup)))) {
153 chanservstdmessage(sender, QM_NOHELP, cmd->command->content);
154 return CMD_OK;
155 }
156
157 sum=cmd->ext;
158
159 if (sum->defhelp && *(sum->defhelp)) {
160 if (oneline) {
161 chanservsendmessageoneline(sender, sum->defhelp);
162 } else {
163 chanservsendmessage(sender, sum->defhelp);
164 }
165 } else {
166 if (!oneline)
167 chanservstdmessage(sender, QM_NOHELP, cmd->command->content);
168 }
169
170 return CMD_OK;
171 }
172
173
174 int cs_dohelp(void *source, int cargc, char **cargv) {
175 nick *sender=source;
176
177 if (cargc==0)
178 return cs_doshowcommands(source,cargc,cargv);
179
180 return cs_sendhelp(sender, cargv[0], 0);
181 }
182
183
184 int cs_doctcpping(void *source, int cargc, char **cargv) {
185 char *nullbuf="\001";
186
187 sendnoticetouser(chanservnick, source, "%cPING %s",
188 1, cargc?cargv[0]:nullbuf);
189
190 return CMD_OK;
191 }
192
193 int cs_doctcpversion(void *source, int cargc, char **cargv) {
194 sendnoticetouser(chanservnick, source, "\01VERSION Q9 version %s (Compiled on " __DATE__ ") (C) 2002-3 David Mansell (splidge)\01", QVERSION);
195 sendnoticetouser(chanservnick, source, "\01VERSION Built on newserv version 1.00. (C) 2002-3 David Mansell (splidge)\01");
196
197 return CMD_OK;
198 }
199
200 int cs_doversion(void *source, int cargc, char **cargv) {
201 chanservsendmessage((nick *)source, "Q9 version %s (Compiled on " __DATE__ ") (C) 2002-3 David Mansell (splidge)", QVERSION);
202 chanservsendmessage((nick *)source, "Built on newserv version 1.00. (C) 2002-3 David Mansell (splidge)");
203 return CMD_OK;
204 }
205
206 int cs_doctcpgender(void *source, int cargc, char **cargv) {
207 sendnoticetouser(chanservnick, source, "\1GENDER Anyone who has a bitch mode has to be female ;)\1");
208
209 return CMD_OK;
210 }
211
212 void csdb_dohelp_real(PGconn *, void *);
213
214 struct helpinfo {
215 unsigned int numeric;
216 sstring *commandname;
217 Command *cmd;
218 };
219
220 /* Help stuff */
221 void csdb_dohelp(nick *np, Command *cmd) {
222 struct helpinfo *hip;
223
224 hip=(struct helpinfo *)malloc(sizeof(struct helpinfo));
225
226 hip->numeric=np->numeric;
227 hip->commandname=getsstring(cmd->command->content, cmd->command->length);
228 hip->cmd=cmd;
229
230 q9asyncquery(csdb_dohelp_real, (void *)hip,
231 "SELECT languageID, fullinfo from help where lower(command)=lower('%s')",cmd->command->content);
232 }
233
234 void csdb_dohelp_real(PGconn *dbconn, void *arg) {
235 struct helpinfo *hip=arg;
236 nick *np=getnickbynumeric(hip->numeric);
237 reguser *rup;
238 char *result;
239 PGresult *pgres;
240 int i,j,num,lang=0;
241
242 if(!dbconn) {
243 freesstring(hip->commandname);
244 free(hip);
245 return;
246 }
247
248 pgres=PQgetResult(dbconn);
249
250 if (PQresultStatus(pgres) != PGRES_TUPLES_OK) {
251 Error("chanserv",ERR_ERROR,"Error loading help text.");
252 freesstring(hip->commandname);
253 free(hip);
254 return;
255 }
256
257 if (PQnfields(pgres)!=2) {
258 Error("chanserv",ERR_ERROR,"Help text format error.");
259 PQclear(pgres);
260 freesstring(hip->commandname);
261 free(hip);
262 return;
263 }
264
265 num=PQntuples(pgres);
266
267 if (!np) {
268 PQclear(pgres);
269 freesstring(hip->commandname);
270 free(hip);
271 return;
272 }
273
274 if ((rup=getreguserfromnick(np)))
275 lang=rup->languageid;
276
277 result=NULL;
278
279 for (i=0;i<num;i++) {
280 j=strtoul(PQgetvalue(pgres,i,0),NULL,10);
281 if ((j==0 && result==NULL) || (j==lang)) {
282 result=PQgetvalue(pgres,i,1);
283 if(strlen(result)==0)
284 result=NULL;
285 }
286 }
287
288 if (result) {
289 chanservsendmessage(np, result);
290 } else {
291 cmdsummary *sum=hip->cmd->ext;
292 if (sum->defhelp && *(sum->defhelp)) {
293 chanservsendmessage(np, sum->defhelp);
294 } else {
295 chanservstdmessage(np, QM_NOHELP, hip->commandname->content);
296 }
297 }
298
299 freesstring(hip->commandname);
300 free(hip);
301 }