/var/www/www.irssi.org-old/scripts/html/activity_file.pl


   1 # Maintains a representation of window activity status in a file
   2 #
   3 # Creates and updates ~/.irssi/activity_file 
   4 # The file contains a comma separated row of data for each window item:
   5 # Window refnum,Window item data_level,Window item name,Item's server tag
   6 #
   7 # Use it for example like this:
   8 # ssh me@server.org "while (egrep '^[^,]*,3' .irssi/activity_file|sed -r 's/[^,]*,[^,]*,(.*),.*/\1/'|xargs echo); do sleep 1; done" | osd_cat -l1
   9 
  10 use strict;
  11 use Irssi;
  12 use Fcntl qw(:flock);
  13 use vars qw($VERSION %IRSSI);
  14 
  15 $VERSION = "1.00";
  16 %IRSSI = (
  17     authors     => 'Antti Vähäkotamäki',
  18     name        => 'activity_file',
  19     description => 'Maintains a representation of window activity status in a file',
  20     license     => 'GNU General Public License',
  21     changed     => 'Wed Jul 19 23:59 EET 2006'
  22 );
  23 
  24 
  25 my $filename = $ENV{HOME} . '/.irssi/activity_file';
  26 my ($scriptname) = __PACKAGE__ =~ /Irssi::Script::(.+)/;
  27 my $last_values = {};
  28 
  29 sub item_status_changed {
  30     my ($item, $oldstatus) = @_;
  31     
  32     return if ! ref $item->{server};
  33 
  34     my $tag = $item->{server}{tag};
  35     my $name = $item->{name};
  36 
  37     return if ! $tag || ! $name;
  38 
  39     store_status() if ! $last_values->{$tag}{$name} ||
  40 	$last_values->{$tag}{$name}{level} != $item->{data_level};
  41 }
  42 
  43 sub store_status {
  44     my $new_values = {};
  45     my @items = ();
  46 
  47     for my $window ( sort { $a->{refnum} <=> $b->{refnum} } Irssi::windows() ) {
  48 
  49     	for my $item ( $window->items() ) {
  50 
  51             next if ! ref $item->{server};
  52 
  53             my $tag = $item->{server}{tag};
  54             my $name = $item->{name};
  55 
  56             next if ! $tag || ! $name;
  57 
  58             $new_values->{$tag}{$name} = {
  59                 tag => $tag,
  60                 name => $name,
  61                 level => $item->{data_level},
  62                 window => $window->{refnum},
  63             };
  64 
  65             push @items, $new_values->{$tag}{$name};
  66         }
  67     }
  68 
  69     if ( open F, "+>>", $filename ) {
  70 
  71         flock F, LOCK_EX;
  72         seek F, 0, 0;
  73         truncate F, 0;
  74 
  75         for ( @items ) {
  76             print F join(',', $_->{window}, $_->{level}, $_->{name}, $_->{tag});
  77             print F "\n";
  78         }
  79 
  80         close F; # buffer is flushed and lock is released on close
  81     }
  82     else {
  83         print 'Error in script '. "'$scriptname'" .': Could not open file '
  84             . $filename .' for writing!';
  85     }
  86 
  87     $last_values = $new_values;
  88 
  89 }
  90 
  91 # store initial status
  92 store_status();
  93 
  94 Irssi::signal_add_last('window item activity', 'item_status_changed');
  95