]> jfr.im git - irc/quakenet/newserv.git/blob - noperserv/noperserv_commands.c
New module: nickwatch
[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 <strings.h>
6 #include <time.h>
7
8 #include "../control/control.h"
9 #include "../nick/nick.h"
10 #include "../newsearch/newsearch.h"
11 #include "../lib/irc_string.h"
12 #include "../lib/strlfunc.h"
13 #include "../localuser/localuserchannel.h"
14 #include "../lib/version.h"
15 #include "../core/modules.h"
16
17 MODULE_VERSION("");
18
19 int controlkill(void *sender, int cargc, char **cargv);
20 int controlkick(void *sender, int cargc, char **cargv);
21 int controlspewchan(void *sender, int cargc, char **cargv);
22 int controlspew(void *sender, int cargc, char **cargv);
23 int controlcompare(void *sender, int cargc, char **cargv);
24 int controlbroadcast(void *sender, int cargc, char **cargv);
25 int controlobroadcast(void *sender, int cargc, char **cargv);
26 int controlmbroadcast(void *sender, int cargc, char **cargv);
27 int controlsbroadcast(void *sender, int cargc, char **cargv);
28 int controlcbroadcast(void *sender, int cargc, char **cargv);
29
30 void _init() {
31 registercontrolhelpcmd("kill", NO_OPER, 2, &controlkill, "Usage: kill <nick> ?reason?\nKill specified user with given reason (or 'Killed').");
32 registercontrolhelpcmd("kick", NO_OPER, 3, &controlkick, "Usage: kick <channel> <user> ?reason?\nKick a user from the given channel, with given reason (or 'Kicked').");
33
34 registercontrolhelpcmd("spewchan", NO_OPER, 1, &controlspewchan, "Usage: spewchan <pattern>\nShows all channels which are matched by the given pattern");
35 registercontrolhelpcmd("spew", NO_OPER, 1, &controlspew, "Usage: spew <pattern>\nShows all userss which are matched by the given pattern");
36 registercontrolhelpcmd("compare", NO_OPER, 255, &controlcompare, "Usage: compare <nick1> <nick2> ... <nickn>\nShows channels shared by supplied nicknames\nUsage: compare <channel1> <channel2> ... <channeln>\nShares nicks that share the supplied channels");
37
38 registercontrolhelpcmd("broadcast", NO_OPER, 1, &controlbroadcast, "Usage: broadcast <text>\nSends a message to all users.");
39 registercontrolhelpcmd("obroadcast", NO_OPER, 1, &controlobroadcast, "Usage: obroadcast <text>\nSends a message to all IRC operators.");
40 registercontrolhelpcmd("mbroadcast", NO_OPER, 2, &controlmbroadcast, "Usage: mbroadcast <mask> <text>\nSends a message to all users matching the mask");
41 registercontrolhelpcmd("sbroadcast", NO_OPER, 2, &controlsbroadcast, "Usage: sbroadcast <mask> <text>\nSends a message to all users on specific server(s).");
42 registercontrolhelpcmd("cbroadcast", NO_OPER, 2, &controlcbroadcast, "Usage: cbroadcast <2 letter country> <text>\nSends a message to all users in the specified country (GeoIP must be loaded).");
43 }
44
45 void _fini() {
46 deregistercontrolcmd("obroadcast", controlobroadcast);
47 deregistercontrolcmd("sbroadcast", controlsbroadcast);
48 deregistercontrolcmd("mbroadcast", controlmbroadcast);
49 deregistercontrolcmd("broadcast", controlbroadcast);
50
51 deregistercontrolcmd("spew", controlspew);
52 deregistercontrolcmd("spewchan", controlspewchan);
53
54 deregistercontrolcmd("kill", controlkill);
55 deregistercontrolcmd("kick", controlkick);
56
57 deregistercontrolcmd("compare", controlcompare);
58 }
59
60 int controlkick(void *sender, int cargc, char **cargv) {
61 nick *np=(nick *)sender;
62 channel *cp;
63 nick *target;
64
65 if (cargc<2)
66 return CMD_USAGE;
67
68 if ((cp=findchannel(cargv[0]))==NULL) {
69 controlreply(np,"Couldn't find that channel.");
70 return CMD_ERROR;
71 }
72
73 if ((target=getnickbynick(cargv[1]))==NULL) {
74 controlreply(np,"Sorry, couldn't find that user");
75 return CMD_ERROR;
76 }
77
78 if(IsService(target) && SIsService(&serverlist[homeserver(target->numeric)])) {
79 controlreply(np,"Sorry, cannot kick network services.");
80 return CMD_ERROR;
81 }
82
83 controlwall(NO_OPER, NL_KICKKILLS, "%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");
84 localkickuser(NULL, cp, target, (cargc>2)?cargv[2]:"Kicked");
85 controlreply(sender, "KICK sent.");
86
87 return CMD_OK;
88 }
89
90 int controlkill(void *sender, int cargc, char **cargv) {
91 nick *target;
92 nick *np = (nick *)sender;
93
94 if (cargc<1)
95 return CMD_USAGE;
96
97 if ((target=getnickbynick(cargv[0]))==NULL) {
98 controlreply(np,"Sorry, couldn't find that user.");
99 return CMD_ERROR;
100 }
101
102 if(IsService(target) && SIsService(&serverlist[homeserver(target->numeric)])) {
103 controlreply(np,"Sorry, cannot kill network services.");
104 controlwall(NO_OPER, NL_KICKKILLS, "%s/%s attempted to KILL service %s!%s@%s (%s)", np->nick, np->authname, target->nick, target->ident, target->host->name->content, (cargc>1)?cargv[1]:"Killed");
105 return CMD_ERROR;
106 }
107
108 controlwall(NO_OPER, NL_KICKKILLS, "%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");
109 killuser(NULL, target, "%s", (cargc>1)?cargv[1]:"Killed");
110 controlreply(np, "KILL sent.");
111
112 return CMD_OK;
113 }
114
115 int controlspew(void *sender, int cargc, char **cargv) {
116 searchASTExpr tree;
117
118 if(cargc < 1)
119 return CMD_USAGE;
120
121 tree = NSASTNode(match_parse, NSASTNode(hostmask_parse), NSASTLiteral(cargv[0]));
122 return ast_nicksearch(&tree, controlreply, sender, controlnswall, printnick, NULL, NULL, 500, NULL);
123 }
124
125 int controlspewchan(void *sender, int cargc, char **cargv) {
126 searchASTExpr tree;
127
128 if(cargc < 1)
129 return CMD_USAGE;
130
131 tree = NSASTNode(match_parse, NSASTNode(name_parse), NSASTLiteral(cargv[0]));
132 return ast_chansearch(&tree, controlreply, sender, controlnswall, printchannel, NULL, NULL, 500, NULL);
133 }
134
135 int controlcompare(void *sender, int cargc, char **cargv) {
136 searchASTExpr nodes[cargc], literals[cargc], tree;
137 int i;
138 void *displayfn;
139 ASTFunc execfn;
140 parseFunc parsefn;
141
142 if(cargc < 2)
143 return CMD_USAGE;
144
145 if(cargv[0][0] == '#') {
146 execfn = (ASTFunc)ast_nicksearch;
147 displayfn = printnick;
148 parsefn = channel_parse;
149 } else {
150 execfn = (ASTFunc)ast_chansearch;
151 displayfn = printchannel;
152 parsefn = nick_parse;
153 }
154
155 for(i=0;i<cargc;i++) {
156 literals[i] = NSASTLiteral(cargv[i]);
157 nodes[i] = NSASTManualNode(parsefn, 1, &literals[i]);
158 }
159 tree = NSASTManualNode(and_parse, cargc, nodes);
160
161 return (execfn)(&tree, controlreply, sender, controlnswall, displayfn, NULL, NULL, 500, NULL);
162 }
163
164 int controlbroadcast(void *sender, int cargc, char **cargv) {
165 nick *np = (nick*)sender;
166
167 if (cargc<1)
168 return CMD_USAGE;
169
170 controlwall(NO_OPER, NL_BROADCASTS, "%s/%s sent a broadcast: %s", np->nick, np->authname, cargv[0]);
171
172 irc_send("%s O $* :(Broadcast) %s", longtonumeric(mynick->numeric,5), cargv[0]);
173
174 controlreply(np, "Message broadcasted.");
175
176 return CMD_OK;
177 }
178
179 int controlmbroadcast(void *sender, int cargc, char **cargv) {
180 nick *np = (nick*)sender;
181
182 if (cargc<2)
183 return CMD_USAGE;
184
185 controlwall(NO_OPER, NL_BROADCASTS, "%s/%s sent an mbroadcast to %s: %s", np->nick, np->authname, cargv[0], cargv[1]);
186
187 irc_send("%s O $@%s :(mBroadcast) %s", longtonumeric(mynick->numeric,5), cargv[0], cargv[1]);
188
189 controlreply(np, "Message mbroadcasted.");
190
191 return CMD_OK;
192 }
193
194 int controlsbroadcast(void *sender, int cargc, char **cargv) {
195 nick *np = (nick *)sender;
196
197 if(cargc<2)
198 return CMD_USAGE;
199
200 controlwall(NO_OPER, NL_BROADCASTS, "%s/%s sent an sbroadcast to %s: %s", np->nick, np->authname, cargv[0], cargv[1]);
201
202 irc_send("%s O $%s :(sBroadcast) %s", longtonumeric(mynick->numeric,5), cargv[0], cargv[1]);
203
204 controlreply(np, "Message sbroadcasted.");
205
206 return CMD_OK;
207 }
208
209 int controlobroadcast(void *sender, int cargc, char **cargv) {
210 nick *np = (nick *)sender;
211 searchASTExpr tree;
212 int ret;
213 char message[512];
214
215 if(cargc<1)
216 return CMD_USAGE;
217
218 snprintf(message, sizeof(message), "(oBroadcast) %s", cargv[0]);
219
220 tree = NSASTNode(and_parse, NSASTNode(modes_parse, NSASTLiteral("+o")), NSASTNode(notice_parse, NSASTLiteral(message)));
221 if((ret=ast_nicksearch(&tree, controlreply, sender, controlnswall, NULL, NULL, NULL, -1, NULL)) == CMD_OK) {
222 controlwall(NO_OPER, NL_BROADCASTS, "%s/%s sent an obroadcast: %s", np->nick, np->authname, cargv[0]);
223 controlreply(np, "Message obroadcasted.");
224 } else {
225 controlreply(np, "An error occured.");
226 }
227
228 return ret;
229 }
230
231 int controlcbroadcast(void *sender, int cargc, char **cargv) {
232 nick *np = (nick *)sender;
233 int ret;
234 searchASTExpr tree;
235 char message[512];
236
237 if(cargc < 2)
238 return CMD_USAGE;
239
240 snprintf(message, sizeof(message), "(cBroadcast) %s", cargv[1]);
241 tree = NSASTNode(and_parse, NSASTNode(country_parse, NSASTLiteral(cargv[0])), NSASTNode(notice_parse, NSASTLiteral(message)));
242 if((ret=ast_nicksearch(&tree, controlreply, sender, controlnswall, NULL, NULL, NULL, -1, NULL)) == CMD_OK) {
243 controlwall(NO_OPER, NL_BROADCASTS, "%s/%s sent a cbroadcast %s: %s", np->nick, np->authname, cargv[0], cargv[1]);
244 controlreply(np, "Message cbroadcasted.");
245 } else {
246 controlreply(np, "An error occured.");
247 }
248
249 return ret;
250 }