]> jfr.im git - irc/quakenet/newserv.git/blob - noperserv/noperserv_commands.c
b3bba801fdb781ef1a168068e562dd72f8c5bb7b
[irc/quakenet/newserv.git] / noperserv / noperserv_commands.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdarg.h>
4 #include <string.h>
5 #include <time.h>
6
7 #include "../control/control.h"
8 #include "../nick/nick.h"
9 #include "../lib/irc_string.h"
10 #include "../lib/strlfunc.h"
11 #include "../localuser/localuserchannel.h"
12
13 int controlkill(void *sender, int cargc, char **cargv);
14 int controlopchan(void *sender, int cargc, char **cargv);
15 int controlkick(void *sender, int cargc, char **cargv);
16 int controlspewchan(void *sender, int cargc, char **cargv);
17 int controlspew(void *sender, int cargc, char **cargv);
18 int controlresync(void *sender, int cargc, char **cargv);
19 int controlbroadcast(void *sender, int cargc, char **cargv);
20 int controlobroadcast(void *sender, int cargc, char **cargv);
21 int controlmbroadcast(void *sender, int cargc, char **cargv);
22 int controlsbroadcast(void *sender, int cargc, char **cargv);
23
24 void _init() {
25 registercontrolhelpcmd("kill", NO_OPER, 2, &controlkill, "Usage: kill <nick> ?reason?\nKill specified user with given reason (or 'Killed').");
26 registercontrolhelpcmd("kick", NO_OPER, 3, &controlkick, "Usage: kick <channel> <user> ?reason?\nKick a user from the given channel, with given reason (or 'Kicked').");
27
28 registercontrolhelpcmd("spewchan", NO_OPER, 1, &controlspewchan, "Usage: spewchan <pattern>\nShows all channels which are matched by the given pattern");
29
30 /* registercontrolhelpcmd("spew", NO_OPER, 1, &controlspew, "Usage: spewchan <pattern>\nShows all userss which are matched by the given pattern"); */
31
32 registercontrolhelpcmd("resync", NO_OPER, 1, &controlresync, "Usage: resync <channel>\nResyncs a desynched channel");
33
34 registercontrolhelpcmd("broadcast", NO_OPER, 1, &controlbroadcast, "Usage: broadcast <text>\nSends a message to all users.");
35 registercontrolhelpcmd("obroadcast", NO_OPER, 1, &controlobroadcast, "Usage: obroadcast <text>\nSends a message to all IRC operators.");
36 registercontrolhelpcmd("mbroadcast", NO_OPER, 2, &controlmbroadcast, "Usage: mbroadcast <mask> <text>\nSends a message to all users matching the mask.");
37 registercontrolhelpcmd("sbroadcast", NO_OPER, 2, &controlsbroadcast, "Usage: sbroadcast <mask> <text>\nSends a message to all users on specific server(s).");
38 }
39
40 void _fini() {
41 deregistercontrolcmd("obroadcast", controlobroadcast);
42 deregistercontrolcmd("sbroadcast", controlsbroadcast);
43 deregistercontrolcmd("mbroadcast", controlmbroadcast);
44 deregistercontrolcmd("broadcast", controlbroadcast);
45
46 deregistercontrolcmd("resync", controlresync);
47 /* deregistercontrolcmd("spew", controlspew); */
48 deregistercontrolcmd("spewchan", controlspewchan);
49
50 deregistercontrolcmd("kill", controlkill);
51 deregistercontrolcmd("kick", controlkick);
52 }
53
54 int controlkick(void *sender, int cargc, char **cargv) {
55 nick *np=(nick *)sender;
56 channel *cp;
57 nick *target;
58
59 if (cargc<2)
60 return CMD_USAGE;
61
62 if ((cp=findchannel(cargv[0]))==NULL) {
63 controlreply(np,"Couldn't find that channel.");
64 return CMD_ERROR;
65 }
66
67 if ((target=getnickbynick(cargv[1]))==NULL) {
68 controlreply(np,"Sorry, couldn't find that user");
69 return CMD_ERROR;
70 }
71
72 controlwall(NO_OPER, NL_KICKS, "%s/%s sent KICK for %s!%s@%s on %s (%s)", np->nick, np->authname, target->nick, target->ident, target->host->name->content,cp->index->name->content, (cargc>2)?cargv[2]:"Kicked");
73 localkickuser(NULL, cp, target, (cargc>2)?cargv[2]:"Kicked");
74 controlreply(sender, "KICK sent.");
75
76 return CMD_OK;
77 }
78
79 /* NO checking to see if it's us or anyone important */
80 int controlkill(void *sender, int cargc, char **cargv) {
81 nick *target;
82 nick *np = (nick *)sender;
83
84 if (cargc<1)
85 return CMD_USAGE;
86
87 if ((target=getnickbynick(cargv[0]))==NULL) {
88 controlreply(np,"Sorry, couldn't find that user.");
89 return CMD_ERROR;
90 }
91
92 controlwall(NO_OPER, NL_KILLS, "%s/%s sent KILL for %s!%s@%s (%s)", np->nick, np->authname, target->nick, target->ident, target->host->name->content, (cargc>1)?cargv[1]:"Killed");
93 killuser(NULL, target, (cargc>1)?cargv[1]:"Killed");
94 controlreply(np, "KILL sent.");
95
96 return CMD_OK;
97 }
98
99 int controlresync(void *sender, int cargc, char **cargv) {
100 nick *np = (nick*)sender;
101 channel *cp;
102 modechanges changes;
103 int a;
104
105 if (cargc < 1)
106 return CMD_USAGE;
107
108 cp = findchannel(cargv[0]);
109
110 if (cp == NULL) {
111 controlreply(np, "No such channel.");
112
113 return CMD_ERROR;
114 }
115
116 irc_send("%s CM %s o", mynumeric->content, cp->index->name->content);
117
118 localsetmodeinit(&changes, cp, mynick);
119
120 for(a=0;a<cp->users->hashsize;a++) {
121 if (cp->users->content[a] != nouser) {
122 np = getnickbynumeric(cp->users->content[a]);
123
124 /* make newserv believe that this user is not opped */
125 if (cp->users->content[a] & CUMODE_OP)
126 cp->users->content[a] &= ~CUMODE_OP;
127 else if (!IsService(np)) /* if the user wasn't opped before and is not a service we don't care about him */
128 continue;
129
130 /* now reop him */
131 localdosetmode_nick(&changes, np, MC_OP);
132 }
133 }
134
135 localsetmodeflush(&changes, 1);
136
137 controlreply(np, "Done.");
138
139 return CMD_OK;
140 }
141
142 int controlspew(void *sender, int cargc, char **cargv) {
143 nick *np = (nick *)sender;
144
145 return CMD_OK;
146 }
147
148 int controlspewchan(void *sender, int cargc, char **cargv) {
149 nick *np = (nick*)sender;
150 nick *np2;
151 int i, a, ccount = 0, morecservices, ucount, cscount;
152 chanindex *cip;
153 channel *cp;
154 char cservices[300];
155 char strcscount[40];
156
157 if (cargc < 1)
158 return CMD_USAGE;
159
160 for (i=0; i<CHANNELHASHSIZE; i++) {
161 for (cip=chantable[i]; cip; cip=cip->next) {
162 if ((cp = cip->channel) != NULL && match2strings(cargv[0], cip->name->content)) {
163 /* find channel services */
164 cservices[0] = '\0';
165 cscount = ucount = morecservices = 0;
166
167 for (a=0;a<cp->users->hashsize;a++) {
168 if (cp->users->content[a] != nouser) {
169 np2 = getnickbynumeric(cp->users->content[a]);
170
171 if (IsService(np2)) {
172 cscount++;
173
174 if (strlen(cservices) < 100) {
175 if (cservices[0])
176 strlcat(cservices, ", ", sizeof(cservices));
177
178 strlcat(cservices, np2->nick, sizeof(cservices));
179 } else {
180 morecservices++;
181 }
182 }
183
184 ucount++;
185 }
186 }
187
188 if (morecservices)
189 snprintf(cservices + strlen(cservices), sizeof(cservices), " and %d more", morecservices);
190
191 snprintf(strcscount, sizeof(strcscount), "%d", cscount);
192
193 /* TODO: print this channel ;; @slug -- WTF? */
194 controlreply(np, "%-30s %5ld %-8s%s%s%-11s%s%s%s",
195 cip->name->content,
196 ucount,
197 ucount != 1 ? "users" : "user",
198 *cservices ? "- found " : "",
199 *cservices ? strcscount : "",
200 *cservices ? (strchr(cservices, ',') ? " chanservs" : " chanserv") : "",
201 *cservices ? "(" : "",
202 *cservices ? cservices : "",
203 *cservices ? ")" : "");
204
205 ccount++;
206
207 if (ccount > 1000)
208 break; /* Don't ever list more than 1000 channels */
209 }
210 }
211 }
212
213 if (ccount > 1000)
214 controlreply(np, "More than 1000 matching channels were found. Please use a more specific pattern.");
215 else
216 controlreply(np, "Found %d channels matching specified pattern.", ccount);
217
218 return CMD_OK;
219 }
220
221 int controlbroadcast(void *sender, int cargc, char **cargv) {
222 nick *np = (nick*)sender;
223
224 if (cargc<1)
225 return CMD_USAGE;
226
227 controlwall(NO_OPER, NL_BROADCASTS, "%s/%s sent a broadcast: %s", np->nick, np->authname, cargv[0]);
228
229 irc_send("%s O $* :(Broadcast) %s", longtonumeric(mynick->numeric,5), cargv[0]);
230
231 controlreply(np, "Message broadcasted.");
232
233 return CMD_OK;
234 }
235
236 int controlmbroadcast(void *sender, int cargc, char **cargv) {
237 nick *np = (nick*)sender;
238
239 if (cargc<2)
240 return CMD_USAGE;
241
242 controlwall(NO_OPER, NL_BROADCASTS, "%s/%s sent an mbroadcast to %s: %s", np->nick, np->authname, cargv[0], cargv[1]);
243
244 irc_send("%s O $@%s :(mBroadcast) %s", longtonumeric(mynick->numeric,5), cargv[0], cargv[1]);
245
246 controlreply(np, "Message mbroadcasted.");
247
248 return CMD_OK;
249 }
250
251 int controlsbroadcast(void *sender, int cargc, char **cargv) {
252 nick *np = (nick *)sender;
253
254 if(cargc<2)
255 return CMD_USAGE;
256
257 controlwall(NO_OPER, NL_BROADCASTS, "%s/%s sent a sbroadcast to %s: %s", np->nick, np->authname, cargv[0], cargv[1]);
258
259 irc_send("%s O $%s :(sBroadcast) %s", longtonumeric(mynick->numeric,5), cargv[0], cargv[1]);
260
261 controlreply(np, "Message sbroadcasted.");
262
263 return CMD_OK;
264 }
265
266 int controlobroadcast(void *sender, int cargc, char **cargv) {
267 nick *np = (nick *)sender, *nip;
268 int i;
269
270 if(cargc<1)
271 return CMD_USAGE;
272
273 controlwall(NO_OPER, NL_BROADCASTS, "%s/%s sent an obroadcast: %s", np->nick, np->authname, cargv[0]);
274
275 for(i=0;i<NICKHASHSIZE;i++)
276 for(nip=nicktable[i];nip;nip=nip->next)
277 if(nip && IsOper(nip))
278 controlnotice(nip, "(oBroadcast) %s", cargv[0]);
279
280 controlreply(np, "Message obroadcasted.");
281
282 return CMD_OK;
283 }