1## mkshorterlink.pl -- Irssi interface for makeashorterlink.com
2## (C) 2002 Gergely Nagy <algernon@bonehunter.rulez.org>
3##
4## Released under the GPLv2.
5##
6## ChangeLog:
7## 0.1 -- Initial version
8## 0.2 -- Added support for ignoring URLs matching certain regexps.
9##        (Thanks to Ganneff for the idea)
10## 0.3 -- Added help messages.
11
12use Irssi qw();
13use LWP::UserAgent;
14use strict;
15use vars qw($VERSION %IRSSI);
16
17%IRSSI = (
18	  'authors'	=> 'Gergely Nagy',
19	  'contact'	=> 'algernon\@bonehunter.rulez.org',
20	  'name'	=> 'makeashorterlink.com interface',
21	  'description'	=> 'Automatically filters all http:// links through makeashorterlink.com',
22	  'license'	=> 'GPL',
23	  'url'		=> 'ftp://bonehunter.rulez.org/pub/irssi/mkshorterlink.pl',
24	  'changed'	=> '2002-12-20'
25	 );
26
27my %noshort;
28my %help = (
29	    "mkshorterlink" =>
30	      "mkshorterlink is an Irssi script that filters all " .
31	      "http:// links through makeshorterlink.com. " .
32	      "Available commands are: mkshorter, mkunshor, " .
33	      "mkununshort, and mkunshortlist.",
34
35	    "mkshort" => "MKSHORT <text>\n" .
36	      "Filters the URLs in <text> through makeashorterlink.com.",
37
38	    "mkunshort" => "MKUNSHORT <regexps>\n" .
39	      "All URLs matching any of the listed <regexps> will be " .
40	      "ignored, and not filtered through makeashorterlink.com.",
41
42	    "mkununshort" => "MKUNUNSHORT <regexp>\n" .
43	      "Reverses the effect of MKUNSHORT.",
44
45	    "mkunshortlist" => "MKUNSHORTLIST lists all the enabled regexps."
46	   );
47
48sub cmd_help {
49	my ($args, $server, $win) = @_;
50
51	my $topic = $args;
52	$topic =~s/^\s*(.*)\s+?$/$1/;
53	if (defined ($help{$topic}))
54	{
55		Irssi::signal_stop ();
56		Irssi::print ($help{$topic});
57		return;
58	}
59}
60
61sub makeshorter {
62	my $msg = $_[0];
63	my $ua = LWP::UserAgent->new (env_proxy => 1,
64				      keep_alive => 0,
65				      timeout => 10,
66				      agent => '');
67	my $response = $ua->post ("http://makeashorterlink.com/index.php",
68				  ['url' => "$msg"]);
69	if ($response->content =~ /Your shorter link is: <a href=\"([^\"]+)\"/) {
70		return $1;
71	} else {
72		return $msg;
73	}
74}
75
76sub mkshorter {
77	my $msg = $_[0];
78	my $short = 1;
79
80	foreach (keys %noshort)
81	{
82		$short = 0 if ($noshort{$_} && $msg =~ /$_/);
83	}
84
85	if ($msg =~ /(https?:\/\/[^ ]+)/ && $short)
86	{
87		my $t = $1;
88
89		if ($t =~ /([\.\?\!,] ?)$/)
90		{
91			$t=~s/$1//;
92		}
93		$msg =~ s/$t/&makeshorter($t)/e;
94	}
95	return $msg;
96}
97
98sub cmd_mkshorter {
99	my ($msg, undef, $channel) = @_;
100	my $public = 0;
101
102	if ($msg =~ /^-p */)
103	{
104		$public = 1;
105		$msg =~ s/^-p *//;
106	}
107
108	if (defined ($channel) && $channel && $public)
109	{
110		$channel->command("msg $channel->{'name'} " .
111				  mkshorter($msg));
112	} else {
113		Irssi::active_win()->printformat(MSGLEVEL_CLIENTCRAP,
114						 'mkshorterlink_crap',
115						 mkshorter ($msg));
116	}
117}
118
119sub sig_mkshorter {
120	my ($server, $msg, $nick, $address, $target) = @_;
121	$target = $nick if $target eq "";
122	$nick = $server->{'nick'} if $address eq "";
123	my $newmsg = mkshorter ($msg);
124
125	$server->window_item_find ($target)->print ("[mkshort] <$nick> " .
126						    $newmsg, MSGLEVEL_CRAP)
127	if ($newmsg ne $msg);
128}
129
130sub cmd_mkunshort {
131	my @params = split (" ", $_[0]);
132
133	foreach (@params)
134	{
135		$noshort{$_} = 1;
136	}
137}
138
139sub cmd_mkununshort {
140	my @params = split (" ", $_[0]);
141
142	foreach (@params)
143	{
144		$noshort{$_} = 0;
145	}
146}
147
148sub cmd_mkunshortlist {
149	Irssi::active_win()->printformat (MSGLEVEL_CLIENTCRAP,
150					  'mkshorterlink_crap',
151					  "URLs matching these are ignored: ");
152	foreach (keys %noshort)
153	{
154		Irssi::active_win()->printformat (MSGLEVEL_CLIENTCRAP,
155						  'mkshorterlink_crap',
156						  $_)
157		  if ($noshort{$_});
158	}
159}
160
161sub load_unshortlist {
162	my $file = Irssi::get_irssi_dir."/unshortlist";
163	my $count = 0;
164	local *CONF;
165
166	open CONF, "<", $file;
167	while (<CONF>)
168	{
169		$noshort{$_} = 1;
170		$count++;
171	}
172	close CONF;
173
174	Irssi::printformat (MSGLEVEL_CLIENTCRAP, 'mkshorterlink_crap',
175			    "Loaded $count ignore-regexps from $file.");
176}
177
178sub save_unshortlist {
179	my $file = Irssi::get_irssi_dir."/unshortlist";
180	local *CONF;
181
182	open CONF, ">", $file;
183	foreach (keys %noshort)
184	{
185		print CONF $_ if ($noshort{$_});
186	}
187	close CONF;
188
189	Irssi::printformat (MSGLEVEL_CLIENTCRAP, 'mkshorterlink_crap',
190			    "Saved ignore-regexps to $file.");
191}
192
193sub sig_setup_rered {
194	load_unshortlist ();
195}
196
197sub sig_setup_save {
198	save_unshortlist ();
199}
200
201Irssi::command_bind ('mkshorter', 'cmd_mkshorter');
202Irssi::command_bind ('mkunshort', 'cmd_mkunshort');
203Irssi::command_bind ('mkununshort', 'cmd_mkununshort');
204Irssi::command_bind ('mkunshortlist', 'cmd_mkunshortlist');
205Irssi::command_bind ('help', 'cmd_help');
206Irssi::signal_add_last ('message own_public', 'sig_mkshorter');
207Irssi::signal_add_last ('message public', 'sig_mkshorter');
208Irssi::signal_add_last ('message own_private', 'sig_mkshorter');
209Irssi::signal_add_last ('message private', 'sig_mkshorter');
210Irssi::signal_add ('setup reread', 'sig_setup_reread');
211Irssi::signal_add ('setup saved', 'sig_setup_save');
212
213Irssi::theme_register(
214		      [
215		        'mkshorterlink_crap',
216		        '{line_start}{hilight mkshorterlink:} $0'
217		      ]);
218
219load_unshortlist ();
220