/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