html/postpone.pl


   1 # by Stefan 'tommie' Tomanek <stefan@pico.ruhr.de>
   2 #
   3 #
   4 
   5 use strict;
   6 
   7 use vars qw($VERSION %IRSSI);
   8 $VERSION = "20030208";
   9 %IRSSI = (
  10     authors     => "Stefan 'tommie' Tomanek",
  11     contact     => "stefan\@pico.ruhr.de",
  12     name        => "postpone",
  13     description => "Postpones messages sent to a splitted user and resends them when the nick rejoins",
  14     license     => "GPLv2",
  15     changed     => "$VERSION",
  16     commands     => "postpone"
  17 );
  18 
  19 use Irssi 20020324;
  20 use vars qw(%messages);
  21 
  22 sub draw_box ($$$$) {
  23     my ($title, $text, $footer, $colour) = @_;
  24     my $box = '';
  25     $box .= '%R,--[%n%9%U'.$title.'%U%9%R]%n'."\n";
  26     foreach (split(/\n/, $text)) {
  27         $box .= '%R|%n '.$_."\n";
  28     }
  29     $box .= '%R`--<%n'.$footer.'%R>->%n';
  30     $box =~ s/%.//g unless $colour;
  31     return $box;
  32 }
  33 
  34 sub show_help() {
  35     my $help="Postpone $VERSION
  36 /postpone help
  37         Display this help
  38 /postpone flush <nick>
  39         Flush postponed messages to <nick>
  40 /postpone list
  41         List postponed messages
  42 ";
  43     my $text = '';
  44     foreach (split(/\n/, $help)) {
  45         $_ =~ s/^\/(.*)$/%9\/$1%9/;
  46         $text .= $_."\n";
  47     }
  48     print CLIENTCRAP &draw_box("Postpone", $text, "help", 1);
  49 }
  50 
  51 
  52 sub event_send_text ($$$) {
  53     my ($line, $server, $witem) = @_;
  54     return unless ($witem && $witem->{type} eq "CHANNEL");
  55     if ($line =~ /^(\w+?): (.*)$/) {
  56 	my ($target, $msg) = ($1,$2);
  57 	if ($witem->nick_find($target)) {
  58 	    # Just leave me alone
  59 	    return;
  60 	} else {
  61 	    $witem->print("%B>>%n %U".$target."%U is not here, message has been postponed: \"".$line."\"", MSGLEVEL_CLIENTCRAP);
  62 	    push @{$messages{$server->{tag}}{$witem->{name}}{$target}}, $line;
  63 	    Irssi::signal_stop();
  64 	}
  65     }
  66 }
  67 
  68 sub event_message_join ($$$$) {
  69     my ($server, $channel, $nick, $address) = @_;
  70     return unless (defined $messages{$server->{tag}});
  71     return unless (defined $messages{$server->{tag}}{$channel});
  72     return unless (defined $messages{$server->{tag}}{$channel}{$nick});
  73     return unless (scalar(@{$messages{$server->{tag}}{$channel}{$nick}}) > 0);
  74     my $chan = $server->channel_find($channel);
  75     $chan->print("%B>>%n Sending postponed messages for ".$nick, MSGLEVEL_CLIENTCRAP);
  76     while (scalar(@{$messages{$server->{tag}}{$channel}{$nick}}) > 0) {
  77 	my $msg = pop @{$messages{$server->{tag}}{$channel}{$nick}};
  78 	$server->command('MSG '.$channel.' '.$msg);
  79     }
  80     
  81 }
  82 
  83 sub cmd_postpone ($$$) {
  84     my ($args, $server, $witem) = @_;
  85     my @arg = split(/ /, $args);
  86     if (scalar(@arg) < 1) {
  87 	#foo
  88     } elsif ($arg[0] eq 'flush' && defined $arg[1]) {
  89 	return unless ($witem && $witem->{type} eq "CHANNEL");
  90 	while (scalar(@{$messages{$server->{tag}}{$witem->{name}}{$arg[1]}}) > 0) {
  91 	    my $msg = pop @{$messages{$server->{tag}}{$witem->{name}}{$arg[1]}};
  92 	    $server->command('MSG '.$witem->{name}.' '.$msg);
  93 	}
  94     } elsif ($arg[0] eq 'list') {
  95 	my $text;
  96 	foreach (keys %messages) {
  97 	    $text .= $_."\n";
  98 	    foreach my $channel (keys %{$messages{$_}}) {
  99 		$text .= " %U".$channel."%U \n";
 100 		foreach my $nick (sort keys %{$messages{$_}{$channel}}) {
 101 		    $text .= ' |'.$_."\n" foreach @{$messages{$_}{$channel}{$nick}};
 102 		}
 103 	    }
 104 	}
 105 	print CLIENTCRAP &draw_box('Postpone', $text, 'messages', 1);
 106     } elsif ($arg[0] eq 'help') {
 107 	show_help();
 108     }
 109 }
 110 
 111 Irssi::command_bind('postpone', \&cmd_postpone);
 112 
 113 Irssi::signal_add('send text', \&event_send_text);
 114 Irssi::signal_add('message join', \&event_message_join);
 115 
 116 print CLIENTCRAP "%B>>%n Postpone ".$VERSION." loaded: /postpone help for help";
 117