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