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