]>
jfr.im git - irc/quakenet/newserv.git/blob - control/control_commands.c
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"
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
);
31 registercontrolhelpcmd ( "kill" , NO_OPER
, 2 , & controlkill
, "Usage: kill <nick> ?reason? \n Kill specified user with given reason (or 'Killed')." );
32 registercontrolhelpcmd ( "kick" , NO_OPER
, 3 , & controlkick
, "Usage: kick <channel> <user> ?reason? \n Kick a user from the given channel, with given reason (or 'Kicked')." );
34 registercontrolhelpcmd ( "spewchan" , NO_OPER
, 1 , & controlspewchan
, "Usage: spewchan <pattern> \n Shows all channels which are matched by the given pattern" );
35 registercontrolhelpcmd ( "spew" , NO_OPER
, 1 , & controlspew
, "Usage: spew <pattern> \n Shows all userss which are matched by the given pattern" );
36 registercontrolhelpcmd ( "compare" , NO_OPER
, 255 , & controlcompare
, "Usage: compare <nick1> <nick2> ... <nickn> \n Shows channels shared by supplied nicknames \n Usage: compare <channel1> <channel2> ... <channeln> \n Shares nicks that share the supplied channels" );
38 registercontrolhelpcmd ( "broadcast" , NO_OPER
, 1 , & controlbroadcast
, "Usage: broadcast <text> \n Sends a message to all users." );
39 registercontrolhelpcmd ( "obroadcast" , NO_OPER
, 1 , & controlobroadcast
, "Usage: obroadcast <text> \n Sends a message to all IRC operators." );
40 registercontrolhelpcmd ( "mbroadcast" , NO_OPER
, 2 , & controlmbroadcast
, "Usage: mbroadcast <mask> <text> \n Sends a message to all users matching the mask" );
41 registercontrolhelpcmd ( "sbroadcast" , NO_OPER
, 2 , & controlsbroadcast
, "Usage: sbroadcast <mask> <text> \n Sends a message to all users on specific server(s)." );
42 registercontrolhelpcmd ( "cbroadcast" , NO_OPER
, 2 , & controlcbroadcast
, "Usage: cbroadcast <2 letter country> <text> \n Sends a message to all users in the specified country (GeoIP must be loaded)." );
46 deregistercontrolcmd ( "obroadcast" , controlobroadcast
);
47 deregistercontrolcmd ( "sbroadcast" , controlsbroadcast
);
48 deregistercontrolcmd ( "mbroadcast" , controlmbroadcast
);
49 deregistercontrolcmd ( "broadcast" , controlbroadcast
);
51 deregistercontrolcmd ( "spew" , controlspew
);
52 deregistercontrolcmd ( "spewchan" , controlspewchan
);
54 deregistercontrolcmd ( "kill" , controlkill
);
55 deregistercontrolcmd ( "kick" , controlkick
);
57 deregistercontrolcmd ( "compare" , controlcompare
);
60 int controlkick ( void * sender
, int cargc
, char ** cargv
) {
61 nick
* np
=( nick
*) sender
;
68 if (( cp
= findchannel ( cargv
[ 0 ]))== NULL
) {
69 controlreply ( np
, "Couldn't find that channel." );
73 if (( target
= getnickbynick ( cargv
[ 1 ]))== NULL
) {
74 controlreply ( np
, "Sorry, couldn't find that user" );
78 if ( IsService ( target
) && SIsService (& serverlist
[ homeserver ( target
-> numeric
)])) {
79 controlreply ( np
, "Sorry, cannot kick network services." );
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." );
90 int controlkill ( void * sender
, int cargc
, char ** cargv
) {
92 nick
* np
= ( nick
*) sender
;
97 if (( target
= getnickbynick ( cargv
[ 0 ]))== NULL
) {
98 controlreply ( np
, "Sorry, couldn't find that user." );
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" );
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." );
115 int controlspew ( void * sender
, int cargc
, char ** cargv
) {
121 tree
= NSASTNode ( match_parse
, NSASTNode ( hostmask_parse
), NSASTLiteral ( cargv
[ 0 ]));
122 return ast_nicksearch (& tree
, controlreply
, sender
, controlnswall
, printnick
, NULL
, NULL
, 500 , NULL
);
125 int controlspewchan ( void * sender
, int cargc
, char ** cargv
) {
131 tree
= NSASTNode ( match_parse
, NSASTNode ( name_parse
), NSASTLiteral ( cargv
[ 0 ]));
132 return ast_chansearch (& tree
, controlreply
, sender
, controlnswall
, printchannel
, NULL
, NULL
, 500 , NULL
);
135 int controlcompare ( void * sender
, int cargc
, char ** cargv
) {
136 searchASTExpr nodes
[ cargc
], literals
[ cargc
], tree
;
145 if ( cargv
[ 0 ][ 0 ] == '#' ) {
146 execfn
= ( ASTFunc
) ast_nicksearch
;
147 displayfn
= printnick
;
148 parsefn
= channel_parse
;
150 execfn
= ( ASTFunc
) ast_chansearch
;
151 displayfn
= printchannel
;
152 parsefn
= nick_parse
;
155 for ( i
= 0 ; i
< cargc
; i
++) {
156 literals
[ i
] = NSASTLiteral ( cargv
[ i
]);
157 nodes
[ i
] = NSASTManualNode ( parsefn
, 1 , & literals
[ i
]);
159 tree
= NSASTManualNode ( and_parse
, cargc
, nodes
);
161 return ( execfn
)(& tree
, controlreply
, sender
, controlnswall
, displayfn
, NULL
, NULL
, 500 , NULL
);
164 int controlbroadcast ( void * sender
, int cargc
, char ** cargv
) {
165 nick
* np
= ( nick
*) sender
;
170 controlwall ( NO_OPER
, NL_BROADCASTS
, " %s / %s sent a broadcast: %s " , np
-> nick
, np
-> authname
, cargv
[ 0 ]);
172 irc_send ( " %s O $* :(Broadcast) %s " , longtonumeric ( mynick
-> numeric
, 5 ), cargv
[ 0 ]);
174 controlreply ( np
, "Message broadcasted." );
179 int controlmbroadcast ( void * sender
, int cargc
, char ** cargv
) {
180 nick
* np
= ( nick
*) sender
;
185 controlwall ( NO_OPER
, NL_BROADCASTS
, " %s / %s sent an mbroadcast to %s : %s " , np
-> nick
, np
-> authname
, cargv
[ 0 ], cargv
[ 1 ]);
187 irc_send ( " %s O $@ %s :(mBroadcast) %s " , longtonumeric ( mynick
-> numeric
, 5 ), cargv
[ 0 ], cargv
[ 1 ]);
189 controlreply ( np
, "Message mbroadcasted." );
194 int controlsbroadcast ( void * sender
, int cargc
, char ** cargv
) {
195 nick
* np
= ( nick
*) sender
;
200 controlwall ( NO_OPER
, NL_BROADCASTS
, " %s / %s sent an sbroadcast to %s : %s " , np
-> nick
, np
-> authname
, cargv
[ 0 ], cargv
[ 1 ]);
202 irc_send ( " %s O $ %s :(sBroadcast) %s " , longtonumeric ( mynick
-> numeric
, 5 ), cargv
[ 0 ], cargv
[ 1 ]);
204 controlreply ( np
, "Message sbroadcasted." );
209 int controlobroadcast ( void * sender
, int cargc
, char ** cargv
) {
210 nick
* np
= ( nick
*) sender
;
218 snprintf ( message
, sizeof ( message
), "(oBroadcast) %s " , cargv
[ 0 ]);
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." );
225 controlreply ( np
, "An error occured." );
231 int controlcbroadcast ( void * sender
, int cargc
, char ** cargv
) {
232 nick
* np
= ( nick
*) sender
;
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." );
246 controlreply ( np
, "An error occured." );