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";