diff options
Diffstat (limited to 'scripts/postpone.pl')
-rw-r--r-- | scripts/postpone.pl | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/scripts/postpone.pl b/scripts/postpone.pl new file mode 100644 index 0000000..11011f2 --- /dev/null +++ b/scripts/postpone.pl @@ -0,0 +1,119 @@ +# by Stefan 'tommie' Tomanek <stefan@pico.ruhr.de> +# +# + +use strict; + +use vars qw($VERSION %IRSSI); +$VERSION = "20170204"; +%IRSSI = ( + authors => "Stefan 'tommie' Tomanek", + contact => "stefan\@pico.ruhr.de", + name => "postpone", + description => "Postpones messages sent to a splitted user and resends them when the nick rejoins", + license => "GPLv2", + changed => "$VERSION", + commands => "postpone" +); + +use Irssi 20020324; +use vars qw(%messages); + +sub draw_box ($$$$) { + my ($title, $text, $footer, $colour) = @_; + my $box = ''; + $box .= '%R,--[%n%9%U'.$title.'%U%9%R]%n'."\n"; + foreach (split(/\n/, $text)) { + $box .= '%R|%n '.$_."\n"; + } + $box .= '%R`--<%n'.$footer.'%R>->%n'; + $box =~ s/%.//g unless $colour; + return $box; +} + +sub show_help() { + my $help="Postpone $VERSION +/postpone help + Display this help +/postpone flush <nick> + Flush postponed messages to <nick> +/postpone discard <nick> + Discard postponed messages to <nick> +/postpone list + List postponed messages +"; + my $text = ''; + foreach (split(/\n/, $help)) { + $_ =~ s/^\/(.*)$/%9\/$1%9/; + $text .= $_."\n"; + } + print CLIENTCRAP &draw_box("Postpone", $text, "help", 1); +} + + +sub event_send_text ($$$) { + my ($line, $server, $witem) = @_; + return unless ($witem && $witem->{type} eq "CHANNEL"); + if ($line =~ /^(\w+?): (.*)$/) { + my ($target, $msg) = ($1,$2); + if ($witem->nick_find($target)) { + # Just leave me alone + return; + } else { + $witem->print("%B>>%n %U".$target."%U is not here, message has been postponed: \"".$line."\"", MSGLEVEL_CLIENTCRAP); + push @{$messages{$server->{tag}}{$witem->{name}}{$target}}, $line; + Irssi::signal_stop(); + } + } +} + +sub event_message_join ($$$$) { + my ($server, $channel, $nick, $address) = @_; + return unless (defined $messages{$server->{tag}}); + return unless (defined $messages{$server->{tag}}{$channel}); + return unless (defined $messages{$server->{tag}}{$channel}{$nick}); + return unless (scalar(@{$messages{$server->{tag}}{$channel}{$nick}}) > 0); + my $chan = $server->channel_find($channel); + $chan->print("%B>>%n Sending postponed messages for ".$nick, MSGLEVEL_CLIENTCRAP); + while (scalar(@{$messages{$server->{tag}}{$channel}{$nick}}) > 0) { + my $msg = pop @{$messages{$server->{tag}}{$channel}{$nick}}; + $server->command('MSG '.$channel.' '.$msg); + } + +} + +sub cmd_postpone ($$$) { + my ($args, $server, $witem) = @_; + my @arg = split(/ /, $args); + if (scalar(@arg) < 1) { + #foo + } elsif (($arg[0] eq 'discard' || $arg[0] eq 'flush') && defined $arg[1]) { + return unless ($witem && $witem->{type} eq "CHANNEL"); + while (scalar(@{$messages{$server->{tag}}{$witem->{name}}{$arg[1]}}) > 0) { + my $msg = pop @{$messages{$server->{tag}}{$witem->{name}}{$arg[1]}}; + $server->command('MSG '.$witem->{name}.' '.$msg) if $arg[0] eq 'flush'; + } + } elsif ($arg[0] eq 'list') { + my $text; + foreach (keys %messages) { + $text .= $_."\n"; + foreach my $channel (keys %{$messages{$_}}) { + $text .= " %U".$channel."%U \n"; + foreach my $nick (sort keys %{$messages{$_}{$channel}}) { + $text .= ' |'.$_."\n" foreach @{$messages{$_}{$channel}{$nick}}; + } + } + } + print CLIENTCRAP &draw_box('Postpone', $text, 'messages', 1); + } elsif ($arg[0] eq 'help') { + show_help(); + } +} + +Irssi::command_bind('postpone', \&cmd_postpone); + +Irssi::signal_add('send text', \&event_send_text); +Irssi::signal_add('message join', \&event_message_join); + +print CLIENTCRAP "%B>>%n Postpone ".$VERSION." loaded: /postpone help for help"; + |