summaryrefslogtreecommitdiffstats
path: root/scripts/ircgallery.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/ircgallery.pl')
-rw-r--r--scripts/ircgallery.pl257
1 files changed, 257 insertions, 0 deletions
diff --git a/scripts/ircgallery.pl b/scripts/ircgallery.pl
new file mode 100644
index 0000000..d700210
--- /dev/null
+++ b/scripts/ircgallery.pl
@@ -0,0 +1,257 @@
+# 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 (/\<title\>.*Etsi nick/); # unknown nick
+
+ if ($next_channels) {
+ if (m,\<a .*\>(#.*)\</a>,) {
+ $channels .= "$1 ";
+ next;
+ } else {
+ $next_channels = 0;
+ if ($channels) {
+ Irssi::printformat(MSGLEVEL_CRAP, 'gallery_line',
+ "channels", $channels);
+ $channels = "";
+ }
+ }
+ }
+
+ if (/\<h1\>[^\(]*\(([^\)]*)/) {
+ 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 (/\<img.*src="([^"]*)".*alt="$nick"/) {
+ Irssi::printformat(MSGLEVEL_CRAP, 'gallery_line',
+ "image", "http://irc-galleria.net/$1");
+ next;
+ }
+
+ my ($title, $value) = $_ =~ m,\<span class="otsikko"\>([^:]+):\</span\> (.*)\<br /\>,;
+ if ($value =~ m,\<a .*\>(.*)\</a\>,) {
+ $value = $1;
+ }
+ $next_channels = 1 if (m,\<span class="otsikko"\>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 <nicks>
+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,\<a href="view.php.*\>(.*)\</a\>,) {
+ $gallery_nicks{lc $1} = $1;
+ }
+ }
+ close($f);
+}
+
+# /EXEC finished - maybe there's new files downloaded in cache dir?
+sub sig_exec_remove {
+ my @new_queue;
+
+ if (-f $nicklist_path) {
+ parse_nicks($nicklist_path);
+ unlink($nicklist_path);
+ }
+
+ foreach my $nick (@print_queue) {
+ if (-f "$cache_path/$nick") {
+ print_gallery($nick);
+ } else {
+ push @new_queue, $nick;
+ }
+ }
+ @print_queue = @new_queue;
+}
+
+sub download_nicklist {
+ Irssi::command("exec - wget -O$nicklist_path -q -UMozilla http://irc-galleria.net/list.php?letter=_");
+}
+
+# clear cache dir
+if (-d $cache_path) {
+ unlink(<$cache_path/*>);
+} 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');