]> jfr.im git - irc/quakenet/newserv.git/blob - chanserv/chanservstdcmds.c
Merge
[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_dohelp(void *source, int cargc, char **cargv) {
134 nick *sender=source;
135 Command *cmd;
136
137 if (cargc==0)
138 return cs_doshowcommands(source,cargc,cargv);
139
140 if (!(cmd=findcommandintree(cscommands, cargv[0], 1))) {
141 chanservstdmessage(sender, QM_UNKNOWNCMD, cargv[0]);
142 return CMD_ERROR;
143 }
144
145 csdb_dohelp(sender, cmd);
146
147 return CMD_OK;
148 }
149
150
151 int cs_doctcpping(void *source, int cargc, char **cargv) {
152 char *nullbuf="\001";
153
154 sendnoticetouser(chanservnick, source, "%cPING %s",
155 1, cargc?cargv[0]:nullbuf);
156
157 return CMD_OK;
158 }
159
160 int cs_doctcpversion(void *source, int cargc, char **cargv) {
161 sendnoticetouser(chanservnick, source, "\01VERSION Q9 version %s (Compiled on " __DATE__ ") (C) 2002-3 David Mansell (splidge)\01", QVERSION);
162 sendnoticetouser(chanservnick, source, "\01VERSION Built on newserv version 1.00. (C) 2002-3 David Mansell (splidge)\01");
163
164 return CMD_OK;
165 }
166
167 int cs_doversion(void *source, int cargc, char **cargv) {
168 chanservsendmessage((nick *)source, "Q9 version %s (Compiled on " __DATE__ ") (C) 2002-3 David Mansell (splidge)", QVERSION);
169 chanservsendmessage((nick *)source, "Built on newserv version 1.00. (C) 2002-3 David Mansell (splidge)");
170 return CMD_OK;
171 }
172
173 int cs_doctcpgender(void *source, int cargc, char **cargv) {
174 sendnoticetouser(chanservnick, source, "\1GENDER Anyone who has a bitch mode has to be female ;)\1");
175
176 return CMD_OK;
177 }
178
179 void csdb_dohelp_real(PGconn *, void *);
180
181 struct helpinfo {
182 unsigned int numeric;
183 sstring *commandname;
184 };
185
186 /* Help stuff */
187 void csdb_dohelp(nick *np, Command *cmd) {
188 struct helpinfo *hip;
189
190 hip=(struct helpinfo *)malloc(sizeof(struct helpinfo));
191
192 hip->numeric=np->numeric;
193 hip->commandname=getsstring(cmd->command->content, cmd->command->length);
194
195 pqasyncquery(csdb_dohelp_real, (void *)hip,
196 "SELECT languageID, fullinfo from help where lower(command)=lower('%s')",cmd->command->content);
197 }
198
199 void csdb_dohelp_real(PGconn *dbconn, void *arg) {
200 struct helpinfo *hip=arg;
201 nick *np=getnickbynumeric(hip->numeric);
202 reguser *rup;
203 char *result;
204 PGresult *pgres;
205 int i,j,num,lang=0;
206
207 pgres=PQgetResult(dbconn);
208
209 if (PQresultStatus(pgres) != PGRES_TUPLES_OK) {
210 Error("chanserv",ERR_ERROR,"Error loading help text.");
211 return;
212 }
213
214 if (PQnfields(pgres)!=2) {
215 Error("chanserv",ERR_ERROR,"Help text format error.");
216 return;
217 }
218
219 num=PQntuples(pgres);
220
221 if (!np) {
222 PQclear(pgres);
223 freesstring(hip->commandname);
224 free(hip);
225 return;
226 }
227
228 if ((rup=getreguserfromnick(np)))
229 lang=rup->languageid;
230
231 result=NULL;
232
233 for (i=0;i<num;i++) {
234 j=strtoul(PQgetvalue(pgres,i,0),NULL,10);
235 if ((j==0 && result==NULL) || (j==lang)) {
236 result=PQgetvalue(pgres,i,1);
237 if(strlen(result)==0)
238 result=NULL;
239 }
240 }
241
242 if (!result)
243 chanservstdmessage(np, QM_NOHELP, hip->commandname->content);
244 else
245 chanservsendmessage(np, result);
246
247 freesstring(hip->commandname);
248 free(hip);
249 }