diff options
Diffstat (limited to 'scripts/activity_file.pl')
| -rw-r--r-- | scripts/activity_file.pl | 95 | 
1 files changed, 95 insertions, 0 deletions
| diff --git a/scripts/activity_file.pl b/scripts/activity_file.pl new file mode 100644 index 0000000..e963ce6 --- /dev/null +++ b/scripts/activity_file.pl @@ -0,0 +1,95 @@ +# Maintains a representation of window activity status in a file +# +# Creates and updates ~/.irssi/activity_file  +# The file contains a comma separated row of data for each window item: +# Window refnum,Window item data_level,Window item name,Item's server tag +# +# Use it for example like this: +# ssh me@server.org "while (egrep '^[^,]*,3' .irssi/activity_file|sed -r 's/[^,]*,[^,]*,(.*),.*/\1/'|xargs echo); do sleep 1; done" | osd_cat -l1 + +use strict; +use Irssi; +use Fcntl qw(:flock); +use vars qw($VERSION %IRSSI); + +$VERSION = "1.00"; +%IRSSI = ( +    authors     => 'Antti Vähäkotamäki', +    name        => 'activity_file', +    description => 'Maintains a representation of window activity status in a file', +    license     => 'GNU General Public License', +    changed     => 'Wed Jul 19 23:59 EET 2006' +); + + +my $filename = $ENV{HOME} . '/.irssi/activity_file'; +my ($scriptname) = __PACKAGE__ =~ /Irssi::Script::(.+)/; +my $last_values = {}; + +sub item_status_changed { +    my ($item, $oldstatus) = @_; +     +    return if ! ref $item->{server}; + +    my $tag = $item->{server}{tag}; +    my $name = $item->{name}; + +    return if ! $tag || ! $name; + +    store_status() if ! $last_values->{$tag}{$name} || +	$last_values->{$tag}{$name}{level} != $item->{data_level}; +} + +sub store_status { +    my $new_values = {}; +    my @items = (); + +    for my $window ( sort { $a->{refnum} <=> $b->{refnum} } Irssi::windows() ) { + +    	for my $item ( $window->items() ) { + +            next if ! ref $item->{server}; + +            my $tag = $item->{server}{tag}; +            my $name = $item->{name}; + +            next if ! $tag || ! $name; + +            $new_values->{$tag}{$name} = { +                tag => $tag, +                name => $name, +                level => $item->{data_level}, +                window => $window->{refnum}, +            }; + +            push @items, $new_values->{$tag}{$name}; +        } +    } + +    if ( open F, "+>>", $filename ) { + +        flock F, LOCK_EX; +        seek F, 0, 0; +        truncate F, 0; + +        for ( @items ) { +            print F join(',', $_->{window}, $_->{level}, $_->{name}, $_->{tag}); +            print F "\n"; +        } + +        close F; # buffer is flushed and lock is released on close +    } +    else { +        print 'Error in script '. "'$scriptname'" .': Could not open file ' +            . $filename .' for writing!'; +    } + +    $last_values = $new_values; + +} + +# store initial status +store_status(); + +Irssi::signal_add_last('window item activity', 'item_status_changed'); + | 
