summaryrefslogtreecommitdiffstats
path: root/scripts/activity_file.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/activity_file.pl')
-rw-r--r--scripts/activity_file.pl95
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');
+