diff options
| author | Alexander Færøy | 2014-05-31 13:10:46 +0200 | 
|---|---|---|
| committer | Alexander Færøy | 2014-05-31 13:10:46 +0200 | 
| commit | 2d0759e6ca5767b48bcc85bf38c2c43d5f0b63b1 (patch) | |
| tree | 1c5e6d817c88e67b46e216a50e0aef5428bf63df /scripts/multipaste.pl | |
| parent | 2d080422d79d1fd49d6c5528593ccaaff9bfc583 (diff) | |
| download | scripts.irssi.org-2d0759e6ca5767b48bcc85bf38c2c43d5f0b63b1.tar.bz2 | |
Import scripts from scripts.irssi.org
Diffstat (limited to 'scripts/multipaste.pl')
| -rw-r--r-- | scripts/multipaste.pl | 151 | 
1 files changed, 151 insertions, 0 deletions
| diff --git a/scripts/multipaste.pl b/scripts/multipaste.pl new file mode 100644 index 0000000..a4a6e5a --- /dev/null +++ b/scripts/multipaste.pl @@ -0,0 +1,151 @@ +use strict; + +use vars qw($VERSION %IRSSI); +$VERSION = "2003120617"; +%IRSSI = ( +    authors     => "Stefan 'tommie' Tomanek", +    contact     => "stefan\@pico.ruhr.de", +    name        => "multipaste", +    description => "Helps pasting multiple lines to a channel", +    license     => "GPLv2", +    url         => "", +    changed     => "$VERSION", +    modules     => "", +    commands	=> "multipaste" +); + +use Irssi 20020324; +use vars qw(%item); + +sub sig_send_text ($$$) { +    my ($line, $server, $witem) = @_; +    return unless (Irssi::settings_get_bool('multipaste_auto')); +    return unless (ref $server); +    return unless ($witem && ($witem->{type} eq 'CHANNEL' || $witem->{type} eq 'QUERY')); +    $line =~ s/\t/    /g; +    if (%item && $item{waiting}) { +	%item = (); +    } +    if ($witem->{name} eq $item{channel} && $server->{tag} eq $item{server}) { +	Irssi::timeout_remove($item{timeout}); +	#Irssi::command("BIND -delete tab"); +	my $timeout = 10; +	chomp($line); +	$item{text} .= $line."\n"; +	$item{timeout} = Irssi::timeout_add($timeout, \&send_item, undef); +	Irssi::signal_stop(); +    } else { +	unless ($line eq '') { +	    Irssi::signal_stop(); +	    paste($line, $server, $witem); +	} +    } +} + +sub sig_send_command ($$$) { +    my ($line, $server, $witem) = @_; +    return if ($line =~ /^.multipaste/); +    return unless (Irssi::settings_get_bool('multipaste_auto')); +    return unless (ref $witem && ($witem->{type} eq 'CHANNEL' || $witem->{type} eq 'QUERY')); +    if (%item && $item{waiting}) { +	%item = (); +	return; +    } +    # This does not work when the first line starts with  +    return unless $item{text}; +    $line =~ s/\t/    /g; +    if ($witem->{name} eq $item{channel} && $server->{tag} eq $item{server}) { +        Irssi::timeout_remove($item{timeout}); +	#Irssi::command("BIND -delete tab"); +        my $timeout = 10; +        chomp($line); +        $item{text} .= $line."\n"; +        $item{timeout} = Irssi::timeout_add($timeout, \&send_item, undef); +        Irssi::signal_stop(); +    } else { +        Irssi::signal_stop(); +        paste($line, $server, $witem); +    } +} + + +sub send_item { +    my $limit = Irssi::settings_get_int('multipaste_limit'); +    my $server = Irssi::server_find_tag($item{server}); +    my $channel = $server->window_item_find($item{channel}); +    my $lines = scalar( split(/\n/, $item{text}) ); +    if ($limit > 0 && $lines > $limit) { +	unless ($item{confirmed}) { +	    $channel->print('%B>>%n Do you want to paste '.$lines.' lines? Enter "/multipaste" to proceed', MSGLEVEL_CLIENTCRAP); +	    $item{waiting} = 1; +	    Irssi::timeout_remove($item{timeout}); +	    return; +	} +    } +    my $prefix = Irssi::settings_get_str('multipaste_prefix'); +    my $prefix2 = ''; +    $prefix = $item{prefix}.': '.$prefix if $item{prefix}; +    $prefix2 = $item{prefix}.': ' if $item{prefix}; +    if (scalar( split(/\n/, $item{text}) ) > 1) { +	#Irssi::command("BIND tab word_completion"); +	my $embrace = Irssi::settings_get_bool('multipaste_embrace'); +	$server->command('MSG -- '.$channel->{name}.' '.$prefix2.',--8<-') if $embrace; +	foreach (split(/\n/, $item{text})) { +	    $server->command('MSG -- '.$channel->{name}.' '.$prefix.$_); +	} +	$server->command('MSG -- '.$channel->{name}.' '.$prefix2.'`-->8-') if $embrace; +    } else { +	my $text = join("", split(/\n/, $item{text})); +	my $prefix = $item{prefix} ? $item{prefix}.': ' : ''; +	unless ($prefix.$text eq "\n") { +	    $server->command('MSG -- '.$channel->{name}.' '.$prefix.$text); +	} +    } +    Irssi::timeout_remove($item{timeout}); +    %item = (); +} + +sub paste ($$$) { +    my ($args, $server, $witem) = @_; +    return unless ref $witem; +    return if (%item); +    chomp($args); +    my $timeout = 10; +    if ($args =~ /^(.+?): (.*)/ && $witem->{type} eq 'CHANNEL' && $witem->nick_find($1)) { +	$item{prefix} = $1; +	$item{text} .= $2."\n"; +    } else { +	$item{text} .= $args."\n"; +    } +    $item{server} = $server->{tag}; +    $item{channel} = $witem->{name}; +    $item{timeout} = Irssi::timeout_add($timeout, \&send_item, undef); +} + +sub cmd_multipaste ($$$) { +    my ($args, $server, $witem) = @_; +    return unless (%item && $item{waiting}); +    $item{confirmed} = 1; +    send_item(); +} + + +sub sig_word_complete ($$$$$) { +    my ($list, $window, $word, $linestart, $want_space) = @_; +    my $lines = scalar( split(/\n/, $item{text}) ); +    if (%item && ( not $item{waiting} ) ) { +	push @$list, $linestart.$word.'    '; +	Irssi::signal_stop(); +    } +} + +Irssi::settings_add_bool($IRSSI{name}, 'multipaste_auto', 1); +Irssi::settings_add_int($IRSSI{name}, 'multipaste_limit', 0); +Irssi::settings_add_bool($IRSSI{name}, 'multipaste_embrace', 1); +Irssi::settings_add_str($IRSSI{name}, 'multipaste_prefix', '|'); +Irssi::command_bind('multipaste', \&cmd_multipaste); +Irssi::signal_add('send text', 'sig_send_text'); +Irssi::signal_add('send command', 'sig_send_command'); +Irssi::signal_add_first('complete word', 'sig_word_complete'); + +print CLIENTCRAP "%B>>%n ".$IRSSI{name}." ".$VERSION." loaded"; | 
