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");