summaryrefslogtreecommitdiffstats
path: root/scripts/paste-derwan.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/paste-derwan.pl')
-rw-r--r--scripts/paste-derwan.pl184
1 files changed, 184 insertions, 0 deletions
diff --git a/scripts/paste-derwan.pl b/scripts/paste-derwan.pl
new file mode 100644
index 0000000..dd96dde
--- /dev/null
+++ b/scripts/paste-derwan.pl
@@ -0,0 +1,184 @@
+use strict;
+use Irssi;
+use vars qw($VERSION %IRSSI);
+
+$VERSION = "0.9";
+%IRSSI = (
+ 'authors' => 'Marcin Rozycki, Stanislaw Halik',
+ 'contact' => 'derwan@irssi.pl',
+ 'name' => 'paste',
+ 'description' => 'Usage: /paste [-all|-msgs|-public] [-c|-b] [-s|-l| where] [lines]',
+ 'url' => 'http://derwan.irssi.pl',
+ 'license' => 'GNU GPL v2',
+ 'changed' => 'Tue Oct 12 23:37:12 CEST 2004'
+);
+
+use Irssi::TextUI;
+use POSIX qw(strftime);
+
+# Examples:
+# /paste
+# /paste -l
+# /paste -l +9
+# /paste derwan +2,11,18-23
+# /paste derwan,#irssi -msgs -5,22,18+1 16
+# /paste -s -30
+
+Irssi::settings_add_str("misc", "paste_save_file", Irssi::get_irssi_dir() . "/paste.save");
+Irssi::settings_add_int("misc", "paste_default_level", 0);
+Irssi::settings_add_bool("misc", "paste_use_colors", 0);
+Irssi::settings_add_bool("misc", "paste_send_index", 0);
+
+my $paste_use_level = MSGLEVEL_SNOTES;
+my $paste_warning_send = 10;
+my $paste_warning_show = 60;
+
+sub paste {
+ my ($server, $window, $where, $size, $yes) = ($_[1], Irssi::active_win(), undef, undef, 0);
+ my $colorize = Irssi::settings_get_bool("paste_use_colors");
+ my $level = Irssi::settings_get_int("paste_default_level");
+ my $file = Irssi::settings_get_str("paste_save_file");
+ my @lines = ();
+ my @args = split(/ |,/, $_[0]);
+ while ($_ = shift(@args))
+ {
+ /^\d+$/ and push(@lines, $_), next;
+ /^(\+|-)\d+$/ and $_ = "1" . $_;
+ /^\d+\+\d+$/ and do {
+ my ($i, $x) = split(/\+/, $_);
+ $_ = $i . "-" . ($i+$x);
+ };
+ /^\d+-\d+$/ and do {
+ my ($i, $x) = split(/-/, $_);
+ push(@lines, $i..$x);
+ next;
+ };
+ /^-(a|all)$/ and $level = 0, next;
+ /^-(m|msgs)$/ and $level = 1, next;
+ /^-(p|public)$/ and $level = 2, next;
+ /^-c$/ and $colorize = 1, next;
+ /^-b$/ and $colorize = 0, next;
+ /^-(l|s)$/ and $where = $_, next;
+ /^-yes$/i and $yes = 1, next;
+ /^(-|\d)/ and do {
+ $window->print("Paste: Bad argument: $_", $paste_use_level);
+ return;
+ };
+ $where .= ($where) ? "," . $_ : $_;
+ };
+ if ($where !~ /^-(l|s)/) {
+ $window->print("Paste: Not connected to server", $paste_use_level), return if (!$server or !$server->{connected});
+ unless ($where) {
+ $window->print("Paste: Not joined to any channel or query window", $paste_use_level), return
+ if (!$_[2] or $_[2]->{type} !~ /^(channel|query)/i);
+ $where = $window->get_active_name();
+ };
+ } elsif ($where =~ /^-l/) {
+ $colorize = 0;
+ $size = $window->{width} - 6;
+ $size -= (length(strftime(Irssi::settings_get_str("timestamp_format"), localtime)) + 1) if (Irssi::settings_get_bool("timestamps"));
+ }elsif (!$file) {
+ $window->print("Paste: Savefile is not defined, use: /SET paste_save_file [path], to set this", $paste_use_level);
+ return;
+ };
+ my ($line, $idx_last, $cnt) = ($window->view()->{buffer}->{cur_line}, undef, 0);
+ @lines = ($where =~ /^-l/) ? (1..($window->{height})) : (1) if ($#lines < 0);
+ my @buffer = ();
+ for my $idx (sort {$a <=> $b} @lines) {
+ next if ($idx == $idx_last);
+ while ($idx) {
+ last unless ($line);
+ my $line_level = $line->{info}->{level};
+ if ($level == 0 && ($line_level & ($paste_use_level)) == 0 or
+ $level == 1 && ($line_level & (MSGLEVEL_MSGS)) != 0 or
+ $level == 2 && ($line_level & (MSGLEVEL_PUBLIC)) != 0) {
+ if (++$cnt == $idx) {
+ my $text = $line->get_text($colorize);
+ $text = substr($text, 0, ($size-1)).'$' if ($size and length($text) > $size);
+ push @buffer, [$idx, $text];
+ $idx_last = $idx;
+ undef $idx;
+ };
+
+ };
+ $line = $line->prev();
+ };
+ last unless ($line);
+ };
+ if ($#buffer < 0) {
+ $window->print("Paste: Buffer for this window in this level is empty", $paste_use_level);
+ return;
+ }elsif (!$yes and ($where !~ /^-(l|s)/ && $#buffer > $paste_warning_send or $where =~ /^-l/ && $#buffer > $paste_warning_show)) {
+ $window->print("Paste: Doing this is not a good idea. Add -YES option to command if you really mean it", $paste_use_level);
+ return;
+ };
+ if ($where =~ /^-s/) {
+ open (F, ">>", $file) or do {
+ $window->print("Paste: Cannot write savefile \"$file\"", $paste_use_level);
+ return;
+ };
+ print F "\n-- paste ".strftime("%c", localtime)." ($server->{tag})\n";
+ };
+ $_ = $where;
+ my $index_test = Irssi::settings_get_bool("paste_send_index");
+ for (my $loop = $#buffer; $loop >= 0; $loop--) {
+ /^-l/ and $window->print("%K[%n%_".sprintf("%3d", $buffer[$loop][0])."%_%K]%n $buffer[$loop][1]", $paste_use_level), next;
+ /^-s/ and do {
+ print F $buffer[$loop][1]."\n";
+ next;
+ };
+ my $text = ($index_test) ? sprintf("%03d", $buffer[$loop][0]) ." $buffer[$loop][1]" : $buffer[$loop][1];
+ $server->command("msg $where ".to_mirc($text));
+ };
+ /^-s/ and do {
+ close(F);
+ $window->print("Paste: Saved ".($#buffer + 1)." lines in \"$file\"", $paste_use_level);
+ };
+}
+
+# too_mirc()
+# Stanislaw Halik <weirdo@blindfold.no-ip.com>
+sub to_mirc ($)
+{
+ my $text = shift();
+ $text =~ s/[\004]g\//\003\002\002/g;
+ $text =~ s/[\004]\?\/+/\0030\002\002/g;
+ $text =~ s/[\004]0\//\0031\002\002/g;
+ $text =~ s/[\004]0/\0031\002\002/g;
+ $text =~ s/[\004]1\//\0032\002\002/g;
+ $text =~ s/[\004]1/\0032\002\002/g;
+ $text =~ s/[\004]2\//\0033\002\002/g;
+ $text =~ s/[\004]2/\0033\002\002/g;
+ $text =~ s/[\004]<\//\0034\002\002/g;
+ $text =~ s/[\004]</\0034\002\002/g;
+ $text =~ s/[\004]4\//\0035\002\002/g;
+ $text =~ s/[\004]4/\0035\002\002/g;
+ $text =~ s/[\004]5\//\0036\002\002/g;
+ $text =~ s/[\004]5/\0036\002\002/g;
+ $text =~ s/[\004]6\//\0037\002\002/g;
+ $text =~ s/[\004]6/\0037\002\002/g;
+ $text =~ s/[\004]>\//\0038\002\002/g;
+ $text =~ s/[\004]>/\0038\002\002/g;
+ $text =~ s/[\004]:\//\0039\002\002/g;
+ $text =~ s/[\004]:/\0039\002\002/g;
+ $text =~ s/[\004]3\//\00310\002\002/g;
+ $text =~ s/[\004]3/\00310\002\002/g;
+ $text =~ s/[\004]\;\//\00311\002\002/g;
+ $text =~ s/[\004]\;/\00311\002\002/g;
+ $text =~ s/[\004]9\//\00312\002\002/g;
+ $text =~ s/[\004]9/\00312\002\002/g;
+ $text =~ s/[\004]=\//\00313\002\002/g;
+ $text =~ s/[\004]=/\00313\002\002/g;
+ $text =~ s/[\004]8\//\00314\002\002/g;
+ $text =~ s/[\004]8/\00314\002\002/g;
+ $text =~ s/[\004]7\//\00315\002\002/g;
+ $text =~ s/[\004]7/\00315\002\002/g;
+ $text =~ s/[\004]g\//\003\002\002/g;
+ $text =~ s/[\004]g/\003\002\002/g;
+ $text =~ s/[\004]8\//\003\002\002/g;
+ $text =~ s/[\004]8/\003\002\002/g;
+ return $text;
+}
+
+Irssi::command_bind("paste", "paste");
+