diff options
| author | ailin-nemui | 2017-04-04 09:37:33 +0200 |
|---|---|---|
| committer | GitHub | 2017-04-04 09:37:33 +0200 |
| commit | 9dc91df129a675e9198d7b7583308d6f0fd35e31 (patch) | |
| tree | d6517747d6db5a3641fcf573fe2df99b069febc6 /scripts | |
| parent | 8f4129f7212ecb4a2397aaf316d590c5c425e911 (diff) | |
| parent | 7c018c5e88d5a22256a14651a7545c47d977c6a9 (diff) | |
| download | scripts.irssi.org-9dc91df129a675e9198d7b7583308d6f0fd35e31.tar.bz2 | |
Merge pull request #386 from bw1/kicks
[kicks][crit] use strict; open
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/kicks.pl | 235 |
1 files changed, 121 insertions, 114 deletions
diff --git a/scripts/kicks.pl b/scripts/kicks.pl index 9df9314..76e87ea 100644 --- a/scripts/kicks.pl +++ b/scripts/kicks.pl @@ -4,76 +4,77 @@ # - http://www.penguin-breeder.org/irssi/ #<scriptinfo> +use strict; use vars qw($VERSION %IRSSI); use Irssi 20020120; -$VERSION = "0.26"; +$VERSION = "0.27"; %IRSSI = ( - authors => "c0ffee", - contact => "c0ffee\@penguin-breeder.org", - name => "Various kick and ban commands", - description => "Enhances /k /kb and /kn with some nice options.", - license => "Public Domain", - url => "http://www.penguin-breeder.org/irssi/", - changed => "Tue Nov 14 23:19:19 CET 2006", + authors => "c0ffee", + contact => "c0ffee\@penguin-breeder.org", + name => "Various kick and ban commands", + description => "Enhances /k /kb and /kn with some nice options.", + license => "Public Domain", + url => "http://www.penguin-breeder.org/irssi/", + changed => "2017-03-31", ); #</scriptinfo> my %kickreasons = ( - default => ["random kick victim", - "no", - "are you stupid?", - "i don't like you, go away!", - "oh, fsck off", - "waste other ppls time, elsewhere", - "get out and STAY OUT", - "don't come back", - "no thanks", - "on popular demand, you are now leaving the channel", - "\$N", - "*void*", - "/part is the command you're looking for", - "this is the irssi of borg. your mIRC will be assimilated. resistance is futile.", - "Autokick! mwahahahah!" - ], - none => [""], - topic => ["\$topic"], + default => ["random kick victim", + "no", + "are you stupid?", + "i don't like you, go away!", + "oh, fsck off", + "waste other ppls time, elsewhere", + "get out and STAY OUT", + "don't come back", + "no thanks", + "on popular demand, you are now leaving the channel", + "\$N", + "*void*", + "/part is the command you're looking for", + "this is the irssi of borg. your mIRC will be assimilated. resistance is futile.", + "Autokick! mwahahahah!" + ], + none => [""], + topic => ["\$topic"], ); # fine tune the script for different chatnets -# cmdline_k regular expr that matches a correct cmdline for /k -# req_chan 0/1 whether the channel is always part of the cmdline -# num_nicks number of nicks ... (-1 = inf) -# start_with_dash 0/1 whether the normal cmdline may start with a dash -# match_chn matches channels -# match_n match nicks -# match_reason matches reasons -# default_reason reason to give as "no reason" +# cmdline_k regular expr that matches a correct cmdline for /k +# req_chan 0/1 whether the channel is always part of the cmdline +# num_nicks number of nicks ... (-1 = inf) +# start_with_dash 0/1 whether the normal cmdline may start with a dash +# match_chn matches channels +# match_n match nicks +# match_reason matches reasons +# default_reason reason to give as "no reason" my %cfg = ( - IRC => { - cmdline_k => '\s*([!#+&][^\x0\a\n\r ]*)\s+[-\[\]\\\\\`{}\w_|^\'~]+(,[-\[\]\\\\\`{}\w_|^\'~]+)*\s+\S.*', - req_chan => 0, - num_nicks => 3, # actually, /k takes more, but - # normal irc servers only take - # three in a row - start_with_dash => 1, - match_chn => '([!#+&][^\x0\a\n\r ]*)\s', - match_n => '(?:^|\s+)([-\[\]\\\\\`{}\w_|^\'~]+(?:,[-\[\]\\\\\`{}\w_|^\']+)*)', - match_reason => '^\s*[!#+&][^\x0\a\n\r ]*\s+[-\[\]\\\\\`{}\w_|^\'~]+(?:,[-\[\]\\\\\`{}\w_|^\'~]+)*\s+(\S.*)$', - default_reason => '$N' - }, - - SILC => { - cmdline_k => '\s*[^\x0-\x20\*\?,@!]+\s+[^\x0-\x20\*\?,@!]+\s+\S.*', - req_chan => 1, - num_nicks => 1, - start_with_dash => 0, - match_chn => '\s*([^\x0-\x20\*\?,@!]+)\s+[^\x0-\x20\*\?,@!]+(?:,[^\x0-\x20\*\?,@!]+)*', - match_n => '\s*(?:[^\x0-\x20\*\?,@!]+\s+)?([^\x0-\x20\*\?,@!]+(?:,[^\x0-\x20\*\?,@!]+)*)', - match_reason => '\s*[^\x0-\x20\*\?,@!]+\s+[^\x0-\x20\*\?,@!]+(?:,[^\x0-\x20\*\?,@!]+)*\s+(\S.*)', - default_reason => '$N' - } + IRC => { + cmdline_k => '\s*([!#+&][^\x0\a\n\r ]*)\s+[-\[\]\\\\\`{}\w_|^\'~]+(,[-\[\]\\\\\`{}\w_|^\'~]+)*\s+\S.*', + req_chan => 0, + num_nicks => 3, # actually, /k takes more, but + # normal irc servers only take + # three in a row + start_with_dash => 1, + match_chn => '([!#+&][^\x0\a\n\r ]*)\s', + match_n => '(?:^|\s+)([-\[\]\\\\\`{}\w_|^\'~]+(?:,[-\[\]\\\\\`{}\w_|^\']+)*)', + match_reason => '^\s*[!#+&][^\x0\a\n\r ]*\s+[-\[\]\\\\\`{}\w_|^\'~]+(?:,[-\[\]\\\\\`{}\w_|^\'~]+)*\s+(\S.*)$', + default_reason => '$N' + }, + + SILC => { + cmdline_k => '\s*[^\x0-\x20\*\?,@!]+\s+[^\x0-\x20\*\?,@!]+\s+\S.*', + req_chan => 1, + num_nicks => 1, + start_with_dash => 0, + match_chn => '\s*([^\x0-\x20\*\?,@!]+)\s+[^\x0-\x20\*\?,@!]+(?:,[^\x0-\x20\*\?,@!]+)*', + match_n => '\s*(?:[^\x0-\x20\*\?,@!]+\s+)?([^\x0-\x20\*\?,@!]+(?:,[^\x0-\x20\*\?,@!]+)*)', + match_reason => '\s*[^\x0-\x20\*\?,@!]+\s+[^\x0-\x20\*\?,@!]+(?:,[^\x0-\x20\*\?,@!]+)*\s+(\S.*)', + default_reason => '$N' + } ); sub initialize { @@ -83,51 +84,53 @@ sub initialize { my ($basedir) = $conf_file =~ /^(.*\/).*?/; if (-f $conf_file) { - open CONF, $conf_file; - - while (<CONF>) { - $line++; - - next if /^\s*#/; - - chomp; - ($key, $reasons) = /^(\S+)\s+(.+)\s*$/ or next; - - if ($reasons =~ /\`([^\s]+).*?\`/) { - $kickreasons{$key} = "$reasons"; - Irssi::print("Added executable $1 as $key..."); - next; - } - - $reasons =~ s/^"(.*)"$/$1/; - $reasons =~ s/~/$ENV{HOME}/; - $reasons =~ s/^([^\/])/$basedir$1/; - - if (-f $reasons) { - - $kickreasons{$key} = []; - - open REASON, $reasons; - - while (<REASON>) { - chomp; - push @{$kickreasons{$key}}, $_; - } - - close REASON; - Irssi::print("Loaded $reasons as $key..."); - } else { - Irssi::print("can't parse config line $line..."); - } - } - close CONF; + open CONF, '<', $conf_file; + + my $line=0; + + while (<CONF>) { + $line++; + + next if /^\s*#/; + + chomp; + my ($key, $reasons) = /^(\S+)\s+(.+)\s*$/ or next; + + if ($reasons =~ /\`([^\s]+).*?\`/) { + $kickreasons{$key} = "$reasons"; + Irssi::print("Added executable $1 as $key..."); + next; + } + + $reasons =~ s/^"(.*)"$/$1/; + $reasons =~ s/~/$ENV{HOME}/; + $reasons =~ s/^([^\/])/$basedir$1/; + + if (-f $reasons) { + + $kickreasons{$key} = []; + + open REASON, '<', $reasons; + + while (<REASON>) { + chomp; + push @{$kickreasons{$key}}, $_; + } + + close REASON; + Irssi::print("Loaded $reasons as $key..."); + } else { + Irssi::print("can't parse config line $line..."); + } + } + close CONF; } else { Irssi::print("Could not find configuration file for kicks..."); - Irssi::print("... use /set kicks_configuration <file>"); + Irssi::print("... use /set kicks_configuration <file>"); } } - + sub get_a_reason { my ($topic) = @_; @@ -147,15 +150,17 @@ sub cmd_realkick { return if not $server or not defined $cfg{$server->{chat_type}} - or not $channel - or $data =~ /^$cfg{$server->{chat_type}}{cmdline_k}$/; + or not $channel + or $data =~ /^$cfg{$server->{chat_type}}{cmdline_k}$/; Irssi::signal_stop(); # let's see whether some options where supplied - $default = Irssi::settings_get_str("default_kick_options"); + my $default = Irssi::settings_get_str("default_kick_options"); $data = "$default $data" if not $default =~ /^\s*$/; - @opts = split /\s+/, $data; + my @opts = split /\s+/, $data; + my $opt; + my $fail=0; while (($opt) = (shift @opts) =~ /^\s*-(\S+)/) { @@ -163,18 +168,18 @@ sub cmd_realkick { $data =~ s/^\s*-$opt\s+//, $reasons = lc $opt, - next if defined $kickreasons{lc $opt}; + next if defined $kickreasons{lc $opt}; last if $cfg{$server->{chat_type}}{start_with_dash}; Irssi::print("Unknown option -$opt"); - $fail = true; + $fail = 1; } return if $fail; - $chn = ""; + my $chn = ""; ($chn) = $data =~ /^$cfg{$server->{chat_type}}{match_chn}/; if ($cfg{$server->{chat_type}}{req_chan} && ($chn eq "")) { @@ -184,37 +189,39 @@ sub cmd_realkick { # do we need to add a channel? if ($chn eq "") { - Irssi::print("Not joined to any channel"), return - if $channel->{type} ne "CHANNEL"; + Irssi::print("Not joined to any channel"), return + if $channel->{type} ne "CHANNEL"; $chn = $channel->{name}; - $data = "$chn $data"; + $data = "$chn $data"; } # is a reason already supplied? + my $reason; $reason = get_a_reason($reasons) if not (($reason) = $data =~ /$cfg{$server->{chat_type}}{match_reason}/); $reason = $cfg{$server->{chat_type}}{default_reason} if $reason =~ /^\s*$/; - @nicks = split /,/, ($data =~ /$cfg{$server->{chat_type}}{match_n}/)[0]; - $num_nicks = $cfg{$server->{chat_type}}{num_nicks}; + my @nicks = split /,/, ($data =~ /$cfg{$server->{chat_type}}{match_n}/)[0]; + my $num_nicks = $cfg{$server->{chat_type}}{num_nicks}; $num_nicks = @nicks if $num_nicks <= 0; + my @commands; undef @commands; while (@nicks) { - $tmp = ($chn ne "" ? "$chn " : "") . + my $tmp = ($chn ne "" ? "$chn " : "") . join ",", (splice @nicks,0,$num_nicks); - $tmp =~ s/([;\\\$])/\\$1/g; - push @commands, "$tmp $reason"; + $tmp =~ s/([;\\\$])/\\$1/g; + push @commands, "$tmp $reason"; } foreach (@commands) { if ($_ =~ /^$cfg{$server->{chat_type}}{cmdline_k}$/) { s/\s+$//; - $channel->command("EVAL $cmd $_") + $channel->command("EVAL $cmd $_"); } else { Irssi::print("BUG: generated invalid $cmd command: $_"); } @@ -237,7 +244,7 @@ sub cmd_kickban { Irssi::settings_add_str("misc", "default_kick_options", ""); Irssi::settings_add_str("misc", "kicks_configuration", - Irssi::get_irssi_dir() . "/kicks.conf"); + Irssi::get_irssi_dir() . "/kicks.conf"); Irssi::command_bind("kick", "cmd_kick"); Irssi::command_bind("kickban", "cmd_kickban"); |
