]>
Commit | Line | Data |
---|---|---|
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 | |
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_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 | ||
66 | int 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 | 154 | int 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 | 195 | int 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 |
205 | int 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 | ||
214 | int 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 | 221 | int 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 |
227 | int 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 | 233 | void csdb_dohelp_real(DBConn *, void *); |
b263aa79 | 234 | |
235 | struct helpinfo { | |
236 | unsigned int numeric; | |
237 | sstring *commandname; | |
1f0d7c8b | 238 | Command *cmd; |
b263aa79 | 239 | }; |
240 | ||
241 | /* Help stuff */ | |
242 | void 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 | 255 | void 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 | } |