diff options
| author | Alexander Færøy | 2014-05-31 13:10:46 +0200 | 
|---|---|---|
| committer | Alexander Færøy | 2014-05-31 13:10:46 +0200 | 
| commit | 2d0759e6ca5767b48bcc85bf38c2c43d5f0b63b1 (patch) | |
| tree | 1c5e6d817c88e67b46e216a50e0aef5428bf63df /scripts/openurl.pl | |
| parent | 2d080422d79d1fd49d6c5528593ccaaff9bfc583 (diff) | |
| download | scripts.irssi.org-2d0759e6ca5767b48bcc85bf38c2c43d5f0b63b1.tar.bz2 | |
Import scripts from scripts.irssi.org
Diffstat (limited to 'scripts/openurl.pl')
| -rw-r--r-- | scripts/openurl.pl | 269 | 
1 files changed, 269 insertions, 0 deletions
| diff --git a/scripts/openurl.pl b/scripts/openurl.pl new file mode 100644 index 0000000..066a5f4 --- /dev/null +++ b/scripts/openurl.pl @@ -0,0 +1,269 @@ +# OpenURL by Stefan'tommie' Tomanek +# +# 05.06.2002 +# * complete rewrite + +use strict; + +use vars qw($VERSION %IRSSI); +$VERSION = "20030208"; +%IRSSI = ( +    authors     => "Stefan 'tommie' Tomanek", +    contact     => "stefan\@pico.ruhr.de", +    name        => "OpenURL", +    description => "Stores URLs in a list and launches mail, web or ftp software", +    license     => "GPLv2", +    url         => "http://scripts.irssi.org", +    changed     => "$VERSION", +    commands	=> "openurl" +); + +use Irssi 20020324; +use Irssi::TextUI; +use Irssi::UI; + +use vars qw(@urls %urltypes $recent); +$recent = 1; + +# RegExp & defaultcommands +%urltypes = ( http => { regexp => qr#((?:https?://[^\s<>"]+|www\.[-a-z0-9.]+)[^\s.,;<">\):])#, cmd => 'w3m "$1"' }, +              ftp  => { regexp => qr#((?:ftp://[^\s<>"]+|ftp\.[-a-z0-9.]+)[^\s.,;<">\):])#, cmd => 'ncftp "$1"' }, +	      mail => { regexp => qr#([-_a-z0-9.]+\@[-a-z0-9.]+\.[-a-z0-9.]+)#, cmd => 'mutt "$1" -s "$2"' }, +	    ); + +sub draw_box ($$$$) { +    my ($title, $text, $footer, $colour) = @_; +    my $box = ''; +    $box .= '%R,--[%n%9%U'.$title.'%U%9%R]%n'."\n"; +    foreach (split(/\n/, $text)) { +        $box .= '%R|%n '.$_."\n"; +    }                                                                               $box .= '%R`--<%n'.$footer.'%R>->%n'; +    $box =~ s/%.//g unless $colour; +    return $box; +} + +sub show_help() { +    my $help=$IRSSI{name}." ".$VERSION." +/openurl +    List the saved URLs +/openurl <number> <number>... +    Load the corresponding URLs in your browser/mailer +/openurl paste <number> <number>... +    Paste the selected URLs to the current channel/query +/openurl topics +    Look for URLs in channel topics +/openurl clear +    Clear all URLs +/openurl help +    Display this help +"; +    my $text = ''; +    foreach (split(/\n/, $help)) { +        $_ =~ s/^\/(.*)$/%9\/$1%9/; +	$text .= $_."\n"; +    } +    print CLIENTCRAP draw_box($IRSSI{name}." help", $text, "help", 1) ; +} + +sub list_urls { +    my $string = ''; +    my $i = 1; +    foreach (@urls) { +	my $text = $_->{url}; +	my $url = $_->{url}; +	$text = $_->{text} if Irssi::settings_get_bool('openurl_display_context'); +	$url =~ s/%/%%/g; +	$text =~ s/%/%%/g; +	$text =~ s/\Q$url/%U$url%U/; +	if ($recent-1 == $i) { +	    $string .= '%B»%n'; +	} else { +	    $string .= ' '; +	} +	$string .= '%r['.$i.']%n '; +	$string .= '<'.$_->{channel}; +	$string .= '/'.$_->{nick} unless $_->{nick} eq ""; +	$string .= '> '; +	$string .= $text." %n\n"; +	$i++; +    } +    print CLIENTCRAP draw_box("OpenURL", $string, "URLs", 1); +} + +sub event_private_message { +    my ($server, $text, $nick, $address) = @_; +    process_line($server, $nick, $nick, $text); +} +sub event_public_message { +    my ($server, $text, $nick, $address, $target) = @_; +    process_line($server, $target, $nick, $text); +} +sub event_topic_changed { +    my ($channel) = @_; +    process_line($channel->{server}, $channel->{name}, "", $channel->{topic}); +} + +sub process_line ($$$$) { +    my ($server, $target, $nick, $line) = @_; +    my $url = get_url($line); +    if ($url) { +	my $type = url_type($url); +	return unless Irssi::settings_get_bool('openurl_watch_'.$type); +	new_url($server, $target, $nick, $line, $url); +    } +} + +sub get_url ($) { +    my ($text) = @_; +    foreach (keys %urltypes) { +	return $1 if ($text =~ /$urltypes{$_}->{regexp}/); +    } +} + +sub url_type ($) { +    my ($url) = @_; +    foreach (keys %urltypes) { +	return $_ if ($url =~ /$urltypes{$_}->{regexp}/); +    } +} + +sub launch_url ($) { +    my ($url) = @_; +    my $type = url_type($url); +    my $address = $url; +    my $suffix= ""; +    if ($type eq "mail") { +	$address = $1 if $url =~ /(.*?@.*?)($|\?)/; +	$suffix = $2 if $url =~ /(.*?@.*?)\?subject=(.*)/; +    } +    my $command = Irssi::settings_get_str("openurl_app_".$type); +    $command =~ s/\$1/$address/; +    $command =~ s/\$2/$suffix/; +    system($command); +} + +sub new_url ($$$$$) { +    my ($server, $channel, $nick, $text, $url) = @_; +    $recent = 1 if ($recent > Irssi::settings_get_int('openurl_max_urls')); +    # Check for existance of URL +    my $i = 1; +    foreach (@urls) { +	if ($text eq $_->{text} && $channel eq $_->{channel}) { +	    my $note_id = add_note($server, $channel, $i); +	    push @{$_->{notes}}, $note_id; +	    return(); +	} +	$i++; +    } +    if (defined $urls[$recent-1]) { +	del_notes($recent); +    } +    $urls[$recent-1] = {channel => $channel, +                        text    => $text, +			nick    => $nick, +			url     => $url, +			notes   => [], +			}; +    my $note_id = add_note($server, $channel, $recent); +    push @{$urls[$recent-1]{notes}}, $note_id; +    $recent++; +} + + +sub del_notes ($) { +    my ($num) = @_; +    my $view; +    my $witem = Irssi::window_item_find($urls[$num-1]->{channel}); +    if (defined $witem) { +	$view =  $witem->window()->view(); +    } +    if (defined $view) { +	foreach (@{$urls[$num-1]->{notes}}) { +	    my $line = $view->get_bookmark($_); +	    $view->remove_line($line) if defined $line; +	    $view->set_bookmark($_, undef); +	} +	@{$urls[$num-1]->{notes}} = (); +	$view->redraw(); +    } +} + +sub add_note ($$$) { +    my ($server, $target, $num) = @_; +    my $witem; +    if (defined $server) { +	$witem = $server->window_item_find($target); +    } else { +	$witem = Irssi::window_item_find($target); +    } +    if (defined $witem) { +	$witem->print("%R>>%n OpenURL ".$num, MSGLEVEL_CLIENTCRAP); +	# create a unique ID for the mark +	my $foo = time().'-'.int(rand()*1000); +	$witem->window()->view()->set_bookmark_bottom("openurl_".$num.'-'.$foo); +	return("openurl_".$num.'-'.$foo); +    } +    return(undef); +} + +sub clear_urls { +    del_notes($_) foreach (0..scalar(@urls)-1); +    pop(@urls) foreach (1..scalar(@urls)); +    $recent = 1; +    print CLIENTCRAP '%R>>%n URLs cleared'; +} + +sub cmd_openurl ($$$) { +    my ($arg, $server, $witem) = @_; +    my @args = split(/ /, $arg); +    if (scalar(@args) == 0) { +	list_urls; +    } elsif ($args[0] eq 'clear') { +	clear_urls; +    } elsif ($args[0] eq 'topics') { +    	event_topic_changed($_) foreach (Irssi::channels()); +    } elsif ($args[0] eq 'help') { +	show_help(); +    } elsif ($args[0] eq 'open') { +	launch_url($args[1]); +    } else { +	my $paste = 0; +	if ($args[0] eq 'paste') { +	    $paste = 1; +	    shift(@args); +	} +	foreach (@args) { +	    next unless /\d+/; +	    next unless defined $urls[$_-1]; +	    my $url = $urls[$_-1]->{url}; +	    if ($paste == 1) { +		if (ref $witem && ($witem->{type} eq "CHANNEL" || $witem->{type} eq "QUERY")) { +		    $witem->command("MSG ".$witem->{name}." ".$url); +		} +	    } else { +		launch_url($url); +	    } +	} +    } +} + +foreach (keys %urltypes) { +    Irssi::settings_add_str($IRSSI{'name'}, 'openurl_app_'.$_, "screen ".$urltypes{$_}->{cmd}); +    Irssi::settings_add_bool($IRSSI{'name'}, 'openurl_watch_'.$_, 1); +} +Irssi::settings_add_int($IRSSI{'name'}, 'openurl_max_urls', 20); +Irssi::settings_add_bool($IRSSI{'name'}, 'openurl_display_context', 1); + +Irssi::signal_add_last("message private", "event_private_message"); +Irssi::signal_add_last("message public", "event_public_message"); +Irssi::signal_add_last("channel topic changed", "event_topic_changed"); + +#Irssi::signal_add('open url', \&launch_url); + +foreach my $cmd ('topics', 'clear', 'paste', 'help') { +    Irssi::command_bind('openurl '.$cmd => sub { +	cmd_openurl("$cmd ".$_[0], $_[1], $_[2]); }); +} +Irssi::command_bind('openurl', 'cmd_openurl'); + +print CLIENTCRAP '%B>>%n '.$IRSSI{name}.' '.$VERSION.' loaded: /openurl help for help'; | 
