]>
jfr.im git - irc/quakenet/newserv.git/blob - noperserv/noperserv_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 "../geoip/geoip.h"
15 #include "../lib/version.h"
16 #include "../core/modules.h"
20 int controlkill ( void * sender
, int cargc
, char ** cargv
);
21 int controlopchan ( void * sender
, int cargc
, char ** cargv
);
22 int controlkick ( void * sender
, int cargc
, char ** cargv
);
23 int controlspewchan ( void * sender
, int cargc
, char ** cargv
);
24 int controlspew ( void * sender
, int cargc
, char ** cargv
);
25 int controlresync ( void * sender
, int cargc
, char ** cargv
);
26 int controlbroadcast ( void * sender
, int cargc
, char ** cargv
);
27 int controlobroadcast ( void * sender
, int cargc
, char ** cargv
);
28 int controlmbroadcast ( void * sender
, int cargc
, char ** cargv
);
29 int controlsbroadcast ( void * sender
, int cargc
, char ** cargv
);
30 int controlcbroadcast ( void * sender
, int cargc
, char ** cargv
);
33 /* registercontrolhelpcmd("kill", NO_OPER, 2, &controlkill, "Usage: kill <nick> ?reason?\nKill specified user with given reason (or 'Killed').");*/
34 registercontrolhelpcmd ( "kick" , NO_OPER
, 3 , & controlkick
, "Usage: kick <channel> <user> ?reason? \n Kick a user from the given channel, with given reason (or 'Kicked')." );
36 registercontrolhelpcmd ( "spewchan" , NO_OPER
, 1 , & controlspewchan
, "Usage: spewchan <pattern> \n Shows all channels which are matched by the given pattern" );
38 registercontrolhelpcmd ( "spew" , NO_OPER
, 1 , & controlspew
, "Usage: spew <pattern> \n Shows all userss which are matched by the given pattern" );
40 /* doesnt seem to work for me + pointless command?(paul)
41 registercontrolhelpcmd("resync", NO_OPER, 1, &controlresync, "Usage: resync <channel>\nResyncs a desynched channel"); */
43 registercontrolhelpcmd ( "broadcast" , NO_OPER
, 1 , & controlbroadcast
, "Usage: broadcast <text> \n Sends a message to all users." );
44 registercontrolhelpcmd ( "obroadcast" , NO_OPER
, 1 , & controlobroadcast
, "Usage: obroadcast <text> \n Sends a message to all IRC operators." );
45 registercontrolhelpcmd ( "mbroadcast" , NO_OPER
, 2 , & controlmbroadcast
, "Usage: mbroadcast <mask> <text> \n Sends a message to all users matching the mask" );
46 registercontrolhelpcmd ( "sbroadcast" , NO_OPER
, 2 , & controlsbroadcast
, "Usage: sbroadcast <mask> <text> \n Sends a message to all users on specific server(s)." );
47 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)." );
51 deregistercontrolcmd ( "obroadcast" , controlobroadcast
);
52 deregistercontrolcmd ( "sbroadcast" , controlsbroadcast
);
53 deregistercontrolcmd ( "mbroadcast" , controlmbroadcast
);
54 deregistercontrolcmd ( "broadcast" , controlbroadcast
);
56 /* deregistercontrolcmd("resync", controlresync); */
57 deregistercontrolcmd ( "spew" , controlspew
);
58 deregistercontrolcmd ( "spewchan" , controlspewchan
);
60 /* deregistercontrolcmd("kill", controlkill); */
61 deregistercontrolcmd ( "kick" , controlkick
);
64 int controlkick ( void * sender
, int cargc
, char ** cargv
) {
65 nick
* np
=( nick
*) sender
;
72 if (( cp
= findchannel ( cargv
[ 0 ]))== NULL
) {
73 controlreply ( np
, "Couldn't find that channel." );
77 if (( target
= getnickbynick ( cargv
[ 1 ]))== NULL
) {
78 controlreply ( np
, "Sorry, couldn't find that user" );
82 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" );
83 localkickuser ( NULL
, cp
, target
, ( cargc
> 2 )? cargv
[ 2 ]: "Kicked" );
84 controlreply ( sender
, "KICK sent." );
89 /* NO checking to see if it's us or anyone important */
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 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" );
103 killuser ( NULL
, target
, ( cargc
> 1 )? cargv
[ 1 ]: "Killed" );
104 controlreply ( np
, "KILL sent." );
109 int controlresync ( void * sender
, int cargc
, char ** cargv
) {
110 nick
* np
= ( nick
*) sender
;
118 cp
= findchannel ( cargv
[ 0 ]);
121 controlreply ( np
, "No such channel." );
126 controlwall ( NO_OPER
, NL_MISC
, " %s / %s RESYNC'ed %s " , np
-> nick
, np
-> authname
, cp
-> index
-> name
-> content
);
128 irc_send ( " %s CM %s o" , mynumeric
-> content
, cp
-> index
-> name
-> content
);
130 localsetmodeinit (& changes
, cp
, mynick
);
132 for ( a
= 0 ; a
< cp
-> users
-> hashsize
; a
++) {
133 if ( cp
-> users
-> content
[ a
] != nouser
) {
134 nick
* np2
= getnickbynumeric ( cp
-> users
-> content
[ a
]);
136 /* make newserv believe that this user is not opped */
137 if ( cp
-> users
-> content
[ a
] & CUMODE_OP
)
138 cp
-> users
-> content
[ a
] &= ~ CUMODE_OP
;
139 else if (! IsService ( np2
)) /* if the user wasn't opped before and is not a service we don't care about him */
143 localdosetmode_nick (& changes
, np2
, MC_OP
);
147 localsetmodeflush (& changes
, 1 );
149 controlreply ( np
, "Done." );
154 int controlspew ( void * sender
, int cargc
, char ** cargv
) {
160 tree
= NSASTNode ( match_parse
, NSASTNode ( hostmask_parse
), NSASTLiteral ( cargv
[ 0 ]));
161 return ast_nicksearch ( tree
, controlreply
, sender
, controlnswall
, printnick
, NULL
, NULL
, 500 );
164 /* this function is the definition of horrible */
165 int controlspewchan ( void * sender
, int cargc
, char ** cargv
) {
166 nick
* np
= ( nick
*) sender
;
168 int i
, a
, ccount
= 0 , morecservices
, ucount
, cscount
;
177 for ( i
= 0 ; i
< CHANNELHASHSIZE
; i
++) {
178 for ( cip
= chantable
[ i
]; cip
; cip
= cip
-> next
) {
179 if (( cp
= cip
-> channel
) != NULL
&& match2strings ( cargv
[ 0 ], cip
-> name
-> content
)) {
180 /* find channel services */
182 cscount
= ucount
= morecservices
= 0 ;
184 for ( a
= 0 ; a
< cp
-> users
-> hashsize
; a
++) {
185 if ( cp
-> users
-> content
[ a
] != nouser
) {
186 np2
= getnickbynumeric ( cp
-> users
-> content
[ a
]);
188 if ( IsService ( np2
)) {
191 if ( strlen ( cservices
) < 100 ) {
193 strlcat ( cservices
, ", " , sizeof ( cservices
));
195 strlcat ( cservices
, np2
-> nick
, sizeof ( cservices
));
206 snprintf ( cservices
+ strlen ( cservices
), sizeof ( cservices
), " and %d more" , morecservices
);
208 snprintf ( strcscount
, sizeof ( strcscount
), " %d " , cscount
);
210 /* TODO: print this channel ;; @slug -- WTF? */
211 controlreply ( np
, "%-30s %5 ld %-8s %s%s %-11s %s%s%s " ,
214 ucount
!= 1 ? "users" : "user" ,
215 * cservices
? "- found " : "" ,
216 * cservices
? strcscount
: "" ,
217 * cservices
? ( strchr ( cservices
, ',' ) ? " chanservs" : " chanserv" ) : "" ,
218 * cservices
? "(" : "" ,
219 * cservices
? cservices
: "" ,
220 * cservices
? ")" : "" );
225 break ; /* Don't ever list more than 1000 channels */
231 controlreply ( np
, "More than 1000 matching channels were found. Please use a more specific pattern." );
233 controlreply ( np
, "Found %d channels matching specified pattern." , ccount
);
238 int controlbroadcast ( void * sender
, int cargc
, char ** cargv
) {
239 nick
* np
= ( nick
*) sender
;
244 controlwall ( NO_OPER
, NL_BROADCASTS
, " %s / %s sent a broadcast: %s " , np
-> nick
, np
-> authname
, cargv
[ 0 ]);
246 irc_send ( " %s O $* :(Broadcast) %s " , longtonumeric ( mynick
-> numeric
, 5 ), cargv
[ 0 ]);
248 controlreply ( np
, "Message broadcasted." );
253 int controlmbroadcast ( void * sender
, int cargc
, char ** cargv
) {
254 nick
* np
= ( nick
*) sender
;
259 controlwall ( NO_OPER
, NL_BROADCASTS
, " %s / %s sent an mbroadcast to %s : %s " , np
-> nick
, np
-> authname
, cargv
[ 0 ], cargv
[ 1 ]);
261 irc_send ( " %s O $@ %s :(mBroadcast) %s " , longtonumeric ( mynick
-> numeric
, 5 ), cargv
[ 0 ], cargv
[ 1 ]);
263 controlreply ( np
, "Message mbroadcasted." );
268 int controlsbroadcast ( void * sender
, int cargc
, char ** cargv
) {
269 nick
* np
= ( nick
*) sender
;
274 controlwall ( NO_OPER
, NL_BROADCASTS
, " %s / %s sent an sbroadcast to %s : %s " , np
-> nick
, np
-> authname
, cargv
[ 0 ], cargv
[ 1 ]);
276 irc_send ( " %s O $ %s :(sBroadcast) %s " , longtonumeric ( mynick
-> numeric
, 5 ), cargv
[ 0 ], cargv
[ 1 ]);
278 controlreply ( np
, "Message sbroadcasted." );
283 int controlobroadcast ( void * sender
, int cargc
, char ** cargv
) {
284 nick
* np
= ( nick
*) sender
, * nip
;
290 controlwall ( NO_OPER
, NL_BROADCASTS
, " %s / %s sent an obroadcast: %s " , np
-> nick
, np
-> authname
, cargv
[ 0 ]);
292 for ( i
= 0 ; i
< NICKHASHSIZE
; i
++)
293 for ( nip
= nicktable
[ i
]; nip
; nip
= nip
-> next
)
294 if ( nip
&& IsOper ( nip
))
295 controlnotice ( nip
, "(oBroadcast) %s " , cargv
[ 0 ]);
297 controlreply ( np
, "Message obroadcasted." );
302 int controlcbroadcast ( void * sender
, int cargc
, char ** cargv
) {
303 nick
* np
= ( nick
*) sender
, * nip
;
310 ext
= findnickext ( "geoip" );
312 controlreply ( np
, "Geoip module not loaded." );
316 l
= ndlsym ( "geoip" , "geoip_lookupcode" );
317 target
= l ( cargv
[ 0 ]);
320 controlreply ( np
, "Invalid country." );
324 controlwall ( NO_OPER
, NL_BROADCASTS
, " %s / %s sent a cbroadcast %s : %s " , np
-> nick
, np
-> authname
, cargv
[ 0 ], cargv
[ 1 ]);
326 for ( i
= 0 ; i
< NICKHASHSIZE
; i
++)
327 for ( nip
= nicktable
[ i
]; nip
; nip
= nip
-> next
)
328 if ( nip
&& (( int )(( long ) nip
-> exts
[ ext
]) == target
))
329 controlnotice ( nip
, "(cBroadcast) %s " , cargv
[ 1 ]);
331 controlreply ( np
, "Message cbroadcasted." );