I was pretty happy with solution to get notifications from Irssi though it had some shortcomings.
A couple of days ago a colleague made me aware of a Perl modules written by another colleague (Anton Berezin) called IPC::Message::Minivan which, it turns out, is perfect for my notification script. Basing the notifications on Minivan combine the speed of using something like Dbus locally (instant notifications) with the convenience of my previous script (notifications over the network, able to handle multiple clients).
This setup consists of three parts: The Minivan daemon, the Irssi script and the notification script.
As always my instructions are based on Ubuntu but should work on most Linux and Unix systems.
Installing the Minivan
IPC::Message::Minivan is not yet available directly through CPAN so we need to install it manually
- Download IPC::Messaging and IPC::Message::Minivan (and unpack them).
- Install dependencies: sudo apt-get install libjson-xs-perl libregexp-common-perl
- One could use dh-make-perl but I chose to install the two modules manually
Basically run “perl Makefile.pl && sudo make install:~/devel/IPC-Messaging-0.01_12$ perl Makefile.PL
Cannot determine license info from lib/IPC/Messaging.pm
*** Module::AutoInstall version 1.03
*** Checking for Perl dependencies...
[Core Features]
- Test::More ...loaded. (0.72)
- B::Generate ...missing.
- IO::Socket::UNIX ...loaded. (1.23)
- IO::Socket::INET ...loaded. (1.31)
- Storable ...loaded. (2.18)
- Time::HiRes ...loaded. (1.9711)
- IO::Select ...loaded. (1.17)
- Module::Load::Conditional ...loaded. (0.22)
==> Auto-install the 1 mandatory module(s) from CPAN? [y] y
*** Dependencies will be installed the next time you type 'make'.
(You may need to do that as the 'root' user.)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Warning: prerequisite B::Generate 0 not found.
Writing Makefile for IPC::Messaging
:~/devel/IPC-Messaging-0.01_12$ sudo make install
[sudo] password for alj:
/usr/bin/perl "-Iinc" Makefile.PL --config= --installdeps=B::Generate,0
Cannot determine license info from lib/IPC/Messaging.pm
*** Installing dependencies...
[MSG] No '/home/alj/.cpanplus/custom-sources' dir, skipping custom sources
[MSG] No '/home/alj/.cpanplus/custom-sources' dir, skipping custom sources
[MSG] No '/home/alj/.cpanplus/custom-sources' dir, skipping custom sources
*** Installing B::Generate...
Running [/usr/bin/perl /usr/bin/cpanp-run-perl /home/alj/.cpanplus/5.10.0/build/B-Generate-1.26/Makefile.PL INSTALLDIRS=site]...
# running Build.PL installdirs=site
/usr/bin/perl Build.PL installdirs=site
Creating custom builder _build/lib/My/Builder.pm in _build/lib/My
Checking whether your kit is complete...
Looks good
Checking prerequisites...
Looks good
Creating new 'Build' script for 'B-Generate' version '1.26'
Unknown 'build_class', defaulting to 'Module::Build'
Running [/usr/bin/make test UNINST=1]...
make[1]: Entering directory `/home/alj/.cpanplus/5.10.0/build/B-Generate-1.26'
/usr/bin/perl Build --makefile_env_macros 1 test
t/basic............ok
2/10 skipped: various reasons
t/inspect-btest....ok
t/inspect-this.....ok
t/new_cv...........ok
t/op_list..........ok
t/op_list_bgen.....ok
All tests successful, 2 subtests skipped.
Files=6, Tests=721, 0 wallclock secs ( 0.24 cusr + 0.21 csys = 0.45 CPU)
make[1]: Leaving directory `/home/alj/.cpanplus/5.10.0/build/B-Generate-1.26'
*** B::Generate successfully installed.
*** Module::AutoInstall installation finished.
cp lib/IPC/Messaging.pm blib/lib/IPC/Messaging.pm
Manifying blib/man3/IPC::Messaging.3pm
Installing /usr/local/share/perl/5.10.0/IPC/Messaging.pm
Installing /usr/local/man/man3/IPC::Messaging.3pm
Writing /usr/local/lib/perl/5.10.0/auto/IPC/Messaging/.packlist
Appending installation info to /usr/local/lib/perl/5.10.0/perllocal.pod
:~/devel/IPC-Message-Minivan-0.01_08$ perl Makefile.PL
Cannot determine license info from lib/IPC/Message/Minivan.pm
Writing Makefile for IPC::Message::Minivan
:~/devel/IPC-Message-Minivan-0.01_08$ sudo make install
cp lib/IPC/Message/Minivan.pm blib/lib/IPC/Message/Minivan.pm
cp minivan blib/script/minivan
/usr/bin/perl "-Iinc" "-MExtUtils::MY" -e "MY->fixin(shift)" blib/script/minivan
Manifying blib/man1/minivan.1p
Manifying blib/man3/IPC::Message::Minivan.3pm
Installing /usr/local/share/perl/5.10.0/IPC/Message/Minivan.pm
Installing /usr/local/man/man1/minivan.1p
Installing /usr/local/man/man3/IPC::Message::Minivan.3pm
Installing /usr/local/bin/minivan
Writing /usr/local/lib/perl/5.10.0/auto/IPC/Message/Minivan/.packlist
Appending installation info to /usr/local/lib/perl/5.10.0/perllocal.pod - Create an Upstart script for the Minivan daemon$ cat /etc/init/minivan.conf
# minivan - minimalistic message bus
#
description "minimalistic message bus"
start on runlevel [2345]
stop on runlevel [!2345]
expect fork
respawn
exec /usr/local/bin/minivan -l /var/log/minivan -d - Start the Minivan daemon$ sudo start minivan
Install the Irssi script
- Copy the script to ~/.irssi/scripts/notifier-minivan.pl (the script below is just for reference, it might not be up to date)## Put me in ~/.irssi/scripts, and then execute the following in irssi:
##
## /load perl
## /script load notifier-minivan
##
use strict;
use Irssi;
use vars qw($VERSION %IRSSI);
use HTML::Entities;
use IPC::Message::Minivan;
$VERSION = "0.01";
%IRSSI = (
authors => 'Allan Willems Joergensen',
origauthors => 'Luke Macken, Paul W. Frields, Jared Quinn, Anton Berezin, Kristoffer Larsen',
contact => 'allan@nowhere,dk',
name => 'notifier-minivan.pl',
description => 'Alert the user of new messages or hilights through IPC::Message::Minivan',
license => 'Beerware',
url => 'http://www.nowhere.dk/articles/irssi-notifications-minivan',
);
# Default settings in Irssi
Irssi::settings_add_str('notifier','minivan_host', 'localhost');
Irssi::settings_add_str('notifier','minivan_port', 6826);
Irssi::settings_add_str('notifier','minivan_channel','#irssi');
# Fetch settings from Irssi
my $minivan_host = Irssi::settings_get_str('minivan_host');
my $minivan_port = Irssi::settings_get_str('minivan_port');
my $minivan_channel = Irssi::settings_get_str('minivan_channel');
# Connect to the Minivan
our $van = IPC::Message::Minivan->new(host => $minivan_host, port => $minivan_port);
sub notify {
my ($server, $summary, $message) = @_;
# Encode certain characters using HTML
my $safemsg = HTML::Entities::encode($message, '<>&"');
# Load everyone into the minivan
$van->msg($minivan_channel, {summary => $summary, msg => $safemsg});
}
sub print_text_notify {
my ($dest, $text, $stripped) = @_;
my $server = $dest->{server};
return if (!$server || !($dest->{level} & MSGLEVEL_HILIGHT));
my $sender = $stripped;
$sender =~ s/^\<.([^\>]+)\>.+/\1/ ;
$stripped =~ s/^\<.[^\>]+\>.// ;
my $summary = "Hilite in " . $dest->{target};
notify($server, $summary, $stripped);
}
sub message_private_notify {
my ($server, $msg, $nick, $address) = @_;
return if (!$server);
notify($server, "Private message from ".$nick, $msg);
}
sub dcc_request_notify {
my ($dcc, $sendaddr) = @_;
my $server = $dcc->{server};
return if (!$dcc);
notify($server, "DCC ".$dcc->{type}." request", $dcc->{nick});
}
Irssi::signal_add('print text', 'print_text_notify');
Irssi::signal_add('message private', 'message_private_notify');
Irssi::signal_add('dcc request', 'dcc_request_notify'); - Load the script inside Irssi: /script load notifier-minivan.pl
- If your Minivan is not running on the same machine as Irssi, change the configuration inside Irssi:
/set minivan_host your_hostname – IPC::Message::Minivan is tunnel-able through ssh, see client configuration - Auto-load the script:
ln -sf ~/.irssi/scripts/notifier-minivan.pl ~/.irssi/scripts/autoload/notifier-minivan.pl
The stuff running on your local machine
It is possible to use autossh to automatically setup the tunnel but since I am always connected to my server (at least when I am in front of a computer) I chose to use normal ssh port forwarding.
In ~/.ssh/config I have
LocalForward 6826 localhost:6826
The stuff that actually shows the notifications
I did not want to bother trying to make the script error proof so I simply call the Perl script from a shell script like so
wait=0
while true
do
$HOME/bin/irssi-notify-client.pl
let wait=$wait+5
if [ $wait -ge 30 ]
then
sleep 30
else
sleep $wait
fi
done
Save the script as ~/bin/start-irssi-notify-client.sh
The notification script requires Desktop::Notify – It is available in the Ubuntu repositories but it is an old version, so let’s use a newer:
$ cpan2deb Desktop::Notify
$ sudo dpkg -i ~/.cpan/libdesktop-notify-perl*.deb
use strict;
use warnings;
use Desktop::Notify;
use IPC::Message::Minivan;
use Encode;
my $notify_timeout = 500;
my $icon = "/usr/share/pixmaps/pidgin/protocols/scalable/irc.svg";
#my $icon = "gnome-irc.png";
my $van = IPC::Message::Minivan->new(host => 'localhost');
$van->subscribe("#irssi");
our $notify = Desktop::Notify->new();
my $notification = $notify->create(summary => 'Minivan', body => 'Connection established', timeout => $notify_timeout, app_icon => $icon);
$notification->show();
while (1) {
if (my $cmd = $van->get(5,[])) {
if ($cmd->[0] eq '#irssi') {
my $c=$cmd->[1];
my $message = Encode::encode("utf-8",$c->{msg});
my $summary = $c->{summary};
$notification->summary($summary);
$notification->body($message);
$notification->show();
}
}
}
$notification->close();
Copy the script to ~/bin/irssi-notify-client.pl.
Remember to make both scripts executable.
The final thing to do is to add the notify client to your desktop environment’s autostart
In GNOME: System -> Preferences -> Startup Applications

[...] For a better solution, see this article. [...]
[...] « Irssi notifications using Desktop Notifications and Minivan [...]
[...] the rest here: Irssi notifications using Desktop Notifications and Minivan … Share and [...]