This explains how to get desktop notifications and sound from irssi when you receive a private message, a DCC request, og someone says your nick in a channel.
Most of it was taken from:
http://jaredquinn.info/2007/09/using-irssi-with-libnotify-over-secure-shell/
I made some small modifications to get sound as well, and the settings for Xterm didn't work, but as I use urxvt anyways, I made it work for that instead.
Two scripts need to be added to your system, and you need to add a line to
~/.Xdefaults :### Script ~/.irssi/scripts/libnotify.pl ###
## Put me in ~/.irssi/scripts, and then execute the following in irssi:
##
## /load perl
## /script load libnotify
##
# Obtained from: http://jaredquinn.info/wp-content/uploads/2009/11/libnotify.pl_.txt
# Needs: http://jaredquinn.info/wp-content/uploads/2009/11/notifier.sh.txt
# See: http://jaredquinn.info/2007/09/using-irssi-with-libnotify-over-secure-shell/
# Odd Eivind Ebbesen @ 2010-11-09 12:55:51
use strict;
use Irssi;
use vars qw($VERSION %IRSSI);
$VERSION = "0.01";
%IRSSI = (
authors => 'Jared Quinn',
origauthors => 'Luke Macken, Paul W. Frields, ',
contact => 'jared@jaredquinn.info',
name => 'notify.pl',
description => 'Use libnotify to alert user to hilighted messages',
license => 'GNU General Public License',
url => 'http://jaredquinn.info/irssi',
);
Irssi::settings_add_str('notify', 'notify_icon', 'gtk-dialog-info');
Irssi::settings_add_str('notify', 'notify_time', '5000');
Irssi::settings_add_str('notify', 'notify_command', 'remote-notify-send');
sub notify {
my ($server, $summary, $message) = @_;
# Make the message entity-safe
$message =~ s/&/&/g; # That could have been done better.
$message =~ s/ $message =~ s/>/>/g;
$message =~ s/'/'/g;
print STDERR "\033[5i";
print STDERR "TYPE IRC\n";
print STDERR "ICON " . Irssi::settings_get_str('notify_icon') . "\n";
print STDERR "SHOWFOR " . Irssi::settings_get_str('notify_time') . "\n";
print STDERR "SUBJECT " . $summary . "\n";
print STDERR "CONTENT " . $message . "\n";
print STDERR "\033[4i";
}
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 = "Hilight 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');
### END Script ~/.irssi/scripts/libnotify.pl ###
### Script ~/.irssi/scripts/notifier.sh ###
#!/bin/bash
# Obtained from: http://jaredquinn.info/wp-content/uploads/2009/11/notifier.sh.txt
# Used with: http://jaredquinn.info/wp-content/uploads/2009/11/libnotify.pl_.txt
# See: http://jaredquinn.info/2007/09/using-irssi-with-libnotify-over-secure-shell/
# Added the line with canberra-gtk-play for sound.
# Odd Eivind Ebbesen @ 2010-11-09 12:58:09
cat - | {
nt_icon="gtk-dialog-info"
nt_time=5000
nt_head="Notify"
nt_text="Error Occured"
nt_type="Message"
while read k v; do
case $k in
TYPE) nt_type=$v;;
ICON) nt_icon=$v;;
CONTENT) nt_text=$v;;
TIMEOUT) nt_time=$v;;
SUBJECT) nt_head=$v;;
esac
done
notify-send -i "$nt_icon" -c "$nt_type" -t $nt_time -- "$nt_head" "$nt_text"
}
/usr/bin/canberra-gtk-play --id="message" >/dev/null 2>&1
### END Script ~/.irssi/scripts/notifier.sh ###
### Modification ~/.Xdefaults ### urxvt*print-pipe: ~/.irssi/scripts/notifier.sh ### END Modification ~/.Xdefaults ###
The above is all that is needed to make this work on a single machine. As I use several machines all the time, I've made my setup partially mirrored over machines using Dropbox and symlinks, so I have most settings for apps (like irssi), and utility scripts in the same location on all machines, and they're synced at all times.
The files/dirs involved for this setup to be perfect for me, are:
~/Dropbox/bin/oscr.sh ~/.irssi -> Dropbox/dotfiles/.irssi.odd-t500 ~/.ssh/config -> ../Dropbox/dotfiles/.ssh_config.odd-t500 ~/.Xdefaults -> Dropbox/dotfiles/.Xdefaults.odd-t500 ~/.zsh_aliases -> Dropbox/dotfiles/.zsh_aliases.odd-eeeoscr.sh is a small shell script that simplifies creation/reattaching of
screens:
### Script oscr.sh ###
#!/bin/bash
# oscr.sh ("Odds screen")
# Some wrappers for running screen quicker.
#
# Odd Eivind Ebbesen, 2010-11-08 20:16:43
sessions=$(screen -ls | tail -n +2 | head -n -2 | awk '{print $1}')
hostname=$(hostname)
cmd=
session_name=
session_default=
p_rs="-dRAa"
p_cr="-aAUOS"
for s in $sessions; do
if [[ $s =~ $hostname ]]; then
session_default="$s"
fi
if [[ -n $1 && $s =~ "$1" ]]; then
session_name="$s"
fi
done
if [[ -n $session_name ]]; then
cmd="screen $p_rs $session_name"
elif [[ -z $session_name && -n $1 ]]; then
cmd="screen $p_cr $1"
elif [[ -z $1 && -n $session_default ]]; then
cmd="screen $p_rs $session_default"
elif [[ -z $1 && -z $session_default ]]; then
cmd="screen $p_cr $hostname"
fi
$cmd
### END Script oscr.sh ###
I have setup host aliases and options in
~/.ssh/config, and in ~/.zsh_aliases I have aliased oscr="~/Dropbox/bin/oscr.sh ". This means I can now on my main machine start a screen dedicated to irssi with $oscr irssi and then $irssi inside screen (I know I could have automated even more). I then use irc, MSN & Jabber (via Minbif), and Twitter (via Twirssi) all in irssi, with popups and sound. If I detach screen, I'm automatically set as away (screen_away.pl), and I don't get any notifications (which is reversed back if I reattach). If Ithen move away (to the couch or the other side of the world, for that matter..), I just type in from my netbook:
$ssh odd-t500 and $oscr ir (oscr matches "ir" with the screen session name "irssi" set earlier), and I'm back to where I was, getting notifications and sound on my netbook instead.Happy chatting!