##
## Talk To Me is an irssi script which executes a command whenever
## someone sends you a private message or mentions your name in a channel.
##
## It then stores these messages and unless you interact with irssi
## within 2 minutes, it notifies you of them.
##
## Talk To Me supports both local and remote notification.
## See SETTINGS for more information.
##
##
## See the settings further down.
##
## Put me in ~/.irssi/scripts, and then execute the following in irssi:
##
## /load perl
## /script load talktome
##
##
## SETTINGS:
##
## Notification method - local or remote
##
## 1. If irssi is running on your local computer, select 'local' here.
## 2. If irssi is running on a remote computer through e.g. SSH,
## take a look at http://www.pseudoberries.com/blog/?page_id=87
## for information on how to set up remote notification.
our $notify_method = 'local';
##
## For LOCAL notification method
#######################################
## Command to execute for every highlighted message
our $ping_cmd = 'flash-thinklight.sh';
## Command to execute if there's no activity within $notify_delay seconds.
our $notify_cmd = "notify-send -t 0";
##
## For REMOTE notification method
#######################################
## Hostname for remote notify service
our $host = 'localhost';
## Port for remote notify service
our $port = 6666;
## Command used to communicate with the remote
## notification service
our $rcmd = "nc $host $port";
##
## GLOBAL settings
#######################################
## Format for the notification. Will be passed to $notify_cmd.
## The first %s will be replaced by the target (channel/nick), the last
## with the messages. See $notify_msg_format.
our $notify_format = "%s\n%s";
## Message format.
our $notify_msg_format = "[%02d:%02d:%02d] < %s> %s";
## Delay for executing the $notify_cmd when there's no activity.
our $notify_delay = 120;
##
## END OF SETTINGS
##
use Irssi;
use IO::Handle;
use vars qw($VERSION %IRSSI);
$VERSION = '1.2';
%IRSSI = (
author => 'Johannes Jensen',
contact => 'joh@pseudoberries.com',
name => 'Talk To Me',
description => 'This script notifies you if anyone tries to talk to you',
license => 'GNU General Public License',
url => 'http://www.pseudoberries.com/blog/?page_id=87',
changed => 'Mon Aug 11 2008'
);
our $ltime = time;
our %msgqueue = ();
sub updatetime {
$ltime = time;
}
sub activity {
updatetime;
# print "Activity, clearing queue" if (keys %msgqueue > 0);
%msgqueue = ();
}
# Send messages to the remote notification daemon
# TODO: Fork so we don't block.
sub notify_remote {
# print "notify_remote!";
open(my $fh, "|-", "$rcmd");
$fh->blocking(0);
foreach (@_) {
# print "$_";
print $fh "$_\n";
}
print $fh "\n\n\n";
undef $fh;
}
# Notify user of a new message
sub ping {
if ($notify_method eq 'remote') {
notify_remote("ping");
} else {
system($ping_cmd);
}
}
# Notify user with list new messages
sub notify {
my ($msgs) = @_;
if ($notify_method eq 'remote') {
notify_remote("messages", $msgs);
} else {
my @args = split(/ /, $notify_cmd);
push (@args, $msgs);
system (@args) == 0 or print "Executing @args failed: $?";
# print "Executing @args ...";
}
}
sub event_msg {
my ($server, $data, $nick) =@_;
my ($target, $text) = $data =~ /^(\S*)\s:(.*)/;
return if $server->ignore_check($nick, $mask, $target, $text, MSGLEVEL_MSGS);
return if !$server;
my $mynick = $server->{nick};
# Event if private message or mynick mentioned in a channel
if ($target !~ /#/ || $text =~ /$mynick/) {
# Determine whether it's a valid match
return if $text =~ /[[:alpha:]]+$mynick/;
return if $text =~ /$mynick[[:alpha:]]+/;
ping();
$text =~ s/</g;
$text =~ s/>/>/g;
($sec,$min,$hour) = localtime();
$msgqueue{$target} .= "\n" if exists $msgqueue{$target};
$msgqueue{$target} .= sprintf ($notify_msg_format, $hour, $min, $sec, $nick, $text);
updatetime;
}
}
sub update {
return if keys %msgqueue == 0;
if (time - $ltime > $notify_delay) {
# $notify_delay seconds since any activity, show notificiation
my $msgs = '';
foreach (keys %msgqueue) {
$msgs .= "\n" if length $msgs > 0;
$msgs .= sprintf ($notify_format, $_, $msgqueue{$_});
}
notify($msgs);
# clear message queue
activity;
}
}
Irssi::signal_add('event privmsg', 'event_msg');
Irssi::signal_add('gui key pressed', 'activity');
Irssi::timeout_add(1000, 'update', 0);