# Show IRC gallery (http://irc-galleria.net, finnish only) information
# on /WHOIS or /GALLERY
# version 1.13
# for irssi 0.8.0 by Timo Sirainen
use strict;
use Symbol;
use vars qw($VERSION %IRSSI);
$VERSION = "1.13";
%IRSSI = (
authors => "Timo \'cras\' Sirainen",
contact => "tss\@iki.fi",
name => "ircgallery",
description => "Show IRC gallery (http://irc-galleria.net, finnish only) information on /WHOIS or /GALLERY",
license => "Public Domain",
url => "http://irssi.org/",
changed => "2002-03-04T22:47+0100"
);
Irssi::theme_register([
'whois_gallery', '{whois gallery $1}',
'gallery_header', '{hilight $0} - IRC gallery information',
'gallery_line', ' $[8]0 : $1',
'gallery_footer', 'End of info',
'gallery_notfound', '$0 is not in IRC gallery',
'gallery_nolist', 'Nick list of IRC gallery not downloaded yet - please wait'
]);
my $cache_path = glob "~/.irssi/ircgallery";
my @print_queue;
my $nicklist_path = "$cache_path/nicks.list";
my $gallery_nicks_time = 0;
my %gallery_nicks = {};
my $last_whois_nick;
sub get_view_url {
return 'http://irc-galleria.net/view.php?nick='.$_[0];
}
# print the gallery information - assumes the file is in cache directory
sub print_gallery {
my %print_notfound;
my $nick = shift;
my $found = 0;
my $next_channels = 0;
my $channels;
local $/ = "\n";
my $f = gensym;
if (!open($f, "<", "$cache_path/$nick")) {
Irssi::print("Couldn't open file $cache_path/$nick: $!", MSGLEVEL_CLIENTERROR);
return;
}
while (<$f>) {
last if (/\
.*Etsi nick/); # unknown nick
if ($next_channels) {
if (m,\(#.*)\,) {
$channels .= "$1 ";
next;
} else {
$next_channels = 0;
if ($channels) {
Irssi::printformat(MSGLEVEL_CRAP, 'gallery_line',
"channels", $channels);
$channels = "";
}
}
}
if (/\[^\(]*\(([^\)]*)/) {
my $realname = $1;
Irssi::printformat(MSGLEVEL_CRAP, 'gallery_header', $nick);
Irssi::printformat(MSGLEVEL_CRAP, 'gallery_line',
"ircname", $realname);
Irssi::printformat(MSGLEVEL_CRAP, 'gallery_line',
"url", get_view_url($nick));
$found = 1;
next;
}
if (/\([^:]+):\ (.*)\
,;
if ($value =~ m,\(.*)\,) {
$value = $1;
}
$next_channels = 1 if (m,\Kanavat,);
if ($title && $value) {
if ($title eq "Maili") {
$title = "e-mail";
} elsif ($title =~ /Kaupunki/) {
$title = "city";
} elsif ($title eq "Syntynyt") {
$title = "birthday";
} elsif ($title eq "Muutettu") {
$title = "last modified";
}
Irssi::printformat(MSGLEVEL_CRAP, 'gallery_line', $title, $value);
}
}
close($f);
if ($found) {
Irssi::printformat(MSGLEVEL_CRAP, 'gallery_footer', $nick);
} elsif ($print_notfound{$nick}) {
Irssi::printformat(MSGLEVEL_CRAP, 'gallery_notfound', $nick);
}
delete $print_notfound{$nick};
}
# download the info from gallery to cache dir,
# if the files aren't there already.
sub download_nicks_info {
foreach my $nick (@_) {
my $filename = "$cache_path/$nick";
if (! -f $filename) {
# FIXME: we could do this ourself with sockets...
Irssi::command("exec - wget -O$filename.tmp -q -UMozilla ".get_view_url($nick)."; mv $filename.tmp $filename");
}
}
}
# print info from all given nicks that have file in cache dir
sub gallery_show {
foreach my $nick (@_) {
if (-f "$cache_path/$nick") {
print_gallery($nick);
} else {
push @print_queue, $nick;
}
}
}
sub print_whois_gallery {
my ($server, $nick) = @_;
if ($gallery_nicks{lc $nick}) {
$server->printformat($nick, MSGLEVEL_CRAP, 'whois_gallery',
$nick, get_view_url($nick));
}
}
# /WHOIS - print the gallery URL after realname
sub event_whois {
my ($server, $data) = @_;
my ($temp, $nick) = split(" ", $data);
print_whois_gallery($server, $last_whois_nick) if ($last_whois_nick);
$last_whois_nick = $nick;
}
sub event_end_of_whois {
my ($server) = @_;
if ($last_whois_nick) {
print_whois_gallery($server, $last_whois_nick);
$last_whois_nick = undef;
}
}
# /GALLERY
sub cmd_gallery {
my @nicks = split(/[, ]/, $_[0]);
if (!$gallery_nicks_time) {
Irssi::printformat(MSGLEVEL_CLIENTERROR, 'gallery_nolist');
return;
}
my @new_list;
foreach my $nick (@nicks) {
my $gallery_nick = $gallery_nicks{lc $nick};
if (!$gallery_nick) {
Irssi::printformat(MSGLEVEL_CRAP, 'gallery_notfound', $nick);
} else {
push @new_list, $gallery_nick;
}
}
download_nicks_info(@new_list);
gallery_show(@new_list);
if ($gallery_nicks_time < time()-(3600*8)) {
# nicklist hasn't been updated for a while, refresh it
download_nicklist();
}
}
# parse all known nicks from nick index file
sub parse_nicks {
my $filename = shift;
%gallery_nicks = {};
$gallery_nicks_time = time();
my $f = gensym;
if (!open($f, "<", $filename)) {
Irssi::print("Couldn't open file $filename: $!", MSGLEVEL_CLIENTERROR);
return;
}
while (<$f>) {
if (m,\);
} else {
mkdir($cache_path, 0700) || die "Can't create cache directory $cache_path";
}
# we need the nick list, get it once per hour
download_nicklist();
Irssi::signal_add_first('event 311', 'event_whois');
Irssi::signal_add_first('event 318', 'event_end_of_whois');
Irssi::signal_add('exec remove', 'sig_exec_remove');
Irssi::command_bind('gallery', 'cmd_gallery');