1use strict; 2 3use vars qw($VERSION %IRSSI); 4$VERSION = "2003120617"; 5%IRSSI = ( 6 authors => "Stefan 'tommie' Tomanek", 7 contact => "stefan\@pico.ruhr.de", 8 name => "multipaste", 9 description => "Helps pasting multiple lines to a channel", 10 license => "GPLv2", 11 url => "", 12 changed => "$VERSION", 13 modules => "", 14 commands => "multipaste" 15); 16 17use Irssi 20020324; 18use vars qw(%item); 19 20sub sig_send_text ($$$) { 21 my ($line, $server, $witem) = @_; 22 return unless (Irssi::settings_get_bool('multipaste_auto')); 23 return unless (ref $server); 24 return unless ($witem && ($witem->{type} eq 'CHANNEL' || $witem->{type} eq 'QUERY')); 25 $line =~ s/\t/ /g; 26 if (%item && $item{waiting}) { 27 %item = (); 28 } 29 if ($witem->{name} eq $item{channel} && $server->{tag} eq $item{server}) { 30 Irssi::timeout_remove($item{timeout}); 31 #Irssi::command("BIND -delete tab"); 32 my $timeout = 10; 33 chomp($line); 34 $item{text} .= $line."\n"; 35 $item{timeout} = Irssi::timeout_add($timeout, \&send_item, undef); 36 Irssi::signal_stop(); 37 } else { 38 unless ($line eq '') { 39 Irssi::signal_stop(); 40 paste($line, $server, $witem); 41 } 42 } 43} 44 45sub sig_send_command ($$$) { 46 my ($line, $server, $witem) = @_; 47 return if ($line =~ /^.multipaste/); 48 return unless (Irssi::settings_get_bool('multipaste_auto')); 49 return unless (ref $witem && ($witem->{type} eq 'CHANNEL' || $witem->{type} eq 'QUERY')); 50 if (%item && $item{waiting}) { 51 %item = (); 52 return; 53 } 54 # This does not work when the first line starts with 55 return unless $item{text}; 56 $line =~ s/\t/ /g; 57 if ($witem->{name} eq $item{channel} && $server->{tag} eq $item{server}) { 58 Irssi::timeout_remove($item{timeout}); 59 #Irssi::command("BIND -delete tab"); 60 my $timeout = 10; 61 chomp($line); 62 $item{text} .= $line."\n"; 63 $item{timeout} = Irssi::timeout_add($timeout, \&send_item, undef); 64 Irssi::signal_stop(); 65 } else { 66 Irssi::signal_stop(); 67 paste($line, $server, $witem); 68 } 69} 70 71 72sub send_item { 73 my $limit = Irssi::settings_get_int('multipaste_limit'); 74 my $server = Irssi::server_find_tag($item{server}); 75 my $channel = $server->window_item_find($item{channel}); 76 my $lines = scalar( split(/\n/, $item{text}) ); 77 if ($limit > 0 && $lines > $limit) { 78 unless ($item{confirmed}) { 79 $channel->print('%B>>%n Do you want to paste '.$lines.' lines? Enter "/multipaste" to proceed', MSGLEVEL_CLIENTCRAP); 80 $item{waiting} = 1; 81 Irssi::timeout_remove($item{timeout}); 82 return; 83 } 84 } 85 my $prefix = Irssi::settings_get_str('multipaste_prefix'); 86 my $prefix2 = ''; 87 $prefix = $item{prefix}.': '.$prefix if $item{prefix}; 88 $prefix2 = $item{prefix}.': ' if $item{prefix}; 89 if (scalar( split(/\n/, $item{text}) ) > 1) { 90 #Irssi::command("BIND tab word_completion"); 91 my $embrace = Irssi::settings_get_bool('multipaste_embrace'); 92 $server->command('MSG -- '.$channel->{name}.' '.$prefix2.',--8<-') if $embrace; 93 foreach (split(/\n/, $item{text})) { 94 $server->command('MSG -- '.$channel->{name}.' '.$prefix.$_); 95 } 96 $server->command('MSG -- '.$channel->{name}.' '.$prefix2.'`-->8-') if $embrace; 97 } else { 98 my $text = join("", split(/\n/, $item{text})); 99 my $prefix = $item{prefix} ? $item{prefix}.': ' : ''; 100 unless ($prefix.$text eq "\n") { 101 $server->command('MSG -- '.$channel->{name}.' '.$prefix.$text); 102 } 103 } 104 Irssi::timeout_remove($item{timeout}); 105 %item = (); 106} 107 108sub paste ($$$) { 109 my ($args, $server, $witem) = @_; 110 return unless ref $witem; 111 return if (%item); 112 chomp($args); 113 my $timeout = 10; 114 if ($args =~ /^(.+?): (.*)/ && $witem->{type} eq 'CHANNEL' && $witem->nick_find($1)) { 115 $item{prefix} = $1; 116 $item{text} .= $2."\n"; 117 } else { 118 $item{text} .= $args."\n"; 119 } 120 $item{server} = $server->{tag}; 121 $item{channel} = $witem->{name}; 122 $item{timeout} = Irssi::timeout_add($timeout, \&send_item, undef); 123} 124 125sub cmd_multipaste ($$$) { 126 my ($args, $server, $witem) = @_; 127 return unless (%item && $item{waiting}); 128 $item{confirmed} = 1; 129 send_item(); 130} 131 132 133sub sig_word_complete ($$$$$) { 134 my ($list, $window, $word, $linestart, $want_space) = @_; 135 my $lines = scalar( split(/\n/, $item{text}) ); 136 if (%item && ( not $item{waiting} ) ) { 137 push @$list, $linestart.$word.' '; 138 Irssi::signal_stop(); 139 } 140} 141 142Irssi::settings_add_bool($IRSSI{name}, 'multipaste_auto', 1); 143Irssi::settings_add_int($IRSSI{name}, 'multipaste_limit', 0); 144Irssi::settings_add_bool($IRSSI{name}, 'multipaste_embrace', 1); 145Irssi::settings_add_str($IRSSI{name}, 'multipaste_prefix', '|'); 146Irssi::command_bind('multipaste', \&cmd_multipaste); 147Irssi::signal_add('send text', 'sig_send_text'); 148Irssi::signal_add('send command', 'sig_send_command'); 149Irssi::signal_add_first('complete word', 'sig_word_complete'); 150 151print CLIENTCRAP "%B>>%n ".$IRSSI{name}." ".$VERSION." loaded"; 152