html/deliciousurl.pl


   1 ########################################################################################################
   2 ##
   3 ## Log URL's and post them to del.icio.us
   4 ##
   5 ########################################################################################################
   6 
   7 BEGIN { $ENV{HARNESS_ACTIVE} = 1 }
   8 
   9 use IO::Handle;
  10 use Irssi;
  11 use Irssi::Irc;
  12 use Net::Delicious;
  13 use URI::Find::Rule;
  14 use POSIX;
  15 use Log::Dispatch;
  16 use Log::Dispatch::File;
  17 
  18 use vars qw($VERSION %IRSSI $FINDER $WARNING_PRINTED);
  19 
  20 $VERSION = "0.5";
  21 %IRSSI = (
  22 	authors => "Benjamin Reed",
  23 	contact => 'ranger@befunk.com',
  24 	name => "deliciousurl",
  25 	description => "Logs URLs and posts them to del.icio.us",
  26 	license => "GPLv2",
  27 	url => "http://ranger.befunk.com/",
  28 );
  29 
  30 # === Version History ===
  31 # 2007-01-19: version 0.5, minor logging/UI tweaks
  32 # 2005-10-25: released version 0.4
  33 # 2005-10-25: fork post_to_delicious so we don't have to wait for a response (holy crap, I
  34 #             can't believe it was broken this long without noticing!)
  35 # 2005-08-24: added channel ignore, thanks to Rev. Jeffrey Paul
  36 
  37 Irssi::settings_add_str('deliciousurl', 'delicious_username', '');
  38 Irssi::settings_add_str('deliciousurl', 'delicious_password', '');
  39 Irssi::settings_add_int('deliciousurl', 'delicious_post_privmsg', 0);
  40 Irssi::settings_add_int('deliciousurl', 'delicious_strip_trailing_slash', 1);
  41 Irssi::settings_add_str('deliciousurl', 'delicious_blacklist_regexp', '(tubgirl|goatse\.cx)');
  42 Irssi::settings_add_str('deliciousurl', 'delicious_default_tag', 'irc');
  43 Irssi::settings_add_str('deliciousurl', 'delicious_ignore_chan', '');
  44 
  45 sub post_to_delicious
  46 {
  47 	my ($channel, $data, $nick) = @_;
  48 
  49 	my $username = Irssi::settings_get_str('delicious_username');
  50 	my $password = Irssi::settings_get_str('delicious_password');
  51 
  52 	if (not defined $username or not defined $password and not $WARNING_PRINTED)
  53 	{
  54 		if (not $WARNING_PRINTED)
  55 		{
  56 			Irssi::print("username or password are not set!");
  57 			$WARNING_PRINTED++;
  58 		}
  59 		return;
  60 	}
  61 
  62 	my $pid = fork();
  63 
  64 	if ($pid) {
  65 		Irssi::pidwait_add($pid);
  66 		return;
  67 	} else {
  68 		my $blacklist = Irssi::settings_get_str('delicious_blacklist_regexp');
  69 
  70 		eval {
  71 			$data =~ /$blacklist/ and die "blacklist matched!";
  72 		};
  73 		if ($@)
  74 		{
  75 			#Irssi::print("skipped in $channel (blacklist): $data");
  76 			POSIX::_exit(0);
  77 		}
  78 
  79 		$channel =~ s/^#//;
  80 
  81 		my @igc = split(
  82 			/\s+/,
  83 			Irssi::settings_get_str('delicious_ignore_chan')
  84 			);
  85 		for (@igc) {
  86 			s/^#//;
  87 			POSIX::_exit(0) if lc($_) eq lc($channel);
  88 		}
  89 
  90 		my $del = Net::Delicious->new({
  91 			user => $username,
  92 			pswd => $password,
  93 		});
  94 
  95 		my @posts = $del->posts({ tag => Irssi::settings_get_str('delicious_default_tag') });
  96 
  97 		my ($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
  98 		$year += 1900;
  99 		$mon  += 1;
 100 
 101 		my $dt = sprintf('%04d-%02d-%02dT%02d:%02d:%02dZ', $year, $mon, $mday, $hour, $min, $sec);
 102 
 103 		my @urls = URI::Find::Rule->in($data);
 104 		POSIX::_exit(0) unless (@urls);
 105 
 106 		for my $url (@urls) {
 107 			$url = $url->[1];
 108 			$url =~ s/\/*$// if (Irssi::settings_get_int('delicious_strip_trailing_slash'));
 109 			my $tags = Irssi::settings_get_str('delicious_default_tag') . ' ' . $channel . ' ' . $nick;
 110 			#my $text = sprintf('%04d-%02d-%02d %02d:%02d:%02d <%s> %s', $year, $mon, $mday, $hour, $min, $sec, $nick, $data);
 111 			my $text = sprintf('<%s> %s', $nick, $data);
 112 
 113 			if (my ($post) = grep { $_->href eq $url } @posts)
 114 			{
 115 				my @tags = split(/\s+/, $post->tag);
 116 				if (not grep { $_ eq $channel } split(/\s+/, $post->tag))
 117 				{
 118 					$tags = $post->tag . ' ' . $channel;
 119 				}
 120 				#$text = $post->extended . "\n" . $text;
 121 			}
 122 
 123 			my $return = $del->add_post({
 124 				url => $url,
 125 				description => $url,
 126 				extended => $text,
 127 				tags => $tags,
 128 				dt => $dt,
 129 			});
 130 		}
 131 		POSIX::_exit(0);
 132 	}
 133 }
 134 
 135 sub del_public
 136 {
 137 	my ($server, $data, $nick, $mask, $target) = @_;
 138 	post_to_delicious($target, $data, $nick);
 139 }
 140 
 141 sub del_private
 142 {
 143 	my ($server, $data, $nick, $address) = @_;
 144 	if (Irssi::settings_get_int('delicious_post_privmsg') > 0)
 145 	{
 146 		post_to_delicious($server->{'nick'}, $data, $nick);
 147 	}
 148 }
 149 
 150 sub del_own
 151 {
 152 	my ($server, $data, $target) = @_;
 153 	post_to_delicious($target, $data, $server->{'nick'});
 154 }
 155 
 156 sub del_topic
 157 {
 158 	my ($server, $target, $data, $nick, $mask) = @_;
 159 	post_to_delicious($target, $data, $nick);
 160 }
 161 
 162 
 163 Irssi::signal_add_last('message public', 'del_public');
 164 Irssi::signal_add_last('message private', 'del_private');
 165 Irssi::signal_add_last('message own_public', 'del_own');
 166 Irssi::signal_add_last('message topic', 'del_topic');
 167 
 168 Irssi::print("deliciousurl $VERSION ready");