]>
jfr.im git - irc/quakenet/newserv.git/blob - noperserv/noperserv_commands.c
8 #include "../control/control.h"
9 #include "../nick/nick.h"
10 #include "../lib/irc_string.h"
11 #include "../lib/strlfunc.h"
12 #include "../localuser/localuserchannel.h"
13 #include "../geoip/geoip.h"
15 int controlkill ( void * sender
, int cargc
, char ** cargv
);
16 int controlopchan ( void * sender
, int cargc
, char ** cargv
);
17 int controlkick ( void * sender
, int cargc
, char ** cargv
);
18 int controlspewchan ( void * sender
, int cargc
, char ** cargv
);
19 int controlspew ( void * sender
, int cargc
, char ** cargv
);
20 int controlresync ( void * sender
, int cargc
, char ** cargv
);
21 int controlbroadcast ( void * sender
, int cargc
, char ** cargv
);
22 int controlobroadcast ( void * sender
, int cargc
, char ** cargv
);
23 int controlmbroadcast ( void * sender
, int cargc
, char ** cargv
);
24 int controlsbroadcast ( void * sender
, int cargc
, char ** cargv
);
25 int controlcbroadcast ( void * sender
, int cargc
, char ** cargv
);
28 registercontrolhelpcmd ( "kill" , NO_OPER
, 2 , & controlkill
, "Usage: kill <nick> ?reason? \n Kill specified user with given reason (or 'Killed')." );
29 registercontrolhelpcmd ( "kick" , NO_OPER
, 3 , & controlkick
, "Usage: kick <channel> <user> ?reason? \n Kick a user from the given channel, with given reason (or 'Kicked')." );
31 registercontrolhelpcmd ( "spewchan" , NO_OPER
, 1 , & controlspewchan
, "Usage: spewchan <pattern> \n Shows all channels which are matched by the given pattern" );
33 /* registercontrolhelpcmd("spew", NO_OPER, 1, &controlspew, "Usage: spewchan <pattern>\nShows all userss which are matched by the given pattern"); */
35 registercontrolhelpcmd ( "resync" , NO_OPER
, 1 , & controlresync
, "Usage: resync <channel> \n Resyncs a desynched channel" );
37 registercontrolhelpcmd ( "broadcast" , NO_OPER
, 1 , & controlbroadcast
, "Usage: broadcast <text> \n Sends a message to all users." );
38 registercontrolhelpcmd ( "obroadcast" , NO_OPER
, 1 , & controlobroadcast
, "Usage: obroadcast <text> \n Sends a message to all IRC operators." );
39 registercontrolhelpcmd ( "mbroadcast" , NO_OPER
, 2 , & controlmbroadcast
, "Usage: mbroadcast <mask> <text> \n Sends a message to all users matching the mask" );
40 registercontrolhelpcmd ( "sbroadcast" , NO_OPER
, 2 , & controlsbroadcast
, "Usage: sbroadcast <mask> <text> \n Sends a message to all users on specific server(s)." );
41 registercontrolhelpcmd ( "cbroadcast" , NO_OPER
, 2 , & controlcbroadcast
, "Usage: sbroadcast <2 letter country> <text> \n Sends a message to all users in the specified country (GeoIP must be loaded) ." );
45 deregistercontrolcmd ( "obroadcast" , controlobroadcast
);
46 deregistercontrolcmd ( "sbroadcast" , controlsbroadcast
);
47 deregistercontrolcmd ( "mbroadcast" , controlmbroadcast
);
48 deregistercontrolcmd ( "broadcast" , controlbroadcast
);
50 deregistercontrolcmd ( "resync" , controlresync
);
51 /* deregistercontrolcmd("spew", controlspew); */
52 deregistercontrolcmd ( "spewchan" , controlspewchan
);
54 deregistercontrolcmd ( "kill" , controlkill
);
55 deregistercontrolcmd ( "kick" , controlkick
);
58 int controlkick ( void * sender
, int cargc
, char ** cargv
) {
59 nick
* np
=( nick
*) sender
;
66 if (( cp
= findchannel ( cargv
[ 0 ]))== NULL
) {
67 controlreply ( np
, "Couldn't find that channel." );
71 if (( target
= getnickbynick ( cargv
[ 1 ]))== NULL
) {
72 controlreply ( np
, "Sorry, couldn't find that user" );
76 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" );
77 localkickuser ( NULL
, cp
, target
, ( cargc
> 2 )? cargv
[ 2 ]: "Kicked" );
78 controlreply ( sender
, "KICK sent." );
83 /* NO checking to see if it's us or anyone important */
84 int controlkill ( void * sender
, int cargc
, char ** cargv
) {
86 nick
* np
= ( nick
*) sender
;
91 if (( target
= getnickbynick ( cargv
[ 0 ]))== NULL
) {
92 controlreply ( np
, "Sorry, couldn't find that user." );
96 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" );
97 killuser ( NULL
, target
, ( cargc
> 1 )? cargv
[ 1 ]: "Killed" );
98 controlreply ( np
, "KILL sent." );
103 int controlresync ( void * sender
, int cargc
, char ** cargv
) {
104 nick
* np
= ( nick
*) sender
;
112 cp
= findchannel ( cargv
[ 0 ]);
115 controlreply ( np
, "No such channel." );
120 controlwall ( NO_OPER
, NL_KICKS
, " %s / %s RESYNC'ed %s " , np
-> nick
, np
-> authname
, cp
-> index
-> name
-> content
);
122 irc_send ( " %s CM %s o" , mynumeric
-> content
, cp
-> index
-> name
-> content
);
124 localsetmodeinit (& changes
, cp
, mynick
);
126 for ( a
= 0 ; a
< cp
-> users
-> hashsize
; a
++) {
127 if ( cp
-> users
-> content
[ a
] != nouser
) {
128 np
= getnickbynumeric ( cp
-> users
-> content
[ a
]);
130 /* make newserv believe that this user is not opped */
131 if ( cp
-> users
-> content
[ a
] & CUMODE_OP
)
132 cp
-> users
-> content
[ a
] &= ~ CUMODE_OP
;
133 else if (! IsService ( np
)) /* if the user wasn't opped before and is not a service we don't care about him */
137 localdosetmode_nick (& changes
, np
, MC_OP
);
141 localsetmodeflush (& changes
, 1 );
143 controlreply ( np
, "Done." );
148 int controlspew ( void * sender
, int cargc
, char ** cargv
) {
149 nick
* np
= ( nick
*) sender
;
154 int controlspewchan ( void * sender
, int cargc
, char ** cargv
) {
155 nick
* np
= ( nick
*) sender
;
157 int i
, a
, ccount
= 0 , morecservices
, ucount
, cscount
;
166 for ( i
= 0 ; i
< CHANNELHASHSIZE
; i
++) {
167 for ( cip
= chantable
[ i
]; cip
; cip
= cip
-> next
) {
168 if (( cp
= cip
-> channel
) != NULL
&& match2strings ( cargv
[ 0 ], cip
-> name
-> content
)) {
169 /* find channel services */
171 cscount
= ucount
= morecservices
= 0 ;
173 for ( a
= 0 ; a
< cp
-> users
-> hashsize
; a
++) {
174 if ( cp
-> users
-> content
[ a
] != nouser
) {
175 np2
= getnickbynumeric ( cp
-> users
-> content
[ a
]);
177 if ( IsService ( np2
)) {
180 if ( strlen ( cservices
) < 100 ) {
182 strlcat ( cservices
, ", " , sizeof ( cservices
));
184 strlcat ( cservices
, np2
-> nick
, sizeof ( cservices
));
195 snprintf ( cservices
+ strlen ( cservices
), sizeof ( cservices
), " and %d more" , morecservices
);
197 snprintf ( strcscount
, sizeof ( strcscount
), " %d " , cscount
);
199 /* TODO: print this channel ;; @slug -- WTF? */
200 controlreply ( np
, "%-30s %5 ld %-8s %s%s %-11s %s%s%s " ,
203 ucount
!= 1 ? "users" : "user" ,
204 * cservices
? "- found " : "" ,
205 * cservices
? strcscount
: "" ,
206 * cservices
? ( strchr ( cservices
, ',' ) ? " chanservs" : " chanserv" ) : "" ,
207 * cservices
? "(" : "" ,
208 * cservices
? cservices
: "" ,
209 * cservices
? ")" : "" );
214 break ; /* Don't ever list more than 1000 channels */
220 controlreply ( np
, "More than 1000 matching channels were found. Please use a more specific pattern." );
222 controlreply ( np
, "Found %d channels matching specified pattern." , ccount
);
227 int controlbroadcast ( void * sender
, int cargc
, char ** cargv
) {
228 nick
* np
= ( nick
*) sender
;
233 controlwall ( NO_OPER
, NL_BROADCASTS
, " %s / %s sent a broadcast: %s " , np
-> nick
, np
-> authname
, cargv
[ 0 ]);
235 irc_send ( " %s O $* :(Broadcast) %s " , longtonumeric ( mynick
-> numeric
, 5 ), cargv
[ 0 ]);
237 controlreply ( np
, "Message broadcasted." );
242 int controlmbroadcast ( void * sender
, int cargc
, char ** cargv
) {
243 nick
* np
= ( nick
*) sender
;
248 controlwall ( NO_OPER
, NL_BROADCASTS
, " %s / %s sent an mbroadcast to %s : %s " , np
-> nick
, np
-> authname
, cargv
[ 0 ], cargv
[ 1 ]);
250 irc_send ( " %s O $@ %s :(mBroadcast) %s " , longtonumeric ( mynick
-> numeric
, 5 ), cargv
[ 0 ], cargv
[ 1 ]);
252 controlreply ( np
, "Message mbroadcasted." );
257 int controlsbroadcast ( void * sender
, int cargc
, char ** cargv
) {
258 nick
* np
= ( nick
*) sender
;
263 controlwall ( NO_OPER
, NL_BROADCASTS
, " %s / %s sent an sbroadcast to %s : %s " , np
-> nick
, np
-> authname
, cargv
[ 0 ], cargv
[ 1 ]);
265 irc_send ( " %s O $ %s :(sBroadcast) %s " , longtonumeric ( mynick
-> numeric
, 5 ), cargv
[ 0 ], cargv
[ 1 ]);
267 controlreply ( np
, "Message sbroadcasted." );
272 int controlobroadcast ( void * sender
, int cargc
, char ** cargv
) {
273 nick
* np
= ( nick
*) sender
, * nip
;
279 controlwall ( NO_OPER
, NL_BROADCASTS
, " %s / %s sent an obroadcast: %s " , np
-> nick
, np
-> authname
, cargv
[ 0 ]);
281 for ( i
= 0 ; i
< NICKHASHSIZE
; i
++)
282 for ( nip
= nicktable
[ i
]; nip
; nip
= nip
-> next
)
283 if ( nip
&& IsOper ( nip
))
284 controlnotice ( nip
, "(oBroadcast) %s " , cargv
[ 0 ]);
286 controlreply ( np
, "Message obroadcasted." );
291 const char GeoIP_country_code
[ 247 ][ 3 ] = { "--" , "AP" , "EU" , "AD" , "AE" , "AF" , "AG" , "AI" , "AL" , "AM" , "AN" , "AO" , "AQ" , "AR" , "AS" , "AT" , "AU" , "AW" , "AZ" , "BA" , "BB" , "BD" , "BE" , "BF" , "BG" , "BH" , "BI" , "BJ" , "BM" , "BN" , "BO" , "BR" , "BS" , "BT" , "BV" , "BW" , "BY" , "BZ" , "CA" , "CC" , "CD" , "CF" , "CG" , "CH" , "CI" , "CK" , "CL" , "CM" , "CN" , "CO" , "CR" , "CU" , "CV" , "CX" , "CY" , "CZ" , "DE" , "DJ" , "DK" , "DM" , "DO" , "DZ" , "EC" , "EE" , "EG" , "EH" , "ER" , "ES" , "ET" , "FI" , "FJ" , "FK" , "FM" , "FO" , "FR" , "FX" , "GA" , "GB" , "GD" , "GE" , "GF" , "GH" , "GI" , "GL" , "GM" , "GN" , "GP" , "GQ" , "GR" , "GS" , "GT" , "GU" , "GW" , "GY" , "HK" , "HM" , "HN" , "HR" , "HT" , "HU" , "ID" , "IE" , "IL" , "IN" , "IO" , "IQ" , "IR" , "IS" , "IT" , "JM" , "JO" , "JP" , "KE" , "KG" , "KH" , "KI" , "KM" , "KN" , "KP" , "KR" , "KW" , "KY" , "KZ" , "LA" , "LB" , "LC" , "LI" , "LK" , "LR" , "LS" , "LT" , "LU" , "LV" , "LY" , "MA" , "MC" , "MD" , "MG" , "MH" , "MK" , "ML" , "MM" , "MN" , "MO" , "MP" , "MQ" , "MR" , "MS" , "MT" , "MU" , "MV" , "MW" , "MX" , "MY" , "MZ" , "NA" , "NC" , "NE" , "NF" , "NG" , "NI" , "NL" , "NO" , "NP" , "NR" , "NU" , "NZ" , "OM" , "PA" , "PE" , "PF" , "PG" , "PH" , "PK" , "PL" , "PM" , "PN" , "PR" , "PS" , "PT" , "PW" , "PY" , "QA" , "RE" , "RO" , "RU" , "RW" , "SA" , "SB" , "SC" , "SD" , "SE" , "SG" , "SH" , "SI" , "SJ" , "SK" , "SL" , "SM" , "SN" , "SO" , "SR" , "ST" , "SV" , "SY" , "SZ" , "TC" , "TD" , "TF" , "TG" , "TH" , "TJ" , "TK" , "TM" , "TN" , "TO" , "TP" , "TR" , "TT" , "TV" , "TW" , "TZ" , "UA" , "UG" , "UM" , "US" , "UY" , "UZ" , "VA" , "VC" , "VE" , "VG" , "VI" , "VN" , "VU" , "WF" , "WS" , "YE" , "YT" , "YU" , "ZA" , "ZM" , "ZR" , "ZW" , "A1" , "A2" , "O1" };
293 int controlcbroadcast ( void * sender
, int cargc
, char ** cargv
) {
294 nick
* np
= ( nick
*) sender
, * nip
;
300 ext
= findnickext ( "geoip" );
302 controlreply ( np
, "Geoip module not loaded." );
304 target
= COUNTRY_MIN
- 1 ;
305 for ( i
= COUNTRY_MIN
; i
< COUNTRY_MAX
; i
++) {
306 if (! strcasecmp ( cargv
[ 0 ], GeoIP_country_code
[ i
])) {
313 controlreply ( np
, "Invalid country." );
317 controlwall ( NO_OPER
, NL_BROADCASTS
, " %s / %s sent a cbroadcast %s : %s " , np
-> nick
, np
-> authname
, cargv
[ 0 ], cargv
[ 1 ]);
319 for ( i
= 0 ; i
< NICKHASHSIZE
; i
++)
320 for ( nip
= nicktable
[ i
]; nip
; nip
= nip
-> next
)
321 if ( nip
&& (( int )(( long ) nip
-> exts
[ ext
]) == target
))
322 controlnotice ( nip
, "(cBroadcast) %s " , cargv
[ 1 ]);
324 controlreply ( np
, "Message cbroadcasted." );