html/multipaste.pl


   1 use strict;
   2 
   3 use 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 
  17 use Irssi 20020324;
  18 use vars qw(%item);
  19 
  20 sub 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 
  45 sub 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 
  72 sub 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 
 108 sub 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 
 125 sub cmd_multipaste ($$$) {
 126     my ($args, $server, $witem) = @_;
 127     return unless (%item && $item{waiting});
 128     $item{confirmed} = 1;
 129     send_item();
 130 }
 131 
 132 
 133 sub 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 
 142 Irssi::settings_add_bool($IRSSI{name}, 'multipaste_auto', 1);
 143 Irssi::settings_add_int($IRSSI{name}, 'multipaste_limit', 0);
 144 Irssi::settings_add_bool($IRSSI{name}, 'multipaste_embrace', 1);
 145 Irssi::settings_add_str($IRSSI{name}, 'multipaste_prefix', '|');
 146 Irssi::command_bind('multipaste', \&cmd_multipaste);
 147 Irssi::signal_add('send text', 'sig_send_text');
 148 Irssi::signal_add('send command', 'sig_send_command');
 149 Irssi::signal_add_first('complete word', 'sig_word_complete');
 150 
 151 print CLIENTCRAP "%B>>%n ".$IRSSI{name}." ".$VERSION." loaded";