html/mkick.pl


   1 #
   2 # Usage: /MKICK [options] [mode] [mask] [reason]
   3 # Options:
   4 #	-n	normal kick
   5 #	-6	'2+4' kickmethod
   6 # Mode:
   7 #	-a	all on channel
   8 #	-o	chops
   9 #	-v	chvoices
  10 #	-d	users without op
  11 #	-l	users without op and voice
  12 # Settings.
  13 #	/SET masskick_default_reason [reason]
  14 #	/SET masskick_default_use_6method [On/Off]
  15 #
  16 
  17 use strict;
  18 use Irssi;
  19 use Irssi::Irc;
  20 use vars qw($VERSION %IRSSI);
  21 
  22 $VERSION = "0.9";
  23 %IRSSI = (
  24 	authors		=> 'Marcin Rozycki',
  25 	contact		=> 'derwan@irssi.pl',
  26 	name		=> 'mkick',
  27 	description	=> 'Masskick, usage: /mkick [-aovdln6 (hostmask)] <[:]reason>',
  28 	license		=> 'GNU GPL v2',
  29 	url		=> 'http://derwan.irssi.pl',
  30 	changed		=> 'Wed Oct  6 20:58:38 CEST 2004'
  31 );
  32 
  33 Irssi::theme_register([
  34 	'mkick_not_connected',	'Mkick: Not connected to server',
  35 	'mkick_not_chanwin',	'Mkick: Not joined to any channel',
  36 	'mkick_not_chanop',	'Mkick: You\'re not channel operator on {hilight $0}',
  37 	'mkick_syntax',		'Mkick: $0, use: /MKICK [-a|-o|-v|-d|-l] [-n|-6] (mask) [reason]',
  38 	'mkick_no_users',	'%_Mkick:%_ No users matching given criteria',
  39 	'mkick_kicklist',	'%_Mkick:%_ Send masskick for $1 users on $0: $2-'
  40 ]);
  41 
  42 sub cmd_mkick
  43 {
  44 	my ($args, $server, $witem) = @_;
  45 
  46 	Irssi::printformat(MSGLEVEL_CRAP, "mkick_not_connected"), return if (!$server or !$server->{connected});
  47 	Irssi::printformat(MSGLEVEL_CRAP, "mkick_not_chanwin"), return if (!$witem or $witem->{type} !~ /^channel$/i);
  48 	Irssi::printformat(MSGLEVEL_CRAP, "mkick_not_chanop", $witem->{name}), return if (!$witem->{chanop});
  49 
  50 	my $reason = Irssi::settings_get_str("masskick_default_reason");
  51 	my $method = Irssi::settings_get_bool("masskick_default_use_6method");
  52 	my $servernick = $server->{nick};
  53 	my $channel = $witem->{name};
  54 	my $mode = undef;
  55 	my $mask = "*!*\@*";
  56 
  57 	my @kicklist = ();
  58 	my @nicklist = ();
  59 	my @args = split(/ +/, $args);
  60 
  61 	while ($_ = shift(@args))
  62 	{
  63 		/^..*!..*@..*$/ and $mask = "$&", next;
  64 		/^-(a|o|v|d|l)$/ and s/-//, $mode = $_, next;
  65 		/^-(n|6)$/ and $method = $_ =~ s/6//, next;
  66 		/^-/ and Irssi::printformat(MSGLEVEL_CRAP, "mkick_syntax", "Unknown argument: $_"), return;
  67 		/^:/ and s/^://;
  68 		$reason = ($#args >= 0) ? $_." ".join(" ", @args) : $_;
  69 		last;
  70 	};
  71 
  72 	unless ($mode) {
  73 		Irssi::printformat(MSGLEVEL_CRAP, "mkick_syntax", "Missing argument"), return if ($mask eq '*!*@*');
  74 		$mode = "a";
  75 	};
  76 
  77 	foreach my $hash ($witem->nicks())
  78 	{
  79 		my $nick = $hash->{nick};
  80 		next if ($nick eq $servernick or !$server->mask_match_address($mask, $nick, $hash->{host}));
  81 
  82 		my $isop = $hash->{op};
  83 		my $isvoice = $hash->{voice};
  84 
  85 		if ($mode eq "a" or
  86 		    $mode eq "o" && $isop or
  87 		    $mode eq "v" && $isvoice && !$isop or
  88 		    $mode eq "d" && !$isop or
  89 		    $mode eq "l" && !$isop && !$isvoice) {
  90 			push(@kicklist, $nick);
  91 			my $mod = ($isop == 1) ? "\@" : ($isvoice == 1) ? "+" : undef;
  92 			push(@nicklist, $mod.$nick);
  93 		};
  94 	};
  95 
  96 	Irssi::printformat(MSGLEVEL_CRAP, "mkick_no_users", $mask, $mode), return if ($#kicklist < 0);
  97 	Irssi::printformat(MSGLEVEL_CRAP, "mkick_kicklist", $channel, scalar(@nicklist), @nicklist);
  98 
  99 	if ($method > 0) {
 100 		$reason = substr($reason, 0, 15) if (length($reason) > 15);
 101 		while (@kicklist) {
 102 			$server->send_raw("KICK $channel ".join(",", @kicklist[0 .. $method])." :$reason");
 103 			@kicklist = @kicklist[($method + 1)..$#kicklist];
 104 			$method = ($method == 3 && $#kicklist > 3) ? 1 : 3;
 105 		};
 106 	} else {
 107 		$server->send_raw_split("KICK $channel ".join(",", @kicklist)." :$reason", 2, $server->{max_kicks_in_cmd});
 108 	};
 109 };
 110 
 111 Irssi::settings_add_str("misc", "masskick_default_reason", "Irssi BaBy!");
 112 Irssi::settings_add_bool("misc", "masskick_default_use_6method", 0);
 113 
 114 Irssi::command_bind("mkick", "cmd_mkick");