summaryrefslogtreecommitdiffstats
path: root/scripts/act_fifo.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/act_fifo.pl')
-rw-r--r--scripts/act_fifo.pl175
1 files changed, 175 insertions, 0 deletions
diff --git a/scripts/act_fifo.pl b/scripts/act_fifo.pl
new file mode 100644
index 0000000..11ec318
--- /dev/null
+++ b/scripts/act_fifo.pl
@@ -0,0 +1,175 @@
+#
+# Prints a window activity line to a fifo
+#
+# Based on activity_file and nicklist
+#
+#
+# The script uses 3 variables:
+# act_fifo_width: How many characters wide the act list can be
+# act_fifo_path: Path to the fifo
+# act_fifo_hilight: How to hilight the "ACT" in the beginning:
+# 0: No "ACT"
+# 1: "ACT" with no color
+# 2: "ACT" with color
+# 3: " ACT " with color and added spaces
+#
+# Changes:
+# 1.1: Now also updates fifo when config or window numbers are changed.
+#
+
+use Irssi qw(
+ settings_get_int settings_get_str
+ settings_add_int settings_add_str
+ signal_add_last
+ );
+use Fcntl;
+use IO::Handle;
+use vars qw($VERSION %IRSSI);
+
+$VERSION = "1.1";
+%IRSSI =
+(
+ authors => 'Daniel Kalør (Xnybre)',
+ contact => 'irssi@kalor.dk',
+ name => 'act_fifo',
+ description => 'Print window activity to a fifo',
+ license => 'GPLv2',
+ changed => '2008-08-27'
+);
+
+
+my $last_values = {};
+
+my @colors = ("","\033[0;36;40m","\033[1;37;40m","\033[1;35;40m");
+
+sub fifo_stop
+{
+ close FIFO;
+ Irssi::print("Fifo closed.");
+}
+
+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 || $item->{data_level} == 0;
+
+ $new_values->{$tag}{$name} =
+ {
+ level => $item->{data_level},
+ window => $window->{refnum},
+ };
+
+ push @items, $new_values->{$tag}{$name};
+ }
+ }
+
+
+ print FIFO "\033[2J\033[1;1H" or fifo_stop();
+
+ my $maxw = settings_get_int('act_fifo_width');
+ my $w = 0;
+
+ if(scalar(@items) > 0)
+ {
+ my $hi = settings_get_int('act_fifo_hilight');
+ if($hi == 1)
+ {
+ print FIFO "ACT:" or fifo_stop();
+ $w += 4;
+
+ }
+ elsif($hi == 2)
+ {
+ print FIFO "\033[1;37;41mACT:\033[0m" or fifo_stop();
+ $w += 4;
+ }
+ elsif($hi > 2)
+ {
+ print FIFO "\033[1;37;41m ACT: \033[0m" or fifo_stop();
+ $w += 6;
+ }
+ }
+
+ for ( @items )
+ {
+ my $win = $_->{window};
+ my $winw = int(log($win)/log(10))+1;
+ if($winw + 2 + $w > $maxw)
+ {
+ print FIFO "\033[1;31;40mM\033[0m";
+ last;
+ }
+ print FIFO "$colors[$_->{level}] $win\033[0m" or fifo_stop();
+ $w += $winw + 1;
+ }
+
+
+ $last_values = $new_values;
+
+}
+
+settings_add_int('act_fifo','act_fifo_width',25);
+settings_add_int('act_fifo','act_fifo_hilight',2);
+settings_add_str('act_fifo', 'act_fifo_path', Irssi::get_irssi_dir . '/act_fifo');
+
+## open/create FIFO
+my $path = settings_get_str('act_fifo_path');
+unless (-p $path)
+{ # not a pipe
+ if (-e _)
+ { # but a something else
+ die "$0: $path exists and is not a pipe, please remove it\n";
+ }
+ else
+ {
+ require POSIX;
+ POSIX::mkfifo($path, 0666) or die "can\'t mkfifo $path: $!";
+ Irssi::print("Fifo created. Start reading it (\"cat $path\") and try again.");
+ return;
+ }
+}
+if (!sysopen(FIFO, $path, O_WRONLY | O_NONBLOCK))
+{ # or die "can't write $path: $!";
+ print("Couldn\'t write to the fifo ($!). Please start reading the fifo (\"cat $path\") and try again.");
+ return;
+}
+FIFO->autoflush(1);
+print FIFO "\033[2J\033[1;1H"; # erase screen & jump to 0,0
+
+# store initial status
+store_status();
+
+signal_add_last('setup changed', \&store_status);
+signal_add_last('window item activity', \&item_status_changed);
+signal_add_last('window refnum changed', \&store_status);
+