]> jfr.im git - irc/quakenet/newserv.git/blame - control/control_commands.c
Merge chanserv-live into default.
[irc/quakenet/newserv.git] / control / control_commands.c
CommitLineData
15642ba8
CP
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"
0a659cde 10#include "../newsearch/newsearch.h"
15642ba8
CP
11#include "../lib/irc_string.h"
12#include "../lib/strlfunc.h"
13#include "../localuser/localuserchannel.h"
87698d77 14#include "../lib/version.h"
4e4920a4 15#include "../core/modules.h"
87698d77 16
70b0a4e5 17MODULE_VERSION("");
15642ba8
CP
18
19int controlkill(void *sender, int cargc, char **cargv);
15642ba8
CP
20int controlkick(void *sender, int cargc, char **cargv);
21int controlspewchan(void *sender, int cargc, char **cargv);
22int controlspew(void *sender, int cargc, char **cargv);
68d05acb 23int controlcompare(void *sender, int cargc, char **cargv);
15642ba8
CP
24int controlbroadcast(void *sender, int cargc, char **cargv);
25int controlobroadcast(void *sender, int cargc, char **cargv);
26int controlmbroadcast(void *sender, int cargc, char **cargv);
27int controlsbroadcast(void *sender, int cargc, char **cargv);
28int controlcbroadcast(void *sender, int cargc, char **cargv);
29
30void _init() {
68d05acb 31 registercontrolhelpcmd("kill", NO_OPER, 2, &controlkill, "Usage: kill <nick> ?reason?\nKill specified user with given reason (or 'Killed').");
15642ba8
CP
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");
1f104af6 35 registercontrolhelpcmd("spew", NO_OPER, 1, &controlspew, "Usage: spew <pattern>\nShows all userss which are matched by the given pattern");
68d05acb 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");
15642ba8
CP
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).");
a50e1bf1 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).");
15642ba8
CP
43}
44
45void _fini() {
46 deregistercontrolcmd("obroadcast", controlobroadcast);
47 deregistercontrolcmd("sbroadcast", controlsbroadcast);
48 deregistercontrolcmd("mbroadcast", controlmbroadcast);
49 deregistercontrolcmd("broadcast", controlbroadcast);
50
0a659cde 51 deregistercontrolcmd("spew", controlspew);
15642ba8
CP
52 deregistercontrolcmd("spewchan", controlspewchan);
53
68d05acb 54 deregistercontrolcmd("kill", controlkill);
15642ba8 55 deregistercontrolcmd("kick", controlkick);
68d05acb
CP
56
57 deregistercontrolcmd("compare", controlcompare);
15642ba8
CP
58}
59
60int 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
68d05acb
CP
78 if(IsService(target) && SIsService(&serverlist[homeserver(target->numeric)])) {
79 controlreply(np,"Sorry, cannot kick network services.");
80 return CMD_ERROR;
81 }
82
a50e1bf1 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");
15642ba8
CP
84 localkickuser(NULL, cp, target, (cargc>2)?cargv[2]:"Kicked");
85 controlreply(sender, "KICK sent.");
86
87 return CMD_OK;
88}
89
15642ba8
CP
90int controlkill(void *sender, int cargc, char **cargv) {
91 nick *target;
92 nick *np = (nick *)sender;
68d05acb 93
15642ba8 94 if (cargc<1)
68d05acb 95 return CMD_USAGE;
15642ba8
CP
96
97 if ((target=getnickbynick(cargv[0]))==NULL) {
98 controlreply(np,"Sorry, couldn't find that user.");
99 return CMD_ERROR;
100 }
101
68d05acb
CP
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");
15642ba8
CP
105 return CMD_ERROR;
106 }
107
68d05acb 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");
ecdd6f2c 109 killuser(NULL, target, "%s", (cargc>1)?cargv[1]:"Killed");
68d05acb 110 controlreply(np, "KILL sent.");
15642ba8
CP
111
112 return CMD_OK;
113}
114
115int controlspew(void *sender, int cargc, char **cargv) {
68d05acb 116 searchASTExpr tree;
15642ba8 117
0a659cde
CP
118 if(cargc < 1)
119 return CMD_USAGE;
120
121 tree = NSASTNode(match_parse, NSASTNode(hostmask_parse), NSASTLiteral(cargv[0]));
4860501e 122 return ast_nicksearch(&tree, controlreply, sender, controlnswall, printnick, NULL, NULL, 500, NULL);
15642ba8
CP
123}
124
125int controlspewchan(void *sender, int cargc, char **cargv) {
68d05acb 126 searchASTExpr tree;
15642ba8 127
68d05acb 128 if(cargc < 1)
15642ba8
CP
129 return CMD_USAGE;
130
68d05acb 131 tree = NSASTNode(match_parse, NSASTNode(name_parse), NSASTLiteral(cargv[0]));
4860501e 132 return ast_chansearch(&tree, controlreply, sender, controlnswall, printchannel, NULL, NULL, 500, NULL);
68d05acb 133}
15642ba8 134
68d05acb
CP
135int 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;
15642ba8 141
68d05acb
CP
142 if(cargc < 2)
143 return CMD_USAGE;
15642ba8 144
68d05acb
CP
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);
15642ba8 160
4860501e 161 return (execfn)(&tree, controlreply, sender, controlnswall, displayfn, NULL, NULL, 500, NULL);
15642ba8
CP
162}
163
164int 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
179int 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
194int 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
209int controlobroadcast(void *sender, int cargc, char **cargv) {
68d05acb
CP
210 nick *np = (nick *)sender;
211 searchASTExpr tree;
212 int ret;
213 char message[512];
214
15642ba8
CP
215 if(cargc<1)
216 return CMD_USAGE;
217
68d05acb 218 snprintf(message, sizeof(message), "(oBroadcast) %s", cargv[0]);
15642ba8 219
68d05acb 220 tree = NSASTNode(and_parse, NSASTNode(modes_parse, NSASTLiteral("+o")), NSASTNode(notice_parse, NSASTLiteral(message)));
4860501e 221 if((ret=ast_nicksearch(&tree, controlreply, sender, controlnswall, NULL, NULL, NULL, -1, NULL)) == CMD_OK) {
68d05acb
CP
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 }
15642ba8 227
68d05acb 228 return ret;
15642ba8
CP
229}
230
15642ba8 231int controlcbroadcast(void *sender, int cargc, char **cargv) {
68d05acb
CP
232 nick *np = (nick *)sender;
233 int ret;
234 searchASTExpr tree;
235 char message[512];
236
15642ba8
CP
237 if(cargc < 2)
238 return CMD_USAGE;
239
68d05acb
CP
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)));
4860501e 242 if((ret=ast_nicksearch(&tree, controlreply, sender, controlnswall, NULL, NULL, NULL, -1, NULL)) == CMD_OK) {
68d05acb
CP
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.");
15642ba8
CP
247 }
248
68d05acb 249 return ret;
15642ba8 250}